`1.特殊的寄存器,作用:

(1)用作存储相关指令的某些执行结果
(2)用来为CPU执行相关指令提供行为依据
(3)用来控制CPU的相关工作方式

在8086CPU的标志寄存器有16位,存储的信息通常被称为程序状态字(PSW),标志寄存器简称flag

flag寄存器是按位起作用的,每个位都有专门的含义,记录特定信息

flag的1,3,5,12,13,14,15位在8086CPU中没有使用,

0,2,4,6,7,8,9,10,11对应的是cf,pf,zf,sf,of,df标志位

  • zf,是flag的第6位标志位,又称0标志位,它记录相关指令执行后,其结果是否为0,若结果为0,则zf=1,若结果不为0,则zf=0
  • pf,是flag的第2位标志位,又称奇偶标志位,它记录相关指令执行后,其结果的所有bit位中1的个数是否为偶数,若为偶数,则pf=1,若为奇数,则pf=0
  • sf,是flag的第7位标志位,又称符号标志位,它记录相关指令执行后,其结果是否为负,若结果为负,则sf=1,若非负,则sf=0
    such as:
    mov al,10000001B
    add al,1
    执行后结果为10000010B,sf=1,表示若指令进行的是有符号运算,那么结果为负
  • cf,是flag的第0位标志位,一般情况,在进行无符号数运算时,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值
    such as:
    mov al,98H
    add al,al
    执行后,(al)=30H,CF=1,CF记录了从最高有效位向更高位的进位值
    再如:
    mov al,97H
    sub al,98H ;此时,执行后,(al)=FFH,CF=1,CF记录了向更高位的借位值
    sub al,al ;此时,执行后,(al)=0,CF=0,CF记录了向更高位的借位值
  • of,是flag的第11位标志位,又称溢出标志位,一般情况,OF记录有符号数运算的结果是否溢出,若发生溢出,则OF=1,若没有,则OF=0
    如:
    mov al,98
    mov al,99
    执行后,CF=0,OF=1,CPU在执行add等指令时,有两个含义,无符号数运算和有符号数运算,对于无符号数运算,CPU用CF位来记录是否产生进位,对于有符号数运算,CPU用OF来记录是否产生溢出
  • df,是flag的第10位标志位,又称方向标志位,在串处理指令中,控制每次操作后,si和di的增减。
    若df=0,则每次操作后,si和di递增,若df=1,则每次操作后,si和di递减
    如:
    {一个串传送指令,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
    用汇编语法描述,则是:
    mov es:[di],byte ptr ds:[si]
    若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递增或递减
    用汇编语法描述:
    mov es:[di],word ptr ds:[si]
    若df=0
    add si,2
    add di,2
    若df=1
    sub si,2
    sub di,2

}

{一般来说,movsb和movsw进行的是串传送操作中的一个步骤,可以和rep配合使用
如:rep movsb
可以用汇编语法来描述为:
s:movsb
loop s}
8086CPU提供以下两个指令对df位进行设置,
cld指令,将标志寄存器中的df位,置0
std指令,将标志寄存器中的df位,置1
}
扩展知识点:{
无符号数和有符号数
     在计算器中参与运算的数有两大类:无符号数和有符号数
     (1)有符号数:
          对于有符号数而言,符号的正、负机器是无法识别的,但由于“正、负”恰好是两种截然不同的状态,如果用“0”表示“正”,用“1”表示“符”,这样符号也被数字化了,
          并且规定将它放在有效数字的前面,即组成了有符号数。所以,在二进制中使用最高位(第一位)来表示符号,最高位是0,表示正数;最高位是1,表示负数。
     (2)无符号数:
          无符号数是针对二进制来讲的,无符号数的表数范围是非负数。全部二进制均代表数值(所有位都用于表示数的大小),没有符号位。即第一个"0"或"1"不表示
          正负。
二进制中的原码、反码、补码
      对于有符号数而言:
      (1)二进制的最高位是符号位:0表示正数,1表示负数
      (2)正数的原码、反码、补码都一样;
      (3)负数的反码 =  它的原码符号位不变,其他位取反(0 ->1 ; 1->0 );
      (4)负数的补码 = 它的反码 +1;
      (5)0的反码、补码都是0;
      (6)在计算机运算的时候,都是以补码的方式来运算的;
}

3.adc指令,带进位的加法指令,它利用CF位上记录的进位值

指令格式:adc 操作对象1,操作对象2

功能:操作对象1=操作对象1+操作对象2+CF

如: adc ax,bx == (ax)=(ax)+(bx)+CF

若CF的值被sub指令设置的,则CF含义为借位值,若被add指令设置的,则CF含义为进位值

4.sbb指令,带借位的减法指令,它利用CF位上记录的借位值

指令格式:sbb 操作对象1,操作对象2

功能:操作对象1=操作对象1-操作对象2-CF

如:sbb ax,bx == (ax)=(ax)-(bx)-CF

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

cmp指令格式:cmp 操作对象1,操作对象2

(1)sf=1,of=0,必然(ah)<(bh)   (寄存器只是打个比喻)
(2)sf=1.of=1,必然(ah)>(bh)
(3)sf=0.of=1,必然(ah)<(bh)
(4)sf=0,of=0,必然(ah)>=(bh)

(结论:sf^of=1,则必然(ah)<(bh),否则必然(ah)>=(bh),具体(ah)>(bh)还是(ah)>=(bh)还得看sf和of)

扩:cmp指令可以同时进行两种比较,无符号数比较和有符号数比较,根据cmp指令的比较结果进行转移的指令也分两种:即根据无符号数的比较结果进行转移的条件转移指令(zf,cf),和根据有符号数的比较结果进行转移的条件转移指令(sf,of,zf)

6.pushf指令是将标志寄存器的值进行压栈操作

popf指令是从栈中弹出数据,送入到标志寄存器中

popf和pushf为直接访问标志寄存器提供了一种方法

  1. 下面列出,debug对于已知的标志位的表示