彙編中的標誌位與JCC指令學習總結

什麼是JCC指令

  • 能夠修改EIP寄存器的值
  • 不同於之前的JMP、CALL、RET
  • 通過標誌寄存器中的值判斷是否跳轉

EFLAGS標誌寄存器

  • 要想了解JCC指令就要了解標誌寄存器,這是它各自代表的功能
    在這裏插入圖片描述
CF(0 bit)[Carry flag]

若算數產生的結果在最高有效位發生進位或借位則將其置1,反之清0。

這個標誌常用來指示無符號整數運算的溢出狀態。

例:

MOV AL,0XFE  //向AL寄存器中寫入0XFF
ADD AL,2    //向AL寄存器的值+2

運行結果:

在這裏插入圖片描述

PF(2 bit)[Parity flag]

如果結果的最低有效字節包含1的個數爲偶數,該位置1,否則清零,這也就是大家把它叫做奇偶校驗位的原因。

可以用來進行奇偶校驗檢查

例:我們現在把113這個數字存到AX裏,再給它+1,來判斷它的最低有效字節是一個字節還是兩個字節。

這裏爲什麼用113呢?因爲它轉化爲二進制是這樣的:

MOV AX,113           //把113存到AX裏
0000 0001 0001 0011  //113轉二進制
ADD AX,1             //往AX寄存器裏+1
0000 0000 0000 0001  //1轉二進制
0000 0001 0001 0100  //113+1二進制結果
這裏如果判斷的是兩個字節,那麼1的個數爲奇數,PF標誌位的值應爲0,如果判斷的是一個字節,那麼
PF標誌位的值應爲1。

運行結果:
在這裏插入圖片描述

AF(6 bit)[Auxiliary Carry Flag]

如果算術操作在結果的第3位發生進位或者借位,則將該標誌位置1,否則清零。

這個運算在BCD運算中常被使用。

這個不經常用,這裏就不做過多介紹了,它涉及到BCD運算,感興趣的可以去看一看。

ZF(6 bit)[Zero flag]

若運算的結果爲零則將其置1,反之清零。

經常與TEST、CMP等指令一起使用。

例1:判斷某個值是否爲0

MOV EAX,100  //把100存到EAX
MOV ECX,100  //把100存到ECX
CMP EAX,ECX  //EAX與ECX進行相減,但結果不會存到EAX中

注:CMP指令對標誌位的影響同SUB指令,完成的操作與SUB指令類似,唯一的區別是不將OPRD1-OPRD2的結果送回OPRD1,而只是比較。

運行結果:
在這裏插入圖片描述 例2:判斷兩個值是否相等

TEST EAX,ECX  //EAX和ECX進行按位的與運算,相同得0不同得1

注:TEST與AND指令的關係,有點類似於CMP與SUB指令之間的關係。

運算結果:
在這裏插入圖片描述

SF(7 bit) [Sing flag]

該標誌被設置爲有符號整形的最高有效位。

0表示運算的結果爲負,1表示運算的結果爲正。

常用作符號位

例:

MOV AL,0X7F
ADD AL,2

運行結果:
在這裏插入圖片描述

OF(11 bit)[Overflow flag]

溢出標誌OF用於反應有符號數加減運算所得結果是否溢出。

可以這樣理解:
	
	如果是無符號數運算,是否溢出看CF位。
	如果是有符號數運算,是否溢出看OF位。

	這裏要運算的數字,到底是有符號數還是無符號數,這就取決於你自己了。
	
	若OF位爲1則運算結果溢出,反之爲0.

例1:

這裏我們把運算數字當作無符號數

MOV AL.0X7F
ADD AL,2

運行結果:
在這裏插入圖片描述
例2:

還是剛纔的指令,這裏我們當作有符號數來看待
MOV AL.0X7F
ADD AL,2

運行結果:
在這裏插入圖片描述

同樣的兩個表達式,究竟是看CF位還是OF位,這要看你自己。
DF(10 bit)[Direction flag]

這個方向標誌控制串指令(MOVS,CMPS,SCAS,LODS以及STOS)。設置DF標誌使得串指令自動遞減(從高地址向低地址處理字符串),清除該標誌則使得串指令遞增。

STO以及CLD指令分別用於設置以及清楚DF標誌。

常用的JCC指令表

JCC指令 中文含義 標誌符號位
JE,JZ 結果爲零則跳轉(相等時跳轉) ZF=1
JNZ,JNE 結果不爲零則跳轉(不相等時跳轉) ZF=0
JS 結果爲負則跳轉 SF=1
JNS 結果爲非負則跳轉 SF=0
JP,JPE 結果中1的個數爲偶數則跳轉 PF=1
JNP,JPO 結果中1的個數爲奇數則跳轉 PF=0
JO 結果溢出則跳轉 OF=1
JNO 結果無溢出則跳轉 OF=0
JB,JNAE 若小於則跳轉(無符號數) CF=1
JNB,JAE 小於等於則跳轉(無符號數) CF=0
JBE,JNA 小於等於則跳轉(無符號數) ZF=1 or CF=1
JNBE,JA 大於則跳轉(無符號數) ZF=0 or CF=0
JL,JNGE 小於則跳轉(有符號數) SF ≠ OF
JNL,JGE 大於等於則跳轉(有符號數) SF = OF
JLE,JNG 小於等於則跳轉(有符號數) ZF≠ OF or ZF=1
JNLE,JG 大於則跳轉(有符號數) SF=0F and ZF=0

總結

  • 只要是運算相關的指令,都會影響標誌寄存器。
  • 所有JCC指令都是根據標誌寄存器來決定是否要修改EIP。
  • 多加思考,勤加練習!

在這裏插入圖片描述

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