`testl` eax對抗eax?我想了解一些裝配。匯編如下,我對該testl行感興趣:000319df 8b4508 movl 0x08(%ebp), %eax 000319e2 8b4004 movl 0x04(%eax), %eax 000319e5 85c0 testl %eax, %eax 000319e7 7407 je 0x000319f0 我想了解的那點testl之間的%eax和%eax?我認為這段代碼的具體內容并不重要,我只是試圖用自己來理解測試 - 這種價值總是不正確嗎?
3 回答

楊__羊羊
TA貢獻1943條經驗 獲得超7個贊
意思test
是將參數和AND組合在一起,并將結果檢查為零。因此,此代碼測試EAX是否為零。je
如果為零,將跳躍。
順便說一句,這會生成一個比cmp eax, 0
編譯器通常這樣做的原因更小的指令。

蝴蝶不菲
TA貢獻1810條經驗 獲得超4個贊
測試指令在操作數之間執行邏輯AND操作,但不將結果寫回寄存器。只更新標志。
在您的示例中,測試eax,如果eax為零,則eax將設置零標志,如果最高位設置則設置符號標志以及其他一些標志。
如果設置了零標志,則跳轉如果等于(je)指令跳轉。
您可以將代碼轉換為更易讀的代碼,如下所示:
cmp eax, 0je somewhere
它具有相同的功能,但需要一些字節更多的代碼空間。這就是編譯器發出測試而不是比較的原因。
添加回答
舉報
0/150
提交
取消