String IA32字符串上的程序集cmp
我在反向工程一些IA32汇编代码时遇到了一些问题。即以下几行: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 <
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>