2017-05-17 67 views
-1

在單個比較指令之後是否可以有多個條件跳轉?如何在組件中實現「多分支」條件跳轉

例如:

CMP EAX,ECX 
    JG More 
    JL Less 
Equal: 
    ;... do something 
    RETN 
More: 
    ;... do something different from "equal" and "less" 
    RETN 
Less: 
    ;... do something different from "more" and "equal" 
    RETN 

,使程序運行 「更多」 分支時EAX   >   ECX,並執行 「少」 分支時EAX   <   ECX。

這可能嗎?更重要的是,是否有更好的方法來實現相同的程序?

+2

你顯然只是寫了它。它有用嗎? –

+0

目前還不清楚GCC標籤的位置,但GCC已經[這是](https://godbolt.org/g/I5iESF) – harold

+1

爲什麼不能這樣工作,當你查看我假設x86指令後,你沒有標記這個,CMP哪些標誌改變了? JG使用什麼標誌,JG是否改變任何標誌,爲什麼在CMP之後使用JG(標誌是否正確?)。 JG是否會更改JL可能依賴的標誌來使其工作? –

回答

1

是的,在單個比較指令之後可能有多個條件跳轉。比較指令(在這種情況下,CMP EAX, ECX)在決定是否跳轉時設置以下條件分支使用的狀態寄存器EFLAGS中的狀態位。

採取此代碼爲例如:

MOV EAX, 5 ; set EAX to 5 
MOV ECX, 3 ; set ECX to 3 
CMP EAX, ECX ; sets comparison bits 
JL _target1 
JG _target2 

在該代碼部分,5是大於3,所以代碼將跳到_target2。

有4個標準標誌ZNCV(零標誌,負標誌,進位標誌,溢出標誌),它們由不同時間的不同指令設置。例如,如果添加的數字非常大並導致整數溢出,則加法(ADD EAX, ECX)會設置溢出標誌。

對於CMP,進位標誌用於顯示第一個數字是大於還是小於第二個數字。如果兩個數字相等,則零標誌設置爲1。

至於不同的方式去做這件事,如果你根據一個值分支到許多不同的地方(相當於C語言中的switch語句),這通常會用匯編中的跳轉表寫入。跳轉表是一個簡單的表格,包含您可能跳轉到的所有可能目標。如果您打開一個號碼,您可以使用該號碼索引到跳轉表中並找到您的目標。