我有以下代码:
CMP BYTE PTR [ESP+5],61 ; ESP is 0012F9AC
JNZ SHORT ....
以下内容
Address Data
0012F9AC 0012FA94
0012F9B0 61616161
0012F9B4 61616161
现在,我理解它的方式是将0x61与(0x0012F9AC + 5)的值(0x12F9B1)进行比较。根据内存'dump',地址0x12F9B1的值为0x61。那为什么还要坚持跳跃?
答案 0 :(得分:3)
对不起,不是和装配专家,但是,61真的是0x61?你可以尝试97,作为一个快速检查。
更新:我看到blackbear首先带着相同的评论到达那里。
答案 1 :(得分:1)
堆栈是DWORD对齐的。注意你的2个字符串的地址,它们是一个DWORD。你有什么指针,所以当然不会匹配。
[esp] == return address
[esp + 4] == pointer to first string
[esp + 8] == pointer to second string
试试这个:
DoIt:
mov eax, [esp + 4]
cmp byte ptr [eax], 061H
jnz NotA
PrintText "a"
jmp Over
NotA:
PrintText "NOT A"
Over:
ret 4 * 2
现在我可以inc eax
获得下一个角色。
不确定你的上下文,所以我创建了一个测试过程,并通过了两次叮咬。
让我们这样说:你想要盒子 - 特别是,或者你想要盒子里的东西[esp]?
答案 2 :(得分:0)
原始问题引用了这个:
Address Data
0012F9AC 0012FA94
0012F9B0 61616161
0012F9B4 61616161
这清楚地表明了以下几点:
枪手给出的答案完全是对这个问题的假设。这些“a”就在那里,不是指向它们的指针!
然而,正如其他人所指出的,任何体面的汇编程序,当他们看到这一行:...
CMP BYTE PTR [ESP + 5],61; ESP是0012F9AC
...他们将上面的“,61”解释为十进制,因此比较将失败,因为61十进制不等于61十六进制。这就是比较失败的真正原因。
就这样纠正:
CMP BYTE PTR [ESP + 5],61h; ESP是0012F9AC
问题解决了。