如何在汇编中使strcmp返回0

3

我希望调用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"的十进制值,似乎是正确的方向,但不完全。


eax 需要包含一个字符串的地址,而不是一个“十进制”值。 - Paul R
沿着这条思路,我尝试传递0x804bd80的十进制值(以便地址相同)-为什么不起作用呢? - Rio
我不确定为什么人们如此着迷于“十进制”值 - 只需将0x804bd80放入eax中,然后s1和s2都应该指向同一个字符串。 - Paul R
前面的步骤试图确保 %eax 通过 sscanf 的 "%d" 查询,因此它必须是一个 %d,我认为。我已经将该行代码添加到了其中。 - Rio
6
在尝试汇编语言之前,你需要学习一种高级编程语言。 - David Heffernan
显示剩余3条评论
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的值吗?是否有理由需要这样做?

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


目标是提供给strcmp一段数据,放入%eax中,使得当它被移动到%esp并传递给strcmp时,它返回0。test %eax, %eax检查strcmp的结果是否为0,而这个特定项目的目标就是让它为0。 - Rio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接