标志寄存器

一、简介

标志寄存器用来存储相关指令的某些执行结果,这些结果可以为CPU执行相关指令提供行为依据,从而来控制CPU的相关工作方式。

7b9368fb16a38a0a7e53cacffc9d5937.png

二、各种标志位介绍

1. ZF零标志位

功能:用来记录相关指令执行后,其结果是否为0。

  • 结果为0时,ZF=1;
  • 结果非0时,ZF=0。
mov ax,1
sub ax,1  ;ax中值为0。ZF标志位置为1

mov ax,2
sub ax,1  ;ax中值为1。ZF标志位置为0

2. PF奇偶标志位

功能:记录结果中的1的个数是否为偶数。

  • 结果中1的个数为奇,PF=0;
  • 结果中1的个数为偶,PF=1
mov al,1
add al,10
;结果为:00001011(3个1)
;所以PF=0
    
mov al,1
or al,2
;结果为:00000011(2个1)
;所以PF=1

3. SF符号标志位

功能:记录结果是否为负。是CPU对有符号数运算结果的一种记录。

  • 结果为负:SF=1
  • 结果非负:SF=0
mov al,10000001B
add al,1
;结果为:10000010B  SF = 1

4. CF进位标志位

功能:进行无符号运算的时候,记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。

mov al,98H
add al,al
;结果为:ax=00000130h  al=30h  CF=1

两个数做减法的时候,可能借位:

mov al,97H
sub al,98H  ;al=FFH  CF=1
sub al,al   ;al=0    CF=0

4.1. adc指令

adc是带进位的加法指令,它利用的CF标志位上的进位值。
如:
adc ax,bx
则:ax=ax+bx+CF。

mov ax,2
mov bx,1
sub bx,ax
adc ax,1    ;ax=2+1+CF=2+1+1=4

;;;;;;;;;;;;;;;;;
mov ax,1
add ax,ax
adc ax,3    ;ax=2+3+0=5

4.2. sbb指令

带借位的减法指令,利用了CF标志位上记录的借位值。
sbb ax,bx
则:ax=ax-bx-CF


5. OF溢出标志位

功能:记录有符号数运算结果是否发生溢出。

  • 发生溢出,OF=1;
  • 未发生溢出,OF=0。
mov al,98
add al,99
;结果为:al=98+99=197  (-128 - 127)
OF和CF的区别:

CF是对无符号数运算有意义的标志位。
OF是对有符号数运算有意义的标志位。


6. DF方向标志位

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

  • DF=0,每次操作后,si、di递增;
  • DF=1,每次操作后,si、di递减。

cld指令:将df置0。
std指令:将df置1。


6.1.movsb指令

si和di递增1或递减1。

es*16+di = ds*16+si
df=0: si=si+1   inc si
      di=di+1   inc di
df=1: si=si-1   dec si
      di=di-1   dec di

6.2.movsw指令

si和di递增2或递减2。
movsb和movsw和rep配合。

rep movsb         rep movsw
(1)s:movsb          s: movsw
     loop s            loop s

7.pushf和popf指令

pushf:将标志位全部压栈。
popf: 将标志位全部弹出栈。

pushf和popf为直接访问标志位提供了一种方法。

转载于:https://www.cnblogs.com/coolcpp/p/flag-register.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值