2009-10-17 6913 views
12

我想在線查找彙編語言函數「je」的用法。我讀過je表示如果平等就跳,這正是我想要的。這個函數的實際用法是什麼,換句話說,如何輸入這個函數來檢查一個值,如果它等於某個值就跳轉?彙編語言je跳轉函數

請讓我知道。

順便說一句,我使用NASM,如果這有所作爲。

回答

16

比方說,你要檢查EAX等於5,並執行基於該比較的結果不同的動作。換句話說,一個if語句。

; ... some code ... 

    cmp eax, 5 
    je .if_true 
    ; Code to run if comparison is false goes here. 
    jmp short .end_if 
.if_true: 
    ; Code to run if comparison is true goes here. 
.end_if: 

    ; ... some code ... 
+0

這裏使用了哪種彙編語法? – 2013-02-20 18:19:18

+0

如果我沒有記錯,這應該是有效的NASM。 – bcat 2013-02-22 21:18:13

+0

它可以檢查除EAX之外的其他任何寄存器嗎? – 2015-01-11 11:02:47

1

嗯,我終於找到了我的答案。 :P基本上你在cmp電話後打電話給je label_to_jump_to。

如果cmp顯示兩個值相等,je會跳轉到指定的標籤。如果沒有,它將繼續執行。

+4

Edsger Dijkstra一定討厭裝配工;它充滿了GOTO's :-) – 2009-10-17 19:15:46

+4

它不必遵循'CMP'指令,儘管這是最常見的情況。正如其他人所說,'Jcc'指令可以遵循任何設置'FLAGS'的指令。這包括幾乎所有的算術指令和其他一些算術指令。 – bcat 2009-10-17 19:17:54

2

通常,您將在je之前加上cmp(或test或等價物),這會在EFLAGS寄存器中設置一個標誌。這裏有一個link到NASM中的一個簡單的echo服務器,可以幫助你。忽略惱人的Google廣告。

je一個例子的使用可能是:

cmp eax, ebx 
    je RET_FAIL 
    jmp RET_SUCCESS 

RET_FAIL: 
    push 1 
    pop eax 
    ret 

RET_SUCCESS: 
    push 0 
    pop eax 
    ret 
+0

如果RET_SUCCESS出現在RET_FAIL之前,則不需要第二次跳轉。 – asveikau 2009-10-17 19:23:14

+0

謝謝,雖然這只是從未分級的學生作業複製意大利麪。 – mrduclaw 2009-10-17 19:41:38

10

如果在FLAGS寄存器中的「等於標誌」(也被稱爲「零標誌」)設置這將跳。這是算術運算的結果,或者像TESTCMP這樣的指令。

例如:(如果沒記錯的話這是正確的:-)

cmp eax, ebx ; Subtract EBX from EAX -- the result is discarded 
       ; but the FLAGS register is set according to the result. 
je .SomeLabel ; Jump to some label if the result is zero (ie. they are equal). 
       ; This is also the same instruction as "jz".
4

我必須說je func是測試零標誌是否設置,然後跳轉到其他地方或繼續下一個指令。

test cx, cx 
je some_label 

測試指令只是做一個位與所述兩個操作數,並根據該AND結果設置標誌。 je指令然後使用零標誌來決定跳轉還是繼續。

上面的代碼用於檢查cx是否爲零。

  • 如果cx爲零,測試會設置零標誌,那麼je會導致跳轉到某個地方;
  • 如果cx不爲零,測試不會設置零標誌,je會繼續執行下面的指令。

注意:je不是測試相等,而是測試在此之前由某些指令設置的ZERO標誌。