标志寄存器
8086CPU中的flag寄存器包括:
CF、PF、ZF、SF、OF、DF。
传送指令不影响标志寄存器
ZF标志寄存器
zf标志寄存器位于flag中的第6为,表示零标志位。(至于flag是什么,暂时不用管)
ZF寄存器的作用
判断指令执行后结果是否为0。
举例
mov ax,1
sub ax,1
该指令执行后结果为0,ZF=1
PF标志寄存器
pf标志寄存器位于flag中的第2位,表示奇偶标志位。
PF寄存器的作用
判断指令执行完之后结果中bit位为1的个数是否为偶数。如果1的个数为偶数,pf=1;如果为奇数,pf=0。
举例
mov al,1
add al,10
执行后结果为00001011B,其中有3个1,pf=0。
SF标志寄存器
sf标志寄存器位于flag中的第7位,表示符号标志位。
SF寄存器的作用
判断指令执行之后结果是否为负。如果为负,sf=1。
SF寄存器的特点
如果我们进行无符号运算,sf寄存器无意义,如果进行有符号运算,sf记录正负。
举例
00000001B 可以看做无符号数1,有符号数+1。
10000001B 可以看做无符号数129,有符号数-127。
无符号加法:
mov al,10000001B
add al,1
结果 al = 10000010B,表示129+1 = 130。
有符号加法:
mov al,10000001B
add al,1
结果 al = 10000010B, sf=1,表示-127+1 = -126。
CF标志寄存器
cf标志寄存器位于flag中的第0位,表示仅为标志位。
CF寄存器的作用
在无符号数运算的时候,它录入了运算结果的最高有效位向更高位进位的进位值,或从更高位的借位值。
CF寄存器的特点
仅在无符号运算时起作用。
举例
进位:
mov al,98h
add al,al
执行后al=30h,cf=1,cf记录了从最高有效位向更高位的进位值。
add al,al
执行后al=60h,cf=0,cf记录了从最高有效位向更高位的进位值。
借位:
mov al,97h
sub al,98h
执行后al=ffh,cf=1,cf记录了向更高位的借位值。
sub al,al
执行后al=0,cf=0,cf记录了向更高位的借位值。
OF标志寄存器
of标志寄存器位于flag中的第11位,表示溢出标志位。
OF寄存器的作用
判断计算后的结果是否溢出。溢出,of=1;不溢出,of=0。
OF寄存器的特点
OF仅在有符号数运算时起作用。
如果因为溢出导致了实际结果为负,那么逻辑上真正的结果必定为正。
如果因为溢出导致了实际结果为正,那么逻辑上真正的结果必定为负。
举例
mov al,0f0h
add al,88h
指令执行后发生了溢出of=1。
mov al,0f0h
add 78h
指令执行后不发生溢出of=0。
标志寄存器在 Debug 中的表示
在寄存器中,标志局存起是按有意义的各个标志位单独表示的。在 Debug 中,我们可以看到:
标志 | 值为1的标记 | 值为0的标记 |
---|---|---|
of | OV | NV |
sf | NG | PL |
zf | ZR | NZ |
pf | PE | PO |
cf | CY | NC |
df | DN | UP |