2012-08-07 171 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

並且問題解決了。