文章目錄
什麼是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。
- 多加思考,勤加練習!