原文地址http://blog.csdn.net/pplsunny/article/details/8126308
标志寄存器flag
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
0 0 0 0 of df if tf sf zf 0 af 0 pf 0 cf
ZF是flag的第6位,零标志位,判断结果是否为0,结果为0,ZF=1
PF是flag的第2位,奇偶标志位,运算结果二进制数中1的个数为偶数,PF=1
SF是flag的第7位,符号标志位,有符号数 运算结果为负数,SF=1
CF是flag的第0位,进位标志位,无符号数 运算结果有进/借位,CF=1
OF是flag的第11位,溢出标志位,有符号数 运算结果溢出,OF=1
DF是flag的第10位,方向标志位,DF=0 每次操作后 si,di递增
DF=1 每次操作后 si,di递减
TF是flag的第8位,TF=1,产生单步中断,引发中断过程
IF是flag的第9位,IF=1,CPU响应中断,引发中断过程
IF=0,不响应可屏蔽中断
add、sub、mul、div 、inc、or、and等运算指令影响flag
mov、push、pop等传送指令对flag没影响
abc 带位加法指令,利用CF位上记录的进位值
abc ax,bx 实现功能(ax)=(ax)+(bx)+CF
sbb 带位减法指令,利用CF位上记录的借位值
sbb ax,bx 实现功能(ax)=(ax)-(bx)-CF
cmp 比较指令,相当于减法指令,不保存结果,只影响flag相关各位
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
如果因为溢出导致了实际结果为负,那么逻辑上真正的结果必然为正
如果因为溢出导致了实际结果为正,那么逻辑上真正的结果必然为负
cmp指令和条件转移指令配合使用
指令 含义 检测的相关标志位
je 等于则转移 zf=1
jne 不等于则转移 zf=0
ja 高于则转移 cf=0且zf=0
jb 低于则转移 cf=1
jna 不高于则转移 cf=1或zf=1
jnb 不低于则转移 cf=0
[…]是闭区间,包括两端点的值
(…)是开区间,不包括两端点的值
DF标志和串传送指令
DF 方向标志位,在串处理指令中,控制每次操作后si、di的增减
df=0 每次操作后si、di递增
df=1 每次操作后si、di递减
movsb:
相当于mov es:[di],byte ptr ds:[si]
如果 df=0 如果 df=1
inc di dec di
inc si dec si
movsw:
相当于mov es:[di],word ptr ds:[si]
如果 df=0 如果 df=1
add si,2 sub si,2
add di,2 sub di,2
movsb或movsw和rep配合使用,格式如下:
rep movsb
相当于
s:movsb
loop s
rep的作用是根据cx的值,重复执行rep后面的串传送指令
cld 将标志寄存器中的DF位置0,(配合movsb,则是正向传送)
std 将标志寄存器中的DF位置1,(配合movsb,则是反向传送)
pushf 标志寄存器的值压栈
popf 标志寄存器的值出栈
标志位在debug中的表示
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=**** ES=**** SS=**** CS=**** IP=0100 NV UP EI PL NZ NA PO NC
flag of df sf zf pf cf
值为1的标记 OV DN NG ZR PE CY
值为0的标记 NV UP PL NZ PO NC
确定补码:
Xh为8位,X∈(80h,ffh),则Xh是(Xh-256)的补码
Xh为16位,X∈(8000h,ffffh),则Xh是(Xh-65535)的补码