[英]How does the assembly TEST instruction work with these jump instructions?
使用AT&T匯編語法,我試圖理解如何在匯編代碼中使用testl
。 特別:
testl %edx, %edx
jle .L3
我知道testl
按位and
相同的值設置條件標志,但如果不比較兩個值,我如何解釋'如果小於或等於'則跳轉?
以下是英特爾測試官方文檔的摘錄:
Operation
TEMP ← SRC1 AND SRC2;
SF ← MSB(TEMP);
IF TEMP = 0
THEN ZF ← 1;
ELSE ZF ← 0;
FI:
PF ← BitwiseXNOR(TEMP[0:7]);
CF ← 0;
OF ← 0;
在jle上也一樣:
Jump if less or equal (ZF=1 or SF≠OF)
因此,如果edx
為0,則執行跳轉(因為edx AND edx = edx
,僅當edx
為0時為0,並且當AND
的結果為0時ZF
設置為1)或者edx
的最重要位為1(因為SF = most significant bit
edx AND edx
SF = most significant bit
(或等效地, edx
本身)和OF
始終為0,這意味着SF ≠ OF
僅在SF ≠ 0
時才為真)。
IOW,僅當edx
被解釋為有符號整數時edx
時才執行跳轉,或等效地,當edx
被解釋為無符號整數時為0或更大或等於0x80000000時。
在x86匯編中,幾乎所有條件跳轉都基於標志( jcxz
, jecxz
, loop
和loopne
/ loopnz
)。 這意味着重要的是標志所具有的值。
jle
是同義jng
。 跳轉條件是ZF = 1 or SF <> OF
。 您可能需要查看Intel x86 JUMP快速參考 。
test
確實設置了除AF
鏈接之外的所有標志,所以到目前為止所有內容都很好
根據此鏈接,邏輯運算始終為零OF
。 這意味着你的跳轉幾乎是ZF = 1 or SF = 1
,所以在你的代碼中,如果edx
為0
或者在0x80000000
... 0xffffffff
范圍內, jle
會跳轉。
具有相同參數的TESTL
(如edx
和edx
)根據該參數本身的值設置標志(因為x AND x與x相同)。 所以我們可以完全忘記AND
,因為它被丟棄了 - 我們需要關注的是edx
的價值。
使用TESTL
,僅當值為零時,零標志ZF
才設置為1。 TESTL
還強制溢出標志OF
為0,並且僅在高位置1時才設置符號標志SF
。
如果ZF
設置為1或SF <> OF
,則JLE
將跳轉。
因此,如果有以下情況,跳轉將執行:
edx
為零; 要么 edx
位設置很高。 因此,它將跳轉為edx
值0
或0x80000000 - 0xffffffff
。
很可能這是一個檢查,以確保該數字是一個自然數0x00000001 - 0x7fffffff
,跳轉將是某種錯誤處理例程,一個有效的自然數將繼續沒有跳轉,如:
loop_for_number:
call get_number_into_edx
testl %edx, %edx
jle loop_for_number
; carry on here knowing that edx >= 1
有關各種跳轉及其使用的標志的說明,請參見此處 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.