3

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

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

const char *s1并且const 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”的十进制值,这似乎是正确的方向,但并不完全。

4

1 回答 1

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

Is there a reason you need the compiler to compare the value to constant numeric zero?

于 2011-05-14T00:54:24.133 回答