如何使strcmp在程序集中返回0

时间:2011-05-13 20:38:15

标签: c assembly x86 strcmp

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

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

const char *s1const char *s2应包含相同的字符串。如果s2指向字符串“hello”且n为4,那么如何将s1传递给与hello对应的十进制值?

 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”的十进制值,它似乎是正确的方向,但不完全。

1 个答案:

答案 0 :(得分:3)

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

查看汇编代码,行:

test   %eax,%eax

不属于strncmp函数。

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

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

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

试试这个片段:

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

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

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