8089汇编 标志寄存器

  在8086CPU的指令集中,有的指令的执行是影响标志寄存器的,比如:add、sub、mul、div、inc、or、and等,它们大都是运算指令,进行逻辑或算术运算;

有的指令的执行对标志寄存器没有影响,比如:mov、push、pop等,它们大都是传送指令。

使用一条指令的时候,要注意这条指令的全部功能,其中包括执行结果对标记寄存器的哪些标志位造成影响。

标志寄存器的结构

  flag寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息。
  8086CPU中没有使用flag的1、3、5、12、13、14、15位,这些位不具有任何含义。

标志寄存器的作用

  用来存储相关指令的某些执行结果
  用来为CPU执行相关指令提供行为依据
  用来控制CPU的相关工作方式

观察值

8089汇编 标志寄存器_数据

标志位说明

一、标志位解析

1、直接访问标志寄存器的方法

  • pushf :将标志寄存器的值压栈;
  • popf :从栈中弹出数据,送入标志寄存器中。

2、内存中16位标志位表示

8089汇编 标志寄存器_有效位_02

 3、标志位说明

8089汇编 标志寄存器_有符号数_03

二、ZF-零标志(Zero Flag)

ZF标记相关指令的计算结果是否为0

  • ZF=1,表示“结果是0 ”,1表示“逻辑真”
  • ZF=0,表示“结果不是0”,0表示“逻辑假”

8089汇编 标志寄存器_寄存器_04

 三、PF-奇偶标志(Parity Flag)

PF记录指令执行后,结果的所有二进制位中1的个数:

  • 1的个数为偶数,PF = 1;
  • 1的个数为奇数,PF = 0。

8089汇编 标志寄存器_数据_05

四、SF-符号标志(Sign Flag)

SF 标志是CPU对有符号数运算结果的一种记录 。   

将数据当作有符号数来运算的时候,通过SF可知结果的正负;将数据当作无符号数来运算,SF的值则没有意义,虽然相关的指令影响了它的值。

SF记录指令执行后,将结果视为有符号数

  • 结果为负,SF = 1;
  • 结果为非负,SF = 0。

8089汇编 标志寄存器_有效位_06

五、CF-进位标志(Carry Flag)

在进行无符号数运算的时候,CF记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。 

CF记录指令执行后:

  • 有进位或借位,CF = 1
  • 无进位或借位,CF = 0

8089汇编 标志寄存器_无符号数_07

对于位数为N的无符号数来说,其对应的二进制信息的最高位即第N-1位,是最高有效位

假想存在的第N位,就是相对最高有效位的更高位。

8089汇编 标志寄存器_无符号数_08

六、OF-溢出标志(Overflow Flag)

在进行有符号数运算的时候,如结果超过了机器所能表示的范围称为溢出。 

OF记录有符号数操作指令执行后

  • 有溢出,OF = 1
  • 无溢出,OF = 0

8089汇编 标志寄存器_寄存器_09

机器所能表达的范围

以8位运算为例,结果用 8 位寄存器或内存单元来存放,机器所能表示的范围就是-128~127。

同理,对于16 位有符号数,机器所能表示的范围是-32768~32767。

注意,此处溢出只是对有符号数运算而言。

CF和OF的区别

CF是对无符号数运算有意义的进/借位标志位

OF是对有符号数运算有意义的溢出标志位

应用

8089汇编 标志寄存器_有效位_10

 七、DF-方向标志位(Direction Flag)

在串处理指令中,控制每次操作后si,di的增减:

  • DF = 0:每次操作后si,di递增;
  • DF = 1:每次操作后si,di递减。

对DF位进行设置的指令:

  • cld指令:将标志寄存器的DF位设为0(clear)
  • std指令:将标志寄存器的DF位设为1(setup)

8089汇编 标志寄存器_寄存器_11

 八、其他标志说明

TF-陷阱标志(Trap flag):用于调试时的单步方式操作。当TF=1时,每条指令执行完后产生陷阱,由系统控制计算机;当TF=0时,CPU正常工作,不产生陷阱。

IF-中断标志(Interrupt flag):当IF=1时,允许CPU响应可屏蔽中断请求;当IF=0时,关闭中断。

CPU在执行完一条指令之后,如果检测到标志寄存器的TF位为1,则产生单步中断(中断类型码为1),引发中断过程,执行中断处理程序。