汇编 OD 标志位 置位相关指令
知识点:
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 |