018-JL,JNGE JLE,JNG JG,JNLE JGE,JNL帶符號條件轉移指令小結
l 條件轉移指令JG(> 時轉移)
l 條件轉移指令JNLE(<=時不轉移)
l 標誌暫存器PSW
標誌暫存器PSW(程式狀態字暫存器PSW)
標誌暫存器PSW是一個16為的暫存器。它反映了CPU運算的狀態特徵並且存放某些控制標誌。8086使用了16位中的9位,包括6個狀態標誌位和3個控制標誌位。
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
OF |
DF |
IF |
TF |
SF |
ZF |
AF |
PF |
CF |
|||||||
零 標誌 |
CF(進位標誌位):當執行一個加法(減法)運算時,最高位產生進位(或借位)時,CF為1,否則為0。
ZF零標誌位:若當前的運算結果為零,則ZF為1,否則為0。 SF符號標誌位:該標誌位與運算結果的最高位相同。即運算結果為負,則SF為1,否則為0。
OF溢位標誌位:若運算結果超出機器能夠表示的範圍稱為溢位,此時OF為1,否則為0。判斷是否溢位的方法是:進行二進位制運算時,最高位的進位值與次高位的進位值進行異或運算,若運算結果為1則表示溢位OF=1,否則OF=0
PF奇偶標誌:當運算結果的最低16位中含1的個數為偶數則PF=1否則PF=0
AF輔助進位標誌:一個加法(減法)運算結果的低4位向高4位有進位(或借位)時則AF=1否則AF=0
另外還有三個控制標誌位用來控制CPU的操作,可以由程式進行置位和復位。
TF跟蹤標誌:該標誌位為方面程式除錯而設定。若TF=1,8086/8088CPU處於單步工作方式,即在每條指令執行結束後,產生中斷。
IF中斷標誌位:該標誌位用來控制CPU是否響應可遮蔽中斷。若IF=1則允許中斷,否則禁止中斷。
DF方向標誌:該標誌位用來控制串處理指令的處理方向。若DF=1則串處理過程中地址自動遞減,否則自動遞增。
OD裡能檢視到除IF標誌外的 8個標誌位
JMP //014
JE/JZ //= //012 Jump if
JNE/JNZ //不= //013
//帶符號數條件轉移指令
JL /JNGE //不>= //小於 < //015
JLE/JNG //不> //小於等於<= //016
JG/JNLE //不<= //大於 >//017
JGE/JNL //不< //大於等於>= //017
Jump 跳轉/轉移
Not 不
Equal 相等
Zero 零
Less 小於
Greater大於
一、條件轉移指令
助憶符 |
檢測的轉移條件 |
功能描述 |
|
JE/JZ |
ZF=1 |
Jump Equal == 跳轉 |
Jump Zero !=不跳轉 |
JNE/JNZ |
ZF=0 |
Jump Not Equal != 跳轉 |
Jump Not Zero ==不跳轉 |
JG/JNLE |
ZF=0&&SF=OF |
Jump Greater >跳轉 |
Jump Not Less or Equal <=不跳轉 |
JGE/JNL |
SF=OF |
Jump Greater Equal >=跳轉 |
Jump Not Less <不跳轉 |
JL/JNGE |
SF!=OF |
Jump Less <跳轉 |
Jump Not Greater or Equal >=不跳轉 |
JLE/JNG |
ZF=1 || SF!=OF |
Jump Less or Equal <=跳轉 |
Jump Not Greater >不跳轉 |
二、程式碼測試
JE/JZ!= 不跳轉
JNZ/JNE == 不跳轉
JG/JNLE <= 不跳轉
JGE/JNL < 不跳轉
JL/JNGE >= 不跳轉
JLE/JNG > 不跳轉
printf("begin\n");
//unsigned
int a=3,b=5;
if (a!=b) //je
if (a==b) //jnz
if (a<=b) //jg
if (a<b) //jge
if (a>=b) //jl
if (a>b)//jle
{
printf("do if");
}
printf("end");
return 0;