VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > 汇编语言 >
  • 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) 中断允许标志位

  中断标志