标志寄存器
标志寄存器有以下3种作用:
- 用来存储相关指令的某些执行结果
- 用来为CPU执行相关指令提供行为依据
- 用来控制CPU的相关工作方式
note : 标志寄存器与其他寄存器不一样,它是按位起作用的,也就是说它每一位都有专门的含义,记录特定信息。
ZF标志
标志寄存器的第6位是ZF,零标志位。它记录相关指令执行后,其结果是否为0。结果为0的话,那么zf = 1,不为零的话,zf = 0
note : 有的指令不影响标志寄存器,比如:mov、push、pop等传送指令。
PF标志
标志寄存器的第2位是PF,奇偶标志位。它记录相关指令执行后,其结果的所有bit位中1的个数是否为偶数。如果1的个数是偶数,PF = 1,奇数则为0。
SF标志
标志寄存器的第7位是SF,符号标志位。它记录相关指令执行后,其结果是否为负。如果为负,SF = 1,否则为0。
CF标志
标志寄存器的第0位是CF,进位标志位。在做无符号运算时,它记录了最高有效位向更高位的进位制,或从更高位的借位值。
OF标志
标志寄存器的第11位是OF,溢出标志位。一般情况下,OF记录了有符号运算的结果是否发生了溢出。如果发生了溢出,OF=1,否则为0。
adc指令
adc是带进位的加法指令,它利用了CF位上记录的进位值。
指令格式:adc 操作对象1 + 操作对象2 + CF
# 示例
# 计算 1EF000H + 201000H,结果放在ax(高16位)和bx中(低16位)
mov ax, 001EH
mov bx, 0F000H
add bx, 1000H
adc ax, 0020H
sbb指令
sbb指令是带借位的错位减法指令,它利用了CF位上记录的借位值
指令格式:sbb 操作对象1, 操作对象2
功能:操作对象1 = 操作对象1 - 操作对象2 - CF
# 示例
# 计算003E1000H - 00202000H,结果放在ax, bx中
mov bx, 1000H
mov ax, 003EH
sub bx, 2000H
sbb ax, 0020H
cmp指令
cmp是比较指令,cmp功能相当于减法指令,只是不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他指令通过识别被影响的标志寄存器来得知比较结果
cmp指令格式:cmp 操作对象1, 操作对象2
检测比较结果的转移指令
下面是无符号数的比较结果进行转移的条件转移指令。
DF标志和串传送指令
标志寄存器的第10位是DF,方向标志位。在串处理指令中,控制每次操作后si、di的递减。
movsb和movsw
movsw和movsb相似,只是把内存单元还成了以字为单位。
movsb和movsw一般都是和rep配合来使用,格式如下:
rep movsb
用汇编语法来描述就是:
s: movsb
loop s
8086CU提供下面两条指令对df位进行设置。
cld指令:将标志寄存器df位置0
std指令:将标志寄存器df位置1
下面是示例:
pushf和popf
pushf是将标志寄存器的值压栈,popf是从栈中弹出数据,送入标志寄存器中。
这里是我的博客