第十一章 标志寄存器
引言
8086CPU标志寄存器有16bits,其中的存储信息叫程序状态字(psw)
标志寄存器按位表示意义
其中空的位无意义,保留
ZF标志位
zero flag 结果 == 0? zf=1 : zf=0
使用指令应注意是否影响标志寄存器
PF标志位
parity flag:结果二进制1的个数为偶数? pf=1 : pf=0;
SF标志位
symbol flag:结果为负数? sf=1: sf=0;
SF标志位总是将运算看做有符号数进行操作,当计算数值需要看做有符号时,才看sf标志位
CF标志位(无符号溢出)
OF标志位(有符号溢出)
add 98, 99
== -59
adc指令
带进位加法指令 adc 对象1, 对象2
对象1 = 对象1 + 对象2 + CF
adc ax, bx
即`ax = ax + bx + CF
示例:
mov ax, 2
mov bx, 1
sub bx, ax ; 进行了借位, CF = 1
adc ax, 1 ; 结果 ax = ax + 1 + CF , ax = 4
add ax, bx 等同于
add al, bl ;CF保存是否进位
adc ah, bh ;adc将进位状态加上
inc si
inc si ;不能直接 add si, 2 因为会影响cf的值
sbb指令
带借位减法指令,使用CF位上的值 sbb 对象1, 对象2
对象1 = 对象1 - 对象2 - cf
同adc指令
cmp指令
cmp a, b
a -b
该指令仅仅影响标志位值,不会保存结果
有符号数
-
SF = 1, OF = 0
此时,没有溢出,
sf
标志位与实际运算结果一致 -
SF = 1, OF = 1
此时,溢出,
sf
标志位与实际结果相反
当ZF=1
时,je
就会跳转
DF标志和串传送指令
*movsb*
功能: 以字节为单位进行传送
es*16 + di = ds*16 + si
1.如果DF==0, si++,di++
2.如果DF==1, si--, di--
*movsbw*
功能: 以字为单位进行传送(同上)
*rep*
功能:根据cx的值,重复执行后面的串传送指令
格式:rep movsw (可以实现cx个字的传送)
cld:将df设置为0
std:将df设置为1
pushf, popf
pushf:将标志寄存器的值送入栈
popf:将栈中的值弹出到标志寄存器