我希望调用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”的十进制值,它似乎是正确的方向,但不完全。
答案 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
的值?
是否有理由需要编译器将值与常量数字零进行比较?