8086CPU
的flag寄存器的结构
]
空白的位没有意义,保留不用
有些指令的执行对标志位没有影响,例如mov
,push
,pop
等等,他们大多数为传送指令
标志位介绍
ZF
:理解成是否为零
运算结果为0标志位为1
运算结果不为0标志位为0
PF
:奇偶标志位,理解成结果是否有偶数个1
运算的结果中,如果有奇数个1,PF则为0
运算结果过中,如果有偶数个1,PF为1
SF
:符号标志位,理解成结果是不是为负
结果过为负,SF=1
结果不为负数,SF=0
计算机以补码的形式进行计算操作,这种形式的计算实际上已经包含了两种意义。整个运算如果看成是有符号数,那么结果就是运算后有符号数的补码,标志位SF将会指示着运算结果的正负,如果看成是无符号数,那么结果一定就是运算后的无符号数,此时,SF是没有任何意义的
CF
:进位标志位
在无符号运算中,有可能产生最高有效位向更高有效位的进位。
减法操作也有可能出现借位情况,同样会表现在标志位的变换
OF
:溢出标志位
在有符号数的情况下,如果发生溢出,这个标志位将会被设置为1
通常会配合SF符号位的使用
DF
:方向标志位
在串处理指令中,控制每次操作后si,di的增减
DF=0,每次操作后si递增,di递减
DF=1,每次操作后si,di递减
adc的指令
带进位加法指令
在进行加法运算的同时还会加上上次产生的进位
例如:
add al,bl
adc ah,bh
先计算低位的和
再利adc
指令用计算高位加上的和上一次计算产生的进位
运用此方式可以计算任意位数的加法
sbb指令
带借位的减法指令
和adc
指令的原理类似,这个指令在使用的时候会自动减去上次计算产生的借位
cmp指令
cmp
指令的功能相当于减法指令,但是这条指令不会保存计算结果,只会影响标志位寄存器的值
对于无符号数 :
cmp ax,bx
ZF=1
:(ax)=(bx)
ZF=0
:(ax)!=(bx)
CF=1
:(ax)<(bx)
CF
:(ax)>=(bx)
CF=0&&ZF=0
:(ax)>(bx)
CF=1或ZF=1
:(ax)<=(bx)
对于有符号数来说:
cmp ah,bh
是否相等:
观察ZF
寄存器
大小关系:
要要考虑是否溢出,需要同时观察OF
和SF
:
检测比较结果的条件转移指令
]
movsb
指令:
功能:以字节为单位传送,将ds:si
指向的内存单元的字节送入es:di
中,然后自动将si和di
+1
(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
movsb和movsw
只是字符传送的一个步骤
通常和rep一起使用,也就是rep movsb
rep作用是根据cx
的值执行后面的串传送指令
设置DF
cld
:设置DF
为0
std
:设置DS
为1
复制操作步骤:
设置ds
设置es
初始化si
初始化di
设置cx,cx用于指定串长
使用cld/std,设置DF,用于指定复制的方向,
使用``rep movsb
执行复制`
PUSHF和POPF
将标志位寄存器的值压入栈中