【问题标题】:How to make strcmp to return 0 in assembly如何使strcmp在汇编中返回0
【发布时间】:2011-05-13 20:38:15
【问题描述】:

我希望strcmp函数的调用返回0,这意味着

int strncmp(const char *s1, const char *s2, size_t n);

const char *s1const char *s2 应该包含相同的字符串。如果s2 指向字符串“hello”并且n 是4,我怎样才能将一个与hello 对应的十进制值传递给s1

 8049e87:       c7 44 24 08 04 00 00    movl   $0x4,0x8(%esp) // 4
 8049e8e:       00
 8049e8f:       c7 44 24 04 80 bd 04    movl   $0x804bd80,0x4(%esp) // the constant is "hello"
 8049e96:       08 
 8049e97:       89 04 24                mov    %eax,(%esp) // The contents of %eax are a decimal (%d)
 8049e9a:       e8 61 ec ff ff          call   8048b00 <strncmp@plt>
 8049e9f:       85 c0                   test   %eax,%eax // I want this to be 0!

我尝试在 ASCII 中传递“h”的十进制值,它似乎是正确的方向,但不完全。

【问题讨论】:

  • eax 需要包含字符串的地址,而不是“十进制”值
  • 按照这个思路,我尝试传入 0x804bd80 的十进制值(这样地址应该相同)——为什么不行?
  • 我不确定对“十进制”值的痴迷是什么 - 只需将 0x804bd80 放入 eax 中,然后 s1 和 s2 都应该指向同一个字符串。
  • 上一步试图确保 %eax 通过 sscanf "%d" 查询,所以我认为它必须是 %d。我已将该行添加到代码中。
  • 在进行汇编之前,您需要学习使用高级语言进行编程

标签: c assembly x86 strcmp


【解决方案1】:

根据定义,对于大小写和长度相同的两个字符串,strncmp 的返回值为零。

查看您的汇编代码,行:

test   %eax,%eax

不是strncmp 函数的一部分。

使用调试器,在该指令处放置一个断点。检查EAX 寄存器,它应该为零(取决于strncmp 函数是否在EAX 寄存器中返回其结果)。

test 汇编指令将根据参数的值设置条件代码。一个流行的条件代码位是表示表达式为零的zero位。如果条件代码为零,则下一条指令可能是跳转

如果您在数学语句或表达式中使用strncmp 函数的结果,编译器可能会生成不同的代码。

试试这个片段:

  volatile int result = 0x55;
  volatile int a_value = 3;
  result = (strncmp("Hausaufgaben", "Hausaufgaben", 256) + 27) / 3;
  printf("Result is: %d\n", result);

您是否有理由需要编译器来保存来自strncmp 的值?

您是否有理由需要编译器将该值与常量数字零进行比较?

【讨论】:

  • 目标是向 strcmp 提供一条数据到 %eax,这样当它被移动到 %esp 并传递给 strcmp 时,它返回 0。test %eax, %eax 检查结果是否表单 strcmp 是否为 0,此特定项目的目标是使其为 0。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多