在8086CPU的指令集中,有的指令的执行是影响标志寄存器的,比如:add、sub、mul、div、inc、or、and等,它们大都是运算指令,进行逻辑或算术运算;
有的指令的执行对标志寄存器没有影响,比如:mov、push、pop等,它们大都是传送指令。
使用一条指令的时候,要注意这条指令的全部功能,其中包括执行结果对标记寄存器的哪些标志位造成影响。
标志寄存器的结构
flag寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息。
8086CPU中没有使用flag的1、3、5、12、13、14、15位,这些位不具有任何含义。
标志寄存器的作用
用来存储相关指令的某些执行结果
用来为CPU执行相关指令提供行为依据
用来控制CPU的相关工作方式
观察值
标志位说明
一、标志位解析
1、直接访问标志寄存器的方法
- pushf :将标志寄存器的值压栈;
- popf :从栈中弹出数据,送入标志寄存器中。
2、内存中16位标志位表示
3、标志位说明
二、ZF-零标志(Zero Flag)
ZF标记相关指令的计算结果是否为0
- ZF=1,表示“结果是0 ”,1表示“逻辑真”
- ZF=0,表示“结果不是0”,0表示“逻辑假”
三、PF-奇偶标志(Parity Flag)
PF记录指令执行后,结果的所有二进制位中1的个数:
- 1的个数为偶数,PF = 1;
- 1的个数为奇数,PF = 0。
四、SF-符号标志(Sign Flag)
SF 标志是CPU对有符号数运算结果的一种记录 。
将数据当作有符号数来运算的时候,通过SF可知结果的正负;将数据当作无符号数来运算,SF的值则没有意义,虽然相关的指令影响了它的值。
SF记录指令执行后,将结果视为有符号数
- 结果为负,SF = 1;
- 结果为非负,SF = 0。
五、CF-进位标志(Carry Flag)
在进行无符号数运算的时候,CF记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。
CF记录指令执行后:
- 有进位或借位,CF = 1
- 无进位或借位,CF = 0
对于位数为N的无符号数来说,其对应的二进制信息的最高位即第N-1位,是最高有效位
假想存在的第N位,就是相对最高有效位的更高位。
六、OF-溢出标志(Overflow Flag)
在进行有符号数运算的时候,如结果超过了机器所能表示的范围称为溢出。
OF记录有符号数操作指令执行后
- 有溢出,OF = 1
- 无溢出,OF = 0
机器所能表达的范围
以8位运算为例,结果用 8 位寄存器或内存单元来存放,机器所能表示的范围就是-128~127。
同理,对于16 位有符号数,机器所能表示的范围是-32768~32767。
注意,此处溢出只是对有符号数运算而言。
CF和OF的区别
CF是对无符号数运算有意义的进/借位标志位
OF是对有符号数运算有意义的溢出标志位
应用
七、DF-方向标志位(Direction Flag)
在串处理指令中,控制每次操作后si,di的增减:
- DF = 0:每次操作后si,di递增;
- DF = 1:每次操作后si,di递减。
对DF位进行设置的指令:
- cld指令:将标志寄存器的DF位设为0(clear)
- std指令:将标志寄存器的DF位设为1(setup)
八、其他标志说明
TF-陷阱标志(Trap flag):用于调试时的单步方式操作。当TF=1时,每条指令执行完后产生陷阱,由系统控制计算机;当TF=0时,CPU正常工作,不产生陷阱。
IF-中断标志(Interrupt flag):当IF=1时,允许CPU响应可屏蔽中断请求;当IF=0时,关闭中断。
CPU在执行完一条指令之后,如果检测到标志寄存器的TF位为1,则产生单步中断(中断类型码为1),引发中断过程,执行中断处理程序。