0

我有以下代码:

CMP BYTE PTR [ESP+5],61    ; ESP is 0012F9AC
JNZ SHORT ....

以下是记忆中的

Address  Data

0012F9AC 0012FA94
0012F9B0 61616161
0012F9B4 61616161

现在,我理解它的方式是将 0x61 与 (0x0012F9AC + 5) 处的值进行比较,即 0x12F9B1。根据内存“转储”,地址 0x12F9B1 处的值是 0x61。那它为什么还要坚持跳呢?

4

3 回答 3

3

抱歉,不是汇编专家,但是 ,61 真的是 0x61 吗?您可以尝试 ,97 作为快速检查。

更新:我看到 blackbear 以同样的评论首先到达那里。

于 2012-08-07T15:44:20.743 回答
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得到下一个字符。

不确定你的上下文,所以我创建了一个测试过程,并向它传递了 2 个刺。

让我们这样说:你想要盒子 - esp,还是你想要盒子里的东西[esp]?

于 2012-08-07T21:18:14.030 回答
0

原始问题引用了这一点:

    Address  Data

    0012F9AC 0012FA94
    0012F9B0 61616161
    0012F9B4 61616161

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

  1. 这是一个内存转储,以十六进制表示。
  2. 从 0012F9B0 开始的内存由 8 个小写“a” ansi 字符(每个字符 1 个字节)填充

Gunner给出的答案对于这个问题完全是虚假的。这些“a”就在那里,而不是指向它们的指针!

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

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

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

像这样正确:

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

问题就解决了。

于 2012-12-05T12:22:46.107 回答