x86 條件轉移指令窺探

條件轉移指令(參考

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 的情況看看:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章