第11章(标志寄存器):
标志寄存器都是16位
flag:按位起作用(其他寄存器是整个起作用)
1,3,5,12,13,14,15为保留位,不具有意义 debug中的对应
零位标志位ZF:(6)上一次指令执行后结果为0则为1 (0)NZ (1) ZR
奇偶标志位PF:(2)二进制1的个数为偶数为1,为奇数为0 PO PE
符号标志位SF:(7)结果为负为1,为正为0(对于有符号数) PL NG
进位标志位CF:(0)无符号运算时记录进位和借位(都为1) NC CY
溢出标志位OF(11)有符号数运算时的进位和错位(只要最高位改变) NV
方向标志位DF(10)控制每次操作后si,di的递增递减
CF的运用:置0方法:sub ax,ax
inc,loop不影响CF add会影响,所以使用inc改变数值而不是add
adc:adc ax,bx==>(ax)=(ax)+(bx)+CF(先算低位后高位)
带进位的加法指令:利用CF位,把上一次的进位加到本次,adc也会影响CF,可以达到任意位相加
sbb:sbb ax,bx==>(ax)-(bx)-CF(先算高位后低位)
cmp:功能相当于减法,但不保存值,只作为判断依据(操作寄存器不变化,只影响flag寄存器中标志)
考虑结果正负需要考虑SF和OF
检测比较结果的条件转移
1.无符号考虑ZF,CF 有符号考虑SF,OF,ZF
(以下指令都是无符号,且都是根据flag寄存器判断,也就是不配合cmp也可以用)
je:等于则转移 ZF
jne:不等于则转移
jb:低于则转移 CF
jnb:不低于则转移
ja:高于则转移 CF和ZF
jna:不高于则转移
DF的运用:
串传宗指令:movsb(以字节为单位传送)movsw(以字为单位)
将ds:si中的字节送入es:di中并对1si,di递增(DF=0)或递减(DF=1)
配合rep(根据cx值执行多次串传送指令)使用
DF设置指令:cld(设为0),std(设为1)
pushf:将标志寄存器结果入栈
popf:将出栈结果传入标志寄存器
另:1.mov,push,pop等传送指令不改变标志位
问题总结:1.10H这种代表十进制,对应1的个数为16
实际操作的问题:
1.call调用子程序用结束程序隔开,je等跳转用jmp隔开
2.cmp也要注意操作对象位数相同
3.注意混合使用跳转命令提高效率
网友评论