2016-03-31 189 views
2

我正在學習彙編語言,遇到一個問題,我甚至不知道如何去問Google。我正在使用gdb來調試簡單的c程序。什麼是彙編cmp指令完全比較?

我有下面的代碼:

cmp eax,DWORD PTR [rbp-0xc] 
jle 0x400cc2 

打破CMP指令,我檢查值進行比較:

p/d $eax // 1000 
x/d $rbp-0xc //-24 

所以我認爲,該跳就不會發生。但是在進入下一步之後 - 我可以看到ZF標誌已設置。 有人可以用簡單的話來解釋嗎?

回答

4

除了沒有提供MCVE並且沒有顯示gdb日誌,您似乎已經完成了所有工作。你是正確的,ZF不應該被設置。也許你錯誤地使用了gdb。

6   mov dword [rbp-0xc], -24 
(gdb) s 
7   mov eax, 1000 
(gdb) 
8   cmp eax, dword [rbp-0xc] 
(gdb) 
9   jle foo 
(gdb) p/d $eax 
$1 = 1000 
(gdb) x/wd $rbp-0xc 
0x7fffffffe254: -24 
(gdb) p $eflags 
$2 = [ CF PF IF ] 

事實上,跳將服用。

既然你堅持你看到ZF的設置,這可能意味着你的x/d使用的是字節大小,而不是正確的雙字。如果你有1000內存看起來像e8 03 00 00因爲x86是小端。如果您打印的最低字節是帶符號的,則它將以-24出現。使用x/wd強制dword大小,否則gdb默認爲最近使用的大小,這可能不合適。

+0

嗯,我很困惑。我嘗試過幾次,而且總是一樣的。在cmp'$ eflags = [IF]之前,在si命令之後'$ eflags = [PF ZF IF]' – nibsa

+0

用完整的gdb日誌編輯你的問題。另外,使用'x/wd'來確保你正在打印4個字節的整數。請注意,1000是'e8 03 00 00',-24是'e8 ff ff f',所以如果只打印一個字節,即使內存爲1000,也可能得到-24的結果。 – Jester

+0

Omg,'x/wd $ rbp-0xc'打印1000.現在一切都合情合理。我不熟悉gdb,我很難問谷歌這樣的具體問題。謝謝! – nibsa