标志寄存器(flag)

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

其他寄存器时用来存放数据的,整个寄存器具有一个含义。

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

 

8086CPU的flag寄存器的结构

1514131211109876543210
    OFDFIFTFSFZF AF PF CF

 

1、ZF标志

(flag的第六位) 零标志位

它记录相关指令执行后

               结果为0,ZF=1

               结果不为0,ZF=0

例:

mov ax,1

sub  ax,1

指令执行后,结果为0,则ZF=1

mov ax,2

mov ax,1

指令执行后,结果为1,则ZF=0

注意:

在8086CPU的指令集中,有的指令的执行是影响标志寄存器,如:add、sub 等,它们大多数是运算指令(进行逻辑或算数运算)

有的指令的执行对寄存器没有影响,如mov,push,pop等,它们大多是传送指令。

 

2、PF标志

(flag第二位) 奇偶标志位

它记录指令执行后,结果的所有二进制位中1的个数

为偶数 PF=1

为奇数 PF=0

例:

mov al,1

add al,10

执行后,结果为00001011B,其中有3个1(奇数) 则PF=0。

mov al,1

or al,10

执行后,结果为00000011B,其中有2个1(偶数),则PF=1。

 

3、SF标志

(flag第七位) 符号标志位

结果为负,SF=1

结果为正,SF=0

 

有符号数与补码

计算机中通常用补码来表示有符号数。

例:

mov al,10000001B

add al,1

将add指令当无符号数运算,那么add指令相当于计算-127+1为-126(10000010B)

 

CPU在执行add等指令时,就已经包含两种含义,也将得到用同一种信息来记录两种结果。

关键在于程序需要哪种结果

将数据当做无符号数来运算,SF值无意义。

将数据当做有符号数来运算,可以通过SF得知结果的正负。

 

某些指令将影响标志寄存器中多个标志位,这些被影响的标记位比较全面地记录了指令的执行结果,为相关的处理提供了所需的依据。

 

4、CF标志

(flag第零位) 进位标志位

在进行无符号运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。 (进位或借位 CF=1)

mov al,98H

add al,al

执行后 (al)=30H,CF=1

 

5、OF标志

(flag第十一位) 溢出标志位

在进行有符号运算时,如果结果超过了机器所能表示的范围称为溢出。

溢出   OF=1

 

6、adc指令

adc是带进位加法的指令,它利用了CF位记录的进位数

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

功能:

操作对象1=操作对象1+操作对象2+CF

例 

mov ax,2

mov bx,1

sub bx,ax

adc ax,1

执行后,(ax)=4

CF值的含义由adc指令前的指令决定(借位还是进位)

 

7、sbb指令

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

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

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

 

sbb和adc是基于相同思想设计的两种操作指令,sbb在应用思路上与adc类似。

 

8、cmp指令

cmp是比较指令,功能类似于减法指令,但是不保存结果。

cmp指令执行后,将对标志寄存器产生影响。

其他相关指令通过识别这些别影响的标志寄存器位得知比较结果。

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

例:

mov ax,1

cmp ax,ax

比较结果为0

其产生影响:ZF=1,PF=1,SF=0,CF=0,OF=0

具体情况具体分析。

 

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

与cmp配合使用。

根据无符号数的比较结果进行转移的条件转移指令,它们检测ZF、CF值。

根据有符号数的比较结果进行转移的条件转移指令,它们检测ZF、CF和OF值。

一些指令:

指令含义检测的相关标志位
je等于则转移ZF=1
jne不等于则转移ZF=0
jb低于则转移CF=1
jnb不低于则转移CF=0
ja高于则转移CF=0,ZF=0
jna不高于则转移CF=1或ZF=1

 

10、DF标志和串传送指令

(flag第十位) 方向标志位

在串处理指令中,控制每次操作后si,di的增减

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

格式:movsb

功能:(以字节为单位传送)

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

DF=0      (si)=(si)+1

               (di)=(di)+1

DF=1      (si)=(si)-1

               (di)=(di)-1

movsw

功能:(以字为单位传送)

si,di递增(减)2.

 

movsb和movsw一般和rep配合使用,格式如下:

rep movsb

rep作用是根据CX的值,重复执行后面的串地址指令。

 

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

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

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

assume cs:code
data segment
db 'welcome to masm!'
db 16 dup (0)
data ends

code segment
start : mov ax,data
        mov ds,ax
        mov si,0
        mov es,ax
        mov di,16
        mov cx,16

        cld
        rep movsb
        mov ax,4c00h
        int 21h
code ends
end start

 

11、pushf和popf

pushf:将标志寄存器的值压栈

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值