为什么这个CMP指令失败?

时间:2012-08-07 15:39:28

标签: assembly x86 opcode cmp

我有以下代码:

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。那为什么还要坚持跳跃?

3 个答案:

答案 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

这清楚地表明了以下几点:

  1. 这是HEXadecimal中的内存转储。
  2. 从0012F9B0开始的内存由8个小写的“a”ansi字符填充(每个字符1个字节)
  3. 枪手给出的答案完全是对这个问题的假设。这些“a”就在那里,不是指向它们的指针!

    然而,正如其他人所指出的,任何体面的汇编程序,当他们看到这一行:...

    CMP BYTE PTR [ESP + 5],61; ESP是0012F9AC

    ...他们将上面的“,61”解释为十进制,因此比较将失败,因为61十进制不等于61十六进制。这就是比较失败的真正原因。

    就这样纠正:

    CMP BYTE PTR [ESP + 5],61h; ESP是0012F9AC

    问题解决了。