一、简介
标志寄存器用来存储相关指令的某些执行结果,这些结果可以为CPU执行相关指令提供行为依据,从而来控制CPU的相关工作方式。
二、各种标志位介绍
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为直接访问标志位提供了一种方法。