2012-08-07 177 views
0

我有以下代码:为什么此CMP指令失败?

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。那么为什么它仍然坚持跳跃?

+6

顺便说一句,它是61十进制还是61十六进制?如果显示的代码片段是你输入到汇编程序中的东西,那么它可能会理解61作为小数,从而导致cmp失败 – BlackBear 2012-08-07 15:43:12

+0

我很确定它是0x61。它来自'aaaaaaaa'的文本输入,将'========'放入3D3D3D3D内存中,然后它也不会跳转。当然,我错过了一些简单的东西,我仍然是一个asm的noob – 2012-08-07 16:34:29

回答

3

对不起,不是专业的装配,而是61真的是0x61?你可以试试,97作为一个快速检查。

更新:我看到blackbear第一次有相同的评论。

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个响应。

让我们这样说:你想要盒子 - 特别是,还是你想要什么在盒子里[特殊]?

0

原来的问题引号这样的:

Address Data 

    0012F9AC 0012FA94 
    0012F9B0 61616161 
    0012F9B4 61616161 

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

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

由枪手给出的答案是为这个问题完全虚假填充。这些“a”就在那里,不是指向他们!

然而,如由其他人,任何像样的汇编程序,注意到当他们看到这条线:...

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

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

只要正确这样的:

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

并且问题解决了。