标志寄存器

在CPU内部中是有一种特殊的寄存器,对于不同的处理机,特殊寄存器的个数和结构都可能不同

这个特殊寄存器具有以下3种作用

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

这种特殊的寄存器在8086CPU当中是被称为标志寄存器,在8086CPU的标志寄存器有16位,其中存储的信息通常被称为程序状态字。

8086CPU的标志寄存器的结构如下所示

这里写图片描述

我们这里主要是去了解标志寄存器当中的CF、PF、ZF、SF、OF、DF标志位,下面就用flag寄存器来表示标志寄存器

在8086CPU的指令集当作,有的指令的执行是影响标志寄存器的,比如说add、sub、div、inc、or、and等,它们大都是运算指令(进行逻辑或者是算术运算),有的指令的执行对标志寄存器没有影响,比如说mov、push、pop等,它们大都是传送指令

ZF标志

flag的第6位就是ZF,这个是一个零标志位,它记录着相关指令执行之后,其的结果是否为0,如果为0的话,ZF=1,如果不为0,ZF=0

PF标志

flag的第2位为PF,奇偶标志位,它记录相关指令执行之后,其结果的所有的bit位当中1的个数是否为偶数,如果1的个数为偶数,那么PF=1,如果为奇数的话,那么PF=0

SF标志

flag的第7位为SF,SF标志就是CPU对有符号数运算结果的一种记录,它记录着数据的正负,在我们将数据当作为有符号数来运算的时候,可以通过它来得知结果的正负,如果为负则SF=1,如果非负SF=0,如果我们将数据当作无符号数来运算,SF的值则没有意义,虽然会有相关的指令去影响了其的值,也就是说CPU在执行add等指令的时候,是肯定会影响到SF标志位的值的

CF标志

CF标志位一般来说在无符号运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或者是从更高位去借位值,对于有符号数来说,CF标志位是没有意义的,因为对于有符号数来说,最高位是符号位,它的变动和数值位的变动意义不一样。所以对于有符号数,CF也可能发生变动,但是它的变动是没意义的

这里写图片描述

OF标志

flag的第11位是OF标志是溢出标志位,如果发生溢出OF=1,如果没有OF=0,OF位只对有符号数有意义,对于无符号数没有意义,因为OF的作用是由于符号位发生变化,而无符号数没有符号位,因为OF的变化其实由于两个正数相加溢出为负数了,或者两个负数相加为正数溢出,如果超过了机器所能表示的范围我们称之为溢出,如果说指令运算的结果用8位寄存器或者是内存中一个字节来存放,那么对于8位的有符号数据,机器能表示的范围就是-128到127,同理,如果对于16位的有符号数据,机器所能表示的范围为-32768-32767

DF标志

flag的第10位是DF,方向标志位,在串处理指令当中,控制每次操作后si、di的增减,如果df=0,那么每次操作之后si、di是递增的,如果df=1,那么每次操作之后si、di递减,串处理指令有movsb、movsw指令

执行movsb指令相当于下面的这些步骤

  • ((es)*16+(di))=((ds)*16+(si))
  • 如果df=0,则(si)=(si)+1,(di)=(di)+1
  • 如果df=1,则(si)=(si)-1,(di)=(di)-1

movsb和movsw进行的只是串传送操作操作的一个步骤,一般来说movsb和movsw都和rep要配合使用,格式如下所示

rep movsb
#用汇编语法来描述rep movsb就是
s:movsb
  loop s

rep的作用就是会根据cx的值,去重复的执行后面的串传送指令,由于每次执行一次movsb指令si和di都会递增或者递减向后一个单元或者前一个单元,这样的话,rep movsb就可以循环实现cx个字符的传送,当然我们也可以用rep movsw 原理都是一样的

注意:计算机中通常是用补码来表示有符号数据的,计算机中的一个数据可以看作是有符号数,也可以看做是无符号数

猜你喜欢

转载自blog.csdn.net/zcmuczx/article/details/80296604