知識點:
l 標志位 置位相關指令
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 Equl
JNE/JNZ //不= //013
//帶符號數條件轉移指令
JL /JNGE //不>= //小於 < //015
JLE/JNG //不> //小於等於<= //016
JG/JNLE //不<= //大於 >//017
JGE/JNL //不< //大於等於>= //017
Jump 跳轉/轉移
Not 不
Equal 相等
Zero 零
Less 小於
Greater 大於
一、條件轉移指令(cmp)
助憶符 |
檢測的轉移條件 |
功能描述 |
|
SETE/SETZ |
ZF=1 |
Jump Equal == |
Jump Zero |
SETNE/SETNZ |
ZF=0 |
Jump Not Equal != |
Jump Not Zero |
SETG/SETNLE |
ZF=0&&SF=OF |
Jump Greater > |
Jump Not Less or Equal |
SETGE/SETNL |
SF=OF |
Jump Greater Equal >= |
Jump Not Less |
SETL/SETNGE |
SF!=OF |
Jump Less < |
Jump Not Greater or Equal |
SETLE/SETNG |
ZF=1 || SF!=OF |
Jump Less or Equal <= |
Jump Not Greater |
條件置位指令
通用寫法:SETxx reg8/mem8
作用:若條件xx成立,則dest=1,否則,dest=0;
SETxx有很多種命令形式,這里的xx只是一個描述符,具體的參見下面的三個表,其中,E(Equal)表示相等,G(Greatet)表示帶符號大於,L(Less)表示帶符號小於,A(Above)表示無符號大於,B(Below)表示無符號小於。
表一:用於帶符號數比較的SETxx指令,這些指令常用在CMP指令之后,以判斷帶符號數的大小:
SETxx指令 |
描述 |
置1條件 |
SETG,SETNLE//jg/jnle |
大於(不小於等於)時置1 |
SF=OF且ZF=0 |
SETGE,SETNL |
大於等於(不小於)時置1 |
SF=OF |
SETL,SETNGE |
小於(不大於等於)時置1 |
SF≠OF |
SETLE,SETNG |
小於等於(不大於)時置1 |
SF≠OF或ZF=1 |
表二:用於無符號數比較的SETxx指令,常用在CMP指令之后,用來判斷無符號數的大小:
SETxx指令 |
描述 |
置1條件 |
SETA,SETNBE |
大於(不小於等於)時置1 |
CF=0且ZF=0 |
SETAE,SETNB,SETNC |
大於等於(不小於)時置1 |
CF=0 |
SETB,SETNAE,SETC |
小於(不大於等於)時置1 |
CF=1 |
SETBE,SETNA |
小於等於(不大於)時置1 |
CF=1或ZF=1 |
表三:測試單個標志位的SETxx指令:
SETxx指令 |
描述 |
置1條件 |
SETC,SETB,SETNAE |
有進位時置1 |
CF=1 |
SETNC,SETNB,SETAE |
無進位時置1 |
CF=0 |
SETZ,SETE |
為0(相等)時置1 |
ZF=1 |
SETNA,SETNE |
非0(不等)時置1 |
ZF=0 |
SETS |
為負時置1 |
SF=1 |
SETNS |
為正時置1 |
SF=0 |
SETO |
溢出時置1 |
OF=1 |
SETNO |
不溢出時置1 |
OF=0 |
SETP,SETPE |
‘1’的個數為偶數時置1 |
PF=1 |
SETNP,SETPO |
‘1’的個數為奇數時置1 |
PF=0 |