2013-10-07 37 views
1

我正在做家庭作業。我們得到一個預編譯的二進制文件,我們必須使用gdb來獲取程序集轉儲,遍歷數據結構,查看存儲在內存中的值等,以便弄清楚二進制文件的功能。下面是一個函數調用反彙編轉儲幾行:GDB/GNU程序集:測試%esi,%esi返回不等於?

0x08048e14 <+21>: test %esi,%esi 
0x08048e16 <+23>: jne 0x8048e4b <fun6+76> 
0x08048e18 <+25>: jmp 0x8048e5d <fun6+94> 

我認爲test %esi,%esi總是返回「等於」結果(或者更確切地說,等效語句中使用的寄存器標誌,我相信表達僅設置了ZF?),並且jne指令永遠不會執行,而是程序將執行行<+25>處的指令。但是,在逐步完成這些指令之後,程序跳轉到<+76>行!爲什麼會發生?我很困惑。

在情況下,它有助於解釋的答案,這裏是在行<+21>test指令後的寄存器標誌(ZF沒有設置?)(我仍然不知道如何解釋標誌):

eflags   0x202 [ IF ] 

回答

6

test指令執行按位AND,但不存儲結果;它只設置標誌。

jne實際上是「跳轉,如果ZF不等於0」,所以在這裏測試esi是否爲零。

另見How does the `test` instruction work?What does the `test` instruction do?

+1

SO會自動爲其自己的鏈接插入問題標題。 – rici

+0

@rici非常感謝你指出了這一點:)然而,在我發佈這個答案後,它顯示「在這裏輸入鏈接描述」XD,這讓我很困惑.. – starrify

+0

starrify:有一些奇怪的更新問題。如果您看起來像是以前的版本,或者您錯過了剛輸入的評論等,請重新加載頁面,通常會獲得最新版本。 – rici

1

認爲我發現我的答案:

testl b,a就像計算a&b沒有設置目的地。 ZFa&b == 0設置。

換句話說,我在考慮cmp指令,這與test明顯不同。

+0

哦,是的這是真的。 :) – starrify