簡體   English   中英

匯編TEST指令如何與這些跳轉指令一起使用?

[英]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匯編中,幾乎所有條件跳轉都基於標志( jcxzjecxzlooploopne / loopnz )。 這意味着重要的是標志所具有的值。

jle是同義jng 跳轉條件是ZF = 1 or SF <> OF 您可能需要查看Intel x86 JUMP快速參考

test確實設置了除AF 鏈接之外的所有標志,所以到目前為止所有內容都很好

根據此鏈接,邏輯運算始終為零OF 這意味着你的跳轉幾乎是ZF = 1 or SF = 1 ,所以在你的代碼中,如果edx0或者在0x80000000 ... 0xffffffff范圍內, jle會跳轉。

具有相同參數的TESTL (如edxedx )根據該參數本身的值設置標志(因為x AND x與x相同)。 所以我們可以完全忘記AND ,因為它被丟棄了 - 我們需要關注的是edx的價值。

使用TESTL ,僅當值為零時,零標志ZF才設置為1。 TESTL還強制溢出標志OF為0,並且僅在高位置1時才設置符號標志SF

如果ZF設置為1或SF <> OF ,則JLE將跳轉。

因此,如果有以下情況,跳轉將執行:

  • edx為零; 要么
  • edx位設置很高。

因此,它將跳轉為edx00x80000000 - 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM