8086汇编语言学习(九) 8086标志寄存器

8086标志寄存器介绍

  前面已经介绍了8086大多数的寄存器,现在介绍一种8086内部一个特殊的寄存器,标志寄存器(flag register)

8086标志寄存器大致有以下作用:

  1.存储一些相关指令的执行结果
  2.为CPU执行相关指令提供依据
  3.控制CPU的部分工作方式

  8086的寄存器是16位的,通常的寄存器都是存放一个16位数据视作一个整体进行工作的。但标志寄存器较为特殊,标志寄存器中的每一bit位是单独工作的,虽然理论上16位的标志寄存器能够提供至多16个flag标志,但事实上8086CPU的设计者只使用了其中的9位,剩余的bit位并没有实际意义。

  8086的指令集中,有许多指令的执行会同时影响标志寄存器中flag的值。比如add、sub、inc、and等运算指令(逻辑或算术运算),而像mov、push、pop等单纯传送数据的指令则不会对标志寄存器产生影响。在使用一条指令时,出了其本身的作用外,也要注意指令对标志寄存器的影响。

  

  其中ZF、PF、SF、CF、OF、AF被归类为运算结果标志位,而DF、IF、TF则被归类为状态控制标志位。

  下面对标志寄存器的各位进行详细介绍。

ZF(Zero Flag) 零标志位

  ZF零标志位,记录相关指令执行后,结果是否为0。通常一位bit的布尔变量1表示真,0表示假。ZF零标志位在指令执行的结果为0时,值为真(ZF=1);不为0时;不为0时,值为假(ZF=0)。

PF(Parity Flag) 奇偶标志位

  PF奇偶校验位,记录相关指令执行后,结果中bit位中1的个数是否为偶数。若1的个数为偶数,则PF=1;反之,若1的个数为奇数,则PF=0。

SF(Sign Flag) 符号标志位

  SF符号标志位,记录相关指令执行后,结果是否为负。若结果为负,SF=1;若结果为非负,SF=0。

CF(Carry Flag) 进位标志位

  CF进位标志位,一般在无符号数运算时,记录最高位是否产生了进位(例如加法指令),或是否从最高位借位(例如减法指令)。

  正是因为存在了CF进位标志位,8086CPU的寄存器虽然只有16位,虽然在硬件上无法直接进行更大范围的数的运算(超过2^16),但可以通过软件的方式,将运算分为多步,将一个更大的数据(例如两个64位的数的加法可以分解为4个16位数的相加),通过CF进位标志位完成运算(adc指令 带进位的加法指令)。在理论上可以完成任意位数据的运算。

OF(Overflow Flag) 溢出标志位

  OF溢出标志位,一般在有符号运算时,记录结果是否产生了溢出。若发生了溢出,则OF=1;若没有发生溢出,则OF=0。

  有程序mov al,98; add al,99。 将98、99看作8位无符号整数,则没有产生进位(98+99<2^8);若是将98、99看作8位有符号整数,则发生了溢出(98+99>2^7)。

  有程序mov al,0F0H; add al,88H。将0F0H、88H看作8位无符号整数,则产生了进位(240+136>2^8);若是将0F0H、88H看作8位有符号整数,也发生溢出(-16+-120<-2^7)。

  有程序mov al,0F0H; add al,78H。将0F0H、78H看作8位无符号整数,则产生了进位(240+135>2^8);若是将0F0H、88H看作8位有符号整数,则没有发生溢出(-16+120<2^7)。

  在运算指令执行后,CF。OF的值可以相同也可以不同。由此可见,CF和OF是分别针对无符号和有符号运算的,两者之间并无直接关联。

AF(Auxiliary Carry Flag) 辅助进位标志

  AF辅助进位标志,用于表示8位无符号数运算时,4位的半字节处是否产生进位或者借位。

  若AF=1表示字节运算产生低半字节向高半字节的进位或借位,否则AF=0。辅助进位也称半进位标志,主要用于BCD码运算的十进制调整。

  有程序 mov al 10110001B; add 10100100b。无符号数1011 0001与1010 0100相加时,产生了进位,CF=1;但低四位0001与0100相加并没有产生进位,因此AF=0。

DF(Direction Flag) 方向标志位

  方向标志位用于指定字符串处理时的方向,DF=1,以递减顺序处理字符串,即地址以从高到低顺序递减。反之,DF=0时则以递增顺序处理。

IF(Interrupt enable Flag) 中断允许标志位

  中断标志位用于标识中断是否启用。IF=1,表示CPU允许接受中断;IF=0,表示当前CPU不接受中断。

TF(Trap Flag) 跟踪标志位

  跟踪标志位用于标识CPU是否允许单步中断,以进行程序调试。TF=0时,8086CPU处于正常状态;TF=1时,8086CPU处于单步状态,每执行一条指令就自动产生一次单步中断。

  8086的debug功能依赖于8086CPU的单步调试功能。更进一步,CPU单步中断的硬件功能,是所有软件级别的debug单步调试的基础,只不过通常高级语言中的单步执行对应的是多条机器硬件指令的执行。

  IF、TF在8086中断控制中起到了非常关键的作用,在后面的中断部分会进一步的详细介绍。

标志寄存器在Debug模式中的表示

  在8086的debug模式下,可以观察到标志寄存器中各个flag位的状态。debug中的flag不是使用0、1展示的,而是使用更符合flag语义的英文单词缩写来表示。

  

  第二行尾部的NV UP EI等便是8086标志寄存器的状态信息了。

debug模式下标志位的含义:

  1、OF 值为1时=>OV(overflow),值为0时=>NV(not overflow)

  2、DF 值为1时=>DN(decrement),值为0时=>UP(increament)

  3、IF 值为1时=>EI(enabled interrupt),值为0时=>DI(disabled interrupt)

  4、SF 值为1时=>NG(negative),值为0时=>PL(positive)

  5、ZF 值为1时=>ZR(zero),值为0时=>NZ(not zero)  

  6、AF 值为1时=>AC(auxiliary carry),值为0时=>NA(not auxiliary carry)

  7、PF 值为1时=>PE(parity even),值为0时=>PO(parity odd)

  8、CF 值为1时=>CY(carry),值为0时=>NC(not carry)

  8086有九个标志寄存器,可为什么debug模式下却只展示了8个flag的信息呢?

  这是因为debug模式依赖于8086CPU的单步调试状态,只有TF=1时debug调试才能正常工作,所以TF位并没有显示在debug的CPU视图中。  

posted on 2020-03-31 22:03  小熊餐馆  阅读(3241)  评论(1编辑  收藏  举报