第十一章
标志寄存器
作用:
用来存储相关指令的某些执行结果;
用来控制CPU执行相关指令提供行为依据;
用来控制CPU的相关工作方式。
8086CPU的标志寄存器有16位,其中存储信息通常被称为程序状态字(PSW)。flag寄存器是按位起作用的,每一位都有专门的含义,记录特定的信息。
传送指令不影响标志寄存器
flag的1、3、5、12、13、14、15位在8086CPU中没有使用,不具有任何含义。
ZF标志
零标志位:记录相关指令执行后,其结果是否为0。如果结果为零,则ZF=1,结果不为零,ZF=0。
PF标志
奇偶标志位:记录相关指令执行后,其结果的所有bit为中1的个数是否为偶数,如果1的个数为偶数,PF=1,如果为奇数,则PF=0。
SF标志
符号标志位:记录相关指令执行后,其结果是否为负。如果结果为负,sf=1,如果非负,sf=0
检测点11.1
1 1 0
1 1 0
1 1 0
1 1 0
0 0 0
0 1 0
0 1 0
CF标志
进位标志位:进行无符号数运算的时候,记录了运算结果的最高有效位向更高位进位值,或者从更高位的借位值。
OF标志
溢出标志位:记录有符号数运算结果是否发生了溢出,如果溢出,OF=1,没有溢出OF=0。
检测点11.2
0 0 0 1 1
0 0 0 1 1
0 0 1 0 1
0 0 1 0 1
1 1 0 1 1
1 1 0 1 1
1 0 0 0 0
1 0 0 0 0
0 1 1 0 1
adc指令
带进位加法指令,利用了CF位上记录的进位值。
指令格式:adc ax,bx
功能:(ax)= (bx) + CF
sbb指令
带借位减法指令,利用了CF位上记录的借位值。
指令格式:sbb ax,bx
功能:(ax) = (bx)- CF
cmp指令
比较指令:相当于减法指令,但是不保存结果,会对标志寄存器产生影响。
指令格式:cmp ax,ax
功能影响:zf=1,pf=1,sf=0,cf=0,of=0
无符号数:
指令cmp ax,bx 的逻辑含义是比较ax和bx中的值:
zf = 1 → (ax) = (bx)
zf = 0 → (ax) != (bx)
cf = 1 → (ax) < (bx)
cf = 0 → (ax) (bx)
cf = 0 且 zf = 0 → (ax) > (bx)
cf = 1 或 zf = 1 → (ax) ≤ (bx)
有符号数:
检测比较结果的条件转移指令
检测点11.3
(1)
jb s0
ja s0
(2)
jna s0
jnb s0
DF标志和传送指令
方向标志位:在串处理指令中,操控每次操作后si、di的增减。
df = 0:每次操作后si、di递增;
df = 1:每次操作后si、di递减。
串传送指令:
格式:movsb(b->byte)
功能:
(1)((es) x 16+(di)) = ((ds) x 16+(si))
(2)
df = 0:si、di+1;
df = 1:si、di-1。
movsw(w->word):si + 2,di + 2
一般来说,movsb和movsw都和rep配合使用:
rep movsb
功能:
s:movsb
loop s
rep的作用是根据cx的值,重复执行后面的串传送指令,可以循环实现(cx)个字符的传送。
pushf和popf
pushf:将标志寄存器的值压栈;
popf:从栈弹出数据,送入标志寄存器
检测点11.4
ax = 45h