标志寄存器的作用:
1) 存储相关指令的某些执行结果;
2) 为CPU执行相关指令提供行为依据;
3) 控制CPU的相关工作方式

标志寄存器的结构

标志寄存器(简称flag)13512131415位在8086CPU中没有使用,不具有任何意义.

 

ZF标志

flag的第六位是ZF,零标志位.记录相关指令执行后,结果是否为0,若结果为0ZF=1,否则ZF=0.

 

PF标志

flag的第二位是PF,奇偶标志位.它记录相关指令执行后,结果的所有二进制位中1的个数是否为偶数,是则PF=1,否则PF=0.

 

SF标志

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

 

SF标志,就是CPU对有符号数运算结果的一种记录,它记录数据的正负,若将数据当作有符号数来运算,可以通过它来得知结果的正负,若将数据当作无符号数来运算,SF的值没有意义。

例如:mov al,10000001B

add al,1

执行后,SF=1表示:若进行的是有符号数运算,则结果为负

 

CF标志

flag的第0位是CF,进位标志位.一般情况下,在进行无符号数运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值.

 

当两个数据相加的时候,有可能产生从最高有效位向更高位的进位.比如:

两个8位数据: 98H+98H

 

当两个数据相减时,有可能向更高位借位.比如:

两个8位数据:97H-98H,将产生借位,相当于计算197H-98H.

 

 

OF标志

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

 

溢出:进行有符号数运算的时候,结果超出机器所能表示的范围

机器表示的范围:8位有符号数据,机器所能表示的范围是-128~127,16位有符号数据,机器所能表示的范围是-32768~32767

 

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

 

adc指令

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

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

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

 

incloop指令不影响CF.

 

sbb指令

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

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

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

cmp指令

cmp是比较指令,功能相当于减法指令

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

功能:计算操作对象1-操作对象2,不保存结果,只根据计算结果对标志寄存器进行设置

 

cmp指令的含义

cmp ah,bh

SF=1,OF=0   (ah)< (bh)

SF=1,OF=1   ;溢出  (ah)>(bh)

SF=0,OF=1   ;溢出  (ah)<(bh)

SF=0,OF=0   (ah) ≥ (bh)

 

检测比较结果的条件转移指令

 

指令                    含义                检测的相关标志位

      je                    等于则转移                  ZF=1

jne                  不等于则转移               ZF=0

jb                    低于则转移                  CF=1

jnb                  不低于则转移               CF=0

ja                    高于则转移                CF=0ZF=0

jna                  不高于则转移             CF=1ZF=1

 

DF标志和串传送指令

flag的第10位是DF,方向标志位,在串处理指令中,控制每次操作后si,di的增减

DF=0,每次操作后si,di递增

DF=1,每次操作后si,di递减

 

传送字节串指令

格式:movsb       相当于mov es:[di], byte ptr ds:[si]

功能:将ds:si指向的内存单元中的字节送入es:di指向的单元中,然后根据DF的值,将sidi进行递增或递减

 

传送字串指令

格式:movsw       相当于mov es:[di], word ptr ds:[si]

功能:将ds:si指向的内存单元中的字送入es:di指向的单元中,然后根据DF的值,将sidi进行递增2或递减2

两个指令可以和rep配合使用

 

格式:rep movsb/movsw

相当于:s: movsb/movsw      loop s

 

rep的作用:根据cx的值,重复执行后面的串传送

rep movsb可以循环实现(cx)个字符的传送

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

cld指令:DF0

std指令:DF1

 

pushfpopf

 

格式:pushf

功能:将标志寄存器的值压栈

 

格式:popf

功能:从栈中弹出栈顶数据,送入标志寄存器

上面的两条指令可以直接访问标志寄存器

 

标志寄存器在Debug中的表示

 

标志                      值为1的标记              值为0的标记

OF                          OV                        NV

SF                           NG                        PL

ZF                           ZR                        NZ

PF                           PE                        PO

CF                           CY                        NC

DF                           DN                       UP