一步步学汇编(十)标志寄存器
标志寄存器的作用:
(1) 用来存储相关指令的某些执行结果
(2) 用来为CPU执行相关指令提供行为依据
(3) 用来控制CPU的相关工作方式
flag的1,3,5,12,13,14,15位在8086CPU中是不起作用的
ZF,第6位,记录相关指令执行结果,为0则ZF=1,否则,ZF=0
PF,第2位,奇偶标志位,记录指令执行结果所有二进制位中1的个数是否为
偶数,是偶数,则PF=1,为奇数,PF=0
SF,第7位,符号标志位。指令执行结果为负,SF=1,非负,SF=0
CF:第0位,进位标志位,在进行无符号数运算的时候,记录运算结果的最高有效会向更
高位的进位或借位
溢出:在进行有符号数的运算的时候,如果超过了机器所能表示的范围,称为
溢出
OF:溢出标志位,记录了有符号数运算的结果是否发生了溢出,如果溢出,
OF=1,如果没有,OF=0
DF:第10位,方向标志位 DF=0 每次操作后si,di递增;DF=1 每次操作后si,di递减
adc:带进位加法指令
adc ax,bx 功能:(ax)=(ax)+(bx)+CF
adc 的作用主要是大数据的加法
sbb:带借位减法指令
sbb ax,bx 功能:(ax)=(ax)-(bx)-CF
cmp:比较指令 功能相当于减法指令,但不保存操作结果,只根据结果对
标志寄存器相关位进行设置
(1)如果SF=1,而OF=0
逻辑上真正结果的正负=实际结果的正负;
因SF=1,实际结果为负,所以 操作数1 < 操作数2
(2)如果SF=1,而OF=1
因溢出导致实际结果为负,所以 操作数1 > 操作数2
......总而言之,OF为零,则逻辑结果与实际结果相同,OF为1,逻辑结果
与实际结果相反
movsb: 串传送指令(以byte为单位):
功能:(1)((es)*16+(di))=((ds)*16+(si))
(2)如果DF=0 则:(si)=(si)+1
(di)=(di)+1
如果DF=1 则:(si)=(si)-1
(di)=(di)-1
movsw:串传送指令(以word为单位):
功能与上面一个类似
rep movsb(rep movsw):根据cx的值,重复执行后面的串传送指令
cld:设置DF=0,正向传送
pushf:将标志寄存器的值压入栈
popf:从栈中弹出数据,送入标志寄存器