您好,欢迎来电子发烧友网! ,新用户?[免费注册]

您的位置:电子发烧友网>电子百科>主机配件>cpu>

标志寄存器的概念

2019年07月22日 10:00 lq 作者: 用户评论(0

  首先说一下标志寄存器的概念。在8086cpu中标志寄存器都是16位的,而其中存储的信息被称为程序状态字(一段包含系统状态的内存或者是硬件区域)。标志寄存器既然是寄存器,那么它也是用来存储信息的,只是它存储信息的方式与其他的寄存器不同而已。其他的寄存器是一个寄存器包含一个信息,而标志寄存器则可以包含多个信息。而标志寄存器之所以可以存储多个信息,是因为它的存储方式。在标志寄存器中,信息是被存储在位中的。标志寄存器中的每一个位都可以代表特定的信息。

  

标志寄存器的概念

  这是我在网上找的一个标志寄存器的示意图。通过这张图片我们可以知道在标志寄存器中,哪些是用到的,哪些是没用到的。我就不在赘述了。接下来我们看一下这些位的具体含义。

  CF(carry flag):进位标志位。这个位是在进行无符号数运算的时候用到的。一般情况下,这个位记录了进行无符号运算的时候,运算结果的最高有效位向更高位的进位值,或从更高位的借位值。注意的是,这里的进位与借位,都是相对于二进制而言的。下面我们再找一张图来加深下理解。

  

标志寄存器的概念

  PF(parity flag):奇偶标志位。这个位的判断需要我们将结果转为二进制来看,如果结果的低8位中有偶数个1,就将PF的值置1;如果是奇数个1,就置0。要注意的是一定是结果的低8位。

  PF,奇偶标志位,flag的第2位记录相关指令执行后,其结果所有bit位中1的个数是否为偶数,若为偶数,则PF=1;若为奇数,PF=0.

  执行

  mov al,00000000b

  add al,00000111b

  mov al,00000000b

  add al,00000011b

  验证:

 

标志寄存器的概念

  AF(auxiliary flag):辅助进位标志位。这个位用的不多,所以书上也没有讲,我就简单的查了一下资料。这个位表示加减法做到一半时有没有形成进位/借位,如果有则AF=1。这么说谁都听不懂,所以我们举个例子来说下。例如 MOV AL,00001110 MOV BL,00001000 ADD AL,BL 最后结果为AL=00010110这就是低四位向高四位进位。反之在减法中第三位不够减向第四位借位(注意数位是从第0位开始数的)叫低四位向高四位借位!像前面的AL中前四位为高四位,后四位为低四位。例如,当两个字节相加时,如果从低4位向高4位有进位时,则AF=1。

  ZF(zero flag):零标志位。这个位就很简单了,判断结果是不是0。如果结果为0,就置1;不为0,就置0。

  执行

  mov ax,1

  sub ax,1

  mov ax,2

  sub ax,1

  

标志寄存器的概念

  可以看到 当计算ax结果为0时,ZF是ZR=1;结果为1(不为0)时,ZF是NZ=0.

  SF(sign flag):符号标志位。既然是符号标志位,就是对有符号数据来说的。如果结果为负,就置1;结果为正,就置0。

  SF,符号标志位,flag的第7位,记录相关指令执行后,其结果是否为负,若为负,则SF=1;若为非负,SF=0.

  执行:

  mov al,10000001b

  add al,1

  mov al,10000000b

  add al,01111111b

  验证:

 

标志寄存器的概念

  当SF=1即为NG,表示:若指令进行有符号数运算,则结果为负

  当SF=0即为PL,表示: 若指令进行有符号数运算,则结果为非负

  TFtimer overblow flag):定时器溢出标志。这个位主要是用来在debug中进行-t指令时使用的。当cpu在执行完一条指令后,如果检测到TF位的值为1,则产生单步中断,引发中断过程。通过这个位,我们就可以在debug中对程序进行单步跟踪。

  IF(interrupt flag):中断允许标志位。当IF=1时,cpu在执行完当前指令后响应中断,引发中断过程;当IF=0时,则不响应可屏蔽中断。

  DF(direction flag):方向标志位。在串处理指令中,控制每次操作后,si(指向原始偏移地址)、di(指向目标偏移地址)的增减。当DF=0时,每次操作后,si、di递增;DF=1时,每次操作后,si、di递减。我们可以使用cld指令将DF的值置为0,使用std指令将DF的值置为1。DF需要与rep、movsb等指令配合使用。

  OF(overflow flag):溢出标志位。这个位是用来判断有没有溢出的。注意溢出这个概念只对于有符号数据而言,就如同进位只对于无符号数据而言。当OF=0时,说明没有溢出;当OF=1时,说明溢出了。

  OF,溢出标志位,flag的第11位,超出机器所能表示的范围称为溢出若发生了溢出OF=1,若没有则OF=0

  比如对于8位有符号数据,机器能表示范围是 -128~127;对于16位有符号数据,范围是 -32768~32767

  执行:

  mov al,64

  add al,64

  mov al,63

  add al,64

  验证:

  

标志寄存器的概念

  下面有几个串传送指令

  格式:movsb

  功能:执行movsb指令相当于进行下面几步操作。

  1) ((es)*16+(di)) = ((ds)*16+(si))

  2) 如果df=0 则 (si)=(si)+1 (di)=(di)+1

  如果df=1则: (si)=(si)-1 (di)=(di)-1

  当然也可以传送一个字

  格式:movsw

  功能:将ds:si指向的内存单元中的字送入es:di中,然后根据标志寄存器df位的值,将si和di递增2或递减2.

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

  rep movsb

  rep功能:根据cx的值,重复执行后面的串传送指令。由于每执行一次movsb指令si和di都会递增或递减指向后一个单元或前一个单元,则rep movsb就可以循环实现(cx)个字符的传送。

  8086CPU提供下面两条指令对df位进行设置。

  cld指令: 将标志寄存器的df位置0

  std指令: 将标志寄存器的df位置1

  1)编程,用串传送指令,将data段中的第一个字符串复制到它后面的空间中。

  data segment

  db ‘welcome to masm!’

  db 16 dup (0)

  data ends

  code segment

  mov ax,data

  mov ds,ax

  mov si, 0

  mov es,ax

  mov di,16

  mov cx,16

  cld

  rep movsb

  code ends

  end

  2)编程,用串传送指令,将F000段中的最后16个字符复制到data段中。

  data segment

  db 16 dup (0)

  data ends

  code segment

  mov ax,0f000h

  mov ds,ax

  mov si, 0ffffh

  mov ax,data

  mov es,ax

  mov di, 15

  mov cx, 16

  std

  rep movsb

  code ends

  end

非常好我支持^.^

(1) 100%

不好我反对

(0) 0%

( 发表人:李倩 )

      发表评论

      用户评论
      评价:好评中评差评

      发表评论,获取积分! 请遵守相关规定!