接下來將對“相反指令”一列進行簡單的說明。在許多情況下,需要產生與某條分支指令條件相反的分支(在本章后面會給出示例),即相反分支。除了兩個例外,都可以按下面的簡單規則(后面統稱為N/No N規則)產生相反分支: ● 如果Jcc的第二個字母不是“n”,則在“j”后面插入一個“n”。例如:je對應為jne,jl對應為jnl。 ● 如果Jcc的第二個字母是“n”,則去掉指令中的“n”。例如:jng對應為jg,jne對應為je。 不遵循這兩條規則的兩個例外是jpe(奇偶位為偶跳轉)和jpo(奇偶位為奇跳轉)。這兩個例外并不會導致什么問題,因為:(a)很少需要測試奇偶標志;(b)可以使用別名jp和jnp替代jpe和jpo。而“N/No N”規則對jp和jnp是適用的。 雖然jge是jl的相反指令,但是建議使用jnl作為jl的相反指令。因為很容易誤認為“大于是小于的相反”,從而把jg當作jl的相反指令。您可以堅持使用“N/No N”規則以避免這種混淆。 80x86條件跳轉指令提供了這樣的能力:根據判斷條件將程序流分支到兩條路徑中的某一條。例如,要實現:如果BX等于CX,則寄存器AX的值加1。可以使用下面的代碼來完成該功能: cmp(bx,cx ); jne SkipStmts; inc(ax ); SkipStmts: 其中的訣竅是使用相反分支指令來跳過在條件滿足的情況下需要執行的指令。請堅持使用前面介紹的“N/no N”規則來選擇相反分支指令。 使用條件跳轉指令還可以實現循環。例如,下面的代碼序列實現了從用戶輸入讀入一串字符,并將字符存儲到一組連續的單元中,直到用戶輸入回車鍵。 mov(0,edi ); RdLnLoop: stdin.getc(); //Read a character into the AL register. mov(al,Input [edi])); //Store away the character. inc(edi ); //Move on to the next character. cmp(al,stdio.cr ); //See if the user pressed Enter. jne RdLnLoop; 與setcc指令類似,條件跳轉指令分為兩類—— 測試特殊處理器標志位的條件跳轉指令(例如jz、jc、jno)和測試某些條件(小于、大于等)的條件跳轉指令。當測試某個條件時,條件跳轉指令通常緊跟在一個cmp指令之后。cmp指令設置標志位后,如果是無符號數比較,使用ja、jae、jb、jbe、je或jne等指令測試這些標志來判斷是否小于、小于等于、等于、不等于、大于或大于等于;如果是有符號數比較,則使用jl、jle、je、jne、jg、jge指令。 條件跳轉指令測試標志位,但不影響標志位。