String IA32字符串上的程序集cmp

String IA32字符串上的程序集cmp,string,assembly,x86,cmp,String,Assembly,X86,Cmp,我在反向工程一些IA32汇编代码时遇到了一些问题。即以下几行: 0x08049d6d <+206>: mov -0xc(%ebp),%edx 0x08049d70 <+209>: mov -0x14(%ebp),%eax 0x08049d73 <+212>: mov %edx,%ecx 0x08049d75 <+214>: sub %eax,%ecx 0x08049d77 <

我在反向工程一些IA32汇编代码时遇到了一些问题。即以下几行:

   0x08049d6d <+206>:   mov    -0xc(%ebp),%edx
   0x08049d70 <+209>:   mov    -0x14(%ebp),%eax
   0x08049d73 <+212>:   mov    %edx,%ecx
   0x08049d75 <+214>:   sub    %eax,%ecx
   0x08049d77 <+216>:   mov    %ecx,%eax
   0x08049d79 <+218>:   cmp    $0x5,%eax
   0x08049d7c <+221>:   je     0x8049d83 <level_6+228>
感觉好像我们已经成功了

寄存器不能“保存字符串”,除非它们很短。你得到的是字符串的地址,或者指向字符串(第一个字符)的指针。如果
%edx
持有一个指向该字符串的指针,而
%eax
持有“同一个字符串,只删除了索引0处的字符”,那么
%eax
几乎肯定会指向该字符串的第二个字符

在这种情况下,如果你从另一个中减去一个,当然你总是会得到
1
,因为字符串的第二个字符总是比第一个字符长一个字节。字符是什么并不重要,因为你在比较地址

cmp
指令显然不是在比较两个字符串-它是在比较文本数
5
%eax
的内容,此时将是您的
1
,即两个指针之间的差异。因此,
cmp
指令将
5
1
进行比较,如果它们相等-在本例中,它们显然不相等-
jmp
s与
0x8049d83


话虽如此,我怀疑你是背对背的。如果
%edx
指向字符串的开头,而
%eax
指向第二个字符,则
子指令应给出
-1
,而不是
1
<代码>%edx
%eax
可能正好相反。当
%edx
指向
%eax
指向的字符串的第六个字符时,此例程似乎设计为
jmp
0x8049d83

再次感谢您的帮助。它很好地解释了这个问题——当两个寄存器持有不同字符串的地址时,
cmp
'd会发生什么?例如,我在编辑中包含的内容与我的原始帖子完全相同,它只是比较地址,如果它们指向完全不同的字符串,地址显然是不相等的。
0x08049d68 <+201>: cmp -0xc(%ebp),%eax 
0x08049d6b <+204>: jb 0x8049cfa <level_6+91>