第十一章 标志寄存器
标志寄存器
1)用来存储相关指令的某些执行结果
2)用来为cpu执行的相关指令提供行为依据
3)用来控制cpu的相关工作方式
标志寄存器flag存储程序状态字(PSW)
8086点flag寄存器各位有不同的含义
CF,PF,AF,ZF,SF,TF,IF,DF,OF
11.1 ZF标志
flag的第六位是ZF,0标志位。记录相关指令执行后,其结果是否为0.如果为0则ZF = 1
例如
mov ax, 1
sub ax, 1
执行以后结果为0 zf = 1
mov ax, 2
sub ax, 1
执行后结果不为0,zf = 0
有些指令会影响zf的比如add, sub, mil, div, inc, or, and等运算指令
mov, push, pop对ZF没有影响不会修改其值,保留原值
11.2 PF标志
奇偶标志位,表示进行相关运算以后,其结果所含的bit为重1的个数是否为偶数,
如果1的个数为偶数则PF=1,如果为奇数,则PF=0
mov al, 1
add al, 10
执行结果为00001011B 含有奇数个1 PF = 0
mov al, 1
or al, 2
执行结果为00000011B 含有偶数个1 则PF = 1
11.3 SF标志
表明相关指令执行后,结果是否为负。如果为负sf=1,如果非负,sf=0
有些指令会影响flag的多个标记为
例如sub al, al
ZF, PF, SF都要收到影响 分别是 1, 1, 0
11.4 CF标志
进行无符号运算的时候,最高位是否进位,或者从更高位借位。
mov al, 98h
add al, all 执行后 al=30h, cf=1,cf记录了从最高有效位向更高位的进位值。
add al, al 执行后 al = 60h, cf = 0
当两个数执行减法的时候,有可能向更高位借位。比如,两个8位数据:97h - 98h CF也记录了这个借位值。
mov al, 97h
sub al, 98h ; 执行后al = ffh, CF = 1 ,CF记录了向更高位借位值
sub al, al ;执行后al=0, cf=0
11.5 OF标志
记录了有符号运算的结果是否发生了溢出。如果发生了溢出则OF=1 如果没有OF = 0
CF是对无符号数有意义的标志位,而OF是对有符号数有意义的标志位(判断两个操作数的符号,和结果的符号。如果两个操作数符号不同则OF必位0.如果结果的符号和两个操作数的符号不同则结果必为1)
SF记录结果的符号
11.6 adc指令
带进位的加法指令,利用了CF位上记录的进位值(可以扩展成32位,64位加法使用)
指令格式 adc 操作对象1, 操作对象2
功能: 操作对象1 = 操作对象1 + 操作对象2 + CF
比如 adc ax, bx (ax) = (ax) + (bx) + CF
例
mov ax, 2
mov bx, 1
sub bx, ax ; bx = 0ffh, cf = 1
add ax, 1 ; ax = 2 + 1 + 1(CF) = 4
mov ax, 1
add ax, ax ; ax = 2, cf = 0
add ax, 3 ; ax = 5 ,cf = 0
mov al, 98H
add al, al ; al = 30h, cf = 1, of = 1
add al, 3 ; al = 30h+3+1 = 34h
以下指令具有和add ax, bx相同的效果
add al, bl
add ah, bh
例如计算 1ef000h + 201000h 结果放在ax(高16bit)和bx(低16bit)中
mov ax, 001eh
mov bx, 0f000h
add bx, 1000h
adc ax, 0020h
adc也可能产生进位CF
计算 1E F000 1000 H + 20 10000 1EF0H 结果放在ax(最高16), bx(次高16), cx(低16位)
mov ax, 001eh
mov bx, 0f000h
mov cx, 1000h
add cx, 1ef0