1、
8086CPU的标志寄存器有16位,其中存储的信息通常被称为程序状态字(PSW)
8086CPU的flag寄存器结构:
1 3 5 12 13 14 15位在8086CPU中没有使用,不具有任何意义
0 2 4 6 7 8 9 10 11都具有特殊的含义
IF中断标志位
2、ZF标志(zero flag)
flag的第6位是ZF,零标志位
它记录相关指令执行后
结果为0, ZF = 1
结果不为0,ZF = 0
mov ax,1 sub ax,1 结果为0,ZF = 1
3、PF标志,奇偶标志位
他记录指令执行后,结果的所有二进制位中1的个数
为偶数,PF = 1
为奇数,PF = 0
4、符号位0代表+ 1代表-
100 000 01就相当于 -127
5、SF标志,符号标志位
它记录执行指令后
结果为负 SF = 1
结果为正 SF = 0
6、CF标志,进位标志位
mov al,98
mov al,al
这样就会产生进位,我们的寄存器不会将进位直接丢掉,而是在寄存器中保存是否进位
7、OF标志,溢出标志位、
溢出只是针对于有符号数而言
进位是针对于无符号数来说的
8、adc指令,是带进位的加法指令,它利用了CF位上记录的进位值
adc ax,bx
(ax)=(ax)+(bx)+CF
9、sbb指令 sbb是带借位减法指令,他利用了CF位上记录的借位值
sbb ax,bx
(ax) = (ax) - (bx) - CF
10、cmp指令
cmp指令比较无符号数的
cmp ah,bh为例子
ah = bh (ah) - (bh) = 0 所以ZF = 1
ah != bh (ah) - (bh) = 0 所以 ZF = 0
根据cmp指令执行后的ZF的值,就可以知道两个数据是否相等
对于有符号数的比较,因为有溢出这个条件就会比较麻烦
例子:
SF = 1 负数
OF = 0 无溢出
说明就是正常的小于
SF = 1
OF = 1
负数加溢出
cmp发生溢出说明出现了错误,错误再给他发过来就是正确(。。。。感觉有些奇怪,减法溢出结果要反过来看)
11、
实操训练
12、DF标志和传传送标志
flag的第10位是DF,方向标志位
在串处理指令中,控制每次操作后si,di的增减
DF = 0 : 每次操作后 si di 递增
DF = 1 每次操作后 si di 递减
movsb
功能:(以字节单位传送)
把段地址ds 寄存器si的内容放进段地址es寄存器偏移地址di内存中去
movsb的功能是将ds si指向的内存单元中的字节送入es di,然后根据标志寄存器DF位的值,将si di递增或递减
movsw 传送一个字,递增递减是+2 -2
实际使用:
rep movsb
rep的作用是根据cx的值,重复执行后面的串传送指令
由于每执行一次movsb指令 si di都会去递增或递减指向后一个单元,则rep movsb 就可以循环实现(cx)个字符的传送。
8086CPU提供了两条指令对DF进行设置:
cld指令:将标志寄存器的DF位置0 clear
std指令:将标志寄存器的DF位置1 set