汇编语言_第11章 标志寄存器

  • CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都有可能不同)具有以下3种作用:
    (1)用来存储相关指令的某些执行结果;
    (2) 用来为CPU执行相关指令提供行为依据;
    (3) 用来控制CPU的相关工作方式。
  • 8086CPU的标志寄存器有16位,其中存储的信息通畅称为程序状态字(PSW)。标志寄存器以下简称为flag。
  • flag寄存器是按位起作用的,即它的每一位都有专门的含义,记录特定的信息。
    在这里插入图片描述
    flag 的 1、3、5、12、13、14、15 位在8086CPU中没有使用,不具有任何含义。其他位都具有特殊的含义。

11.1 ZF标志

  • flag 的第6位是ZF,零标志位。
    它记录相关指令执行后,其结果是否为0,如果结果为0,则 zf=1;如果结果不为0,那么zf=0。
    在这里插入图片描述

11.2 PF标志

  • flag的第2位是PF,奇偶标志位。
    它记录相关指令执行后,其结果的所有bit位中1的个数是否为偶数。如果1的个数为偶数,pf=1;如果为奇数,pf=0。
    在这里插入图片描述

11.3 SF标志

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

SF标志,就是CPU 对有符号数运算结果的一种记录,它记录数据的正负。在我们将数据当作有符号数来运算的时候,可以通过它来得知结果的正负。如果我们将数据当作无符号数来运算,SF的值则没有意义,虽然相关的指令影响了它的值。
在这里插入图片描述

11.4 CF 标志

  • flag的第0位是CF,进位标志位。
    一般情况下,在进行无符号数运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

11.5 OF标志

  • flag的第11位是OF,溢出标志位。
    一般情况下,OF记录了有符号数运算的结果是否发生了溢出。如果发生溢出,OF=1;如果没有,OF=0。

注意CF 和 OF的区别: CF是对无符号数运算有意义的标志位。OF 是对有符号数运算有意义的标志位。

11.6 adc指令

  • adc是带进位加法指令,它利用了CF位上记录的进位值。
    指令格式: adc 操作对象1,操作对象2
    功能: 操作对象1=操作对象1+操作对象2+CF
    例:adc ax,bx 即:(ax)=(ax)+(bx)+CF

11.7 sbb指令

  • sbb是带借位减法指令,它利用了CF位上记录的借位值。
    指令格式:sbb 操作对象1,操作对象2
    功能:操作对象1=操作对象1-操作对象2-CF
    例:sbb ax,bx 功能: (ax)=(ax)-(bx)-CF

11.8 cmp指令

  • cmp
    是比较指令,cmp的功能相当于减法指令,只是不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。

指令格式:cmp 操作对象1,操作对象2
功能:计算操作对象1-操作对象2 但并不保存结果,仅仅根据计算结果对标志寄存器进行设置。
例:cmp ax,ax ,做(ax)-(ax)的运算,结果为0,但并不在ax中保存,仅影响flag相关各位。指令执行后:zf=1,pf=1,sf=0,cf=0,of=0.

  • 比较指令的设计思路:
    通过做减法运算,影响标志寄存器,标志寄存器的相关位记录了比较的结果。
    在这里插入图片描述

11.9 检测比较结果的条件转移指令
转移 指的是它能够修改IP,而 条件 指的是它可以根据某种条件,决定是否修改IP.

例:条件转移指令jcxz ,它可以检测cx中的数值,如果(cx)=0,就修改IP,否则什么也不做。

  • 所有条件转移指令的转移位移都是[-128,127].

根据cmp指令的比较结果进行转移的指令分为2种:

  • 根据无符号数的比较结果进行转移的条件转移指令:它们检测zf、cf的值。

  • 根据有符号数的比较结果进行转移的条件转移指令:它们检测sf、of、zf的值。

常用根据无符号数的比较结果进行转移的条件转移指令:
在这里插入图片描述

在这里插入图片描述

11.10 DF标志和串传送指令

  • flag的第10位是DF,方向标志位。在串处理指令中,控制每次操作后si、di的增减。
    df=0 ,每次操作后si、di递增
    df=1 ,每次操作后si、di递减
  • 串传送指令:
    格式:movsb
    功能:执行movsb指令相当于进行下面几步操作:
    如果df=0:
    inc si
    inc di
    如果df=1:
    dec si
    dec di
    movsb 功能是将ds:si 指向的内存字单元中的字送入es:di中,然后根据标志寄存器df的值,将si和di递增或递减.

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

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

8086 CPU 提供下面2条指令对df为进行设置:
cld指令: 将标志寄存器的df位 置0
std指令: 将标志寄存器的df位 置1

在这里插入图片描述

11.11 pushf 和 popf
pushf的功能是将寄存器的值压栈,而popf是从栈中弹出数据,送入标志寄存器中。

11.12 标志寄存器在Debug中的表示
在Debug中,标志寄存器是按照有意义的各个标志位单独表示的。
在Debug中可以看到如下信息:
在这里插入图片描述
在这里插入图片描述

To be continue…

猜你喜欢

转载自blog.csdn.net/madao1234/article/details/84395753