條件轉移指令(參考)
JA/JNBE 不小於或不等於時轉移.
JAE/JNB 大於或等於轉移.
JB/JNAE 小於轉移.
JBE/JNA 小於或等於轉移.
以上四條,測試無符號整數運算的結果(標誌C和Z).
JG/JNLE 大於轉移.
JGE/JNL 大於或等於轉移.
JL/JNGE 小於轉移.
JLE/JNG 小於或等於轉移.
以上四條,測試帶符號整數運算的結果(標誌S,O和Z).
JE/JZ 等於轉移.
JNE/JNZ 不等於時轉移.
JC 有進位時轉移.
JNC 無進位時轉移.
JNO 不溢出時轉移.
JNP/JPO 奇偶性爲奇數時轉移.
JNS 符號位爲 “0” 時轉移.
JO 溢出轉移.
JP/JPE 奇偶性爲偶數時轉移.
JS 符號位爲 “1” 時轉移.
注意,比如 JB 是小於轉移,那麼 JNB 就是 NOT JB,自然就算大於等於轉移了。其他類似,不再說明。
===================================================================
EFLAGS狀態寄存器(參考1)
參考2
EFLAGS:存放CPU的兩類標誌。
狀態標誌:反映處理器當前的狀態,如有無溢出,有無進位等。
控制標誌:用來控制處理器的工作方式,如是否響應可屏蔽中斷等。
各狀態標識的含義如下。
1、 OF:溢出標誌。OF=1表示兩個有符號數的運算結果超出了可以表示的範圍,結果是錯誤的;OF=0表示沒有溢出,結果正確。進行無符號數運算時也會產生新的OF標誌(CPU不知道處理對象是否爲有符號數),此時程序員可以不關心OF標誌。
2、DF:方向標誌。DF=0時,每次執行字符串指令後,源或目的地址指針用加法自動地修改地址;DF=1時用減法修改地址。它用來控制地址的方向變化。
3、IF:中斷允許標誌。IF=1表示允許處理器響應可屏蔽中斷請求信號,成爲開中斷,IF=0表示不允許處理器響應可屏蔽中斷請求信號,稱爲關中斷。
4、SF:符號標誌。SF=1表示運算結果的最高位爲1。對於有符號數,有溢出標誌OF=0時,SF=1表示運算結果爲負,SF=0表示運算結果非負(正或零)。OF=1時,由於結果是錯誤的,所以符號位也和正確值相反。例如,兩個負數相加產生溢出,此時SF=0。對於無符號數運算,SF無意義,但是可以看出結果的大小規模。
5、ZF:零標誌。ZF=1表示運算結果爲零,減法運算爲零意味着兩個參加運算的數大小相等;ZF=0,表示運算結果非零。
6、AF:輔助進位標誌。它是另個BCD數運算時第三位數上的進位,供運算會調整結果用,對其他數的運算沒有意義。
7、PF:奇偶標誌。PF=1表示運算結果的低八位中有偶數個1;PF=0表示奇數個1,它可以用來進行奇偶校驗。
8、CF:進位/借位標誌。CF=1表示兩個無符號數的加法有進位,或者是減法運算有借位,需要對它們的高位進行處理;CF=0表示沒有產生進位或借位。同樣,進行有符號數運算時也會產生新的CF標誌,此時程序員可以不關心CF標誌。
狀態標誌在每次運算後自動產生,控制標誌的值則由指令設置。
另外,還有一個單步標誌TF(或叫陷阱標誌),用於程序的調試。TF=1時,每次執行一條指令都會產生一次陷阱,改程序被暫停,TF=0時,不產生陷阱。
還有2位表示I/0操作特權級別的標誌。
1 JLE 小於等於轉移
代碼:
int Test()
{
int aa = 100;
if (aa > 100)
{
return 1;
}
return 2;
}
彙編代碼:
可以看到,首先一句 cmp dword ptr [aa], 64h
CMP 比較.(兩操作數作減法,僅修改標誌位,不回送結果).
因此,知道這裏是做了一個減法。
根據代碼邏輯 aa > 100 順序執行,反之 aa - 100 <= 0,直接執行 return 2。
可以看到 jle 指令後面的 0E738F8h 對應的就是 return 2 的彙編代碼處。
而 JLE/JNG 小於或等於轉移. 。
JLE 也正是小於等於轉移指令。
因此,這句 JLE 就是說,如果減法的結果是 小於等於,則跳轉到 0E738F8h
2 JL 小於轉移
修改下代碼,直接看彙編吧:
aa >= 100 順序執行,即 < 就跳轉到某處。恰好是
JL 0E438F8h
3 JGE 大於等於轉移
不需要分析了,一目瞭然
4 JG 大於轉移
以上四條都是針對帶符號的!
=======================================================================
5.1 JNE 不相等轉移
5.2 JE 相等轉移
6 JBE 小於等於轉移
7 JB 小於轉移
8 JAE 大於等於轉移
圖略
9 JA 大於轉移
圖略
以上四條是針對無符號的
========================================================================
10 JS JNS
JS 符號位爲 “1” 時轉移.
JNS 符號位爲 “0” 時轉移.
SF:符號標誌。SF=1表示運算結果的最高位爲1。對於有符號數,有溢出標誌OF=0時,SF=1表示運算結果爲負,SF=0表示運算結果非負(正或零)。OF=1時,由於結果是錯誤的,所以符號位也和正確值相反。例如,兩個負數相加產生溢出,此時SF=0。對於無符號數運算,SF無意義,但是可以看出結果的大小規模。
看圖,條件是 a + 1 >= 0,也就是 < 0 (負數)會跳轉到 0C238FAh。
注意上面說明:
SF:對於有符號數,有溢出標誌OF=0時,SF=1表示運算結果爲負,SF=0表示運算結果非負(正或零)。
因此 JS 的含義就是 SF 位1, 也就是有符號數運算結果位負。與上面分析符合
同樣分析:
SF:符號標誌。SF=1表示運算結果的最高位爲1。對於有符號數,有溢出標誌OF=0時,SF=1表示運算結果爲負,SF=0表示運算結果非負(正或零)。
JNS 就是 SF = 0,表示有符號運算結果爲非負。
顯然這裏如果 aa + 1 >= 0 就是非負,應該跳轉到 0FF38FAh。
最後舉一個有 if else 的情況看看: