标志寄存器
debug查看标志寄存器位置:
右下角: NV UP EI PL NZ NA PO NC
溢出标志OF(Over flow flag) OV(1) NV(0)
方向标志DF(Direction flag) DN(1) UP(0)
中断标志IF(Interrupt flag) EI(1) DI(0)
陷阱标志位 TF: (是否单步调试 , 1表示是)
符号标志SF(Sign flag) NG(1,负号) PL(0,正号)
零标志ZF(Zero flag) ZR(1) NZ(0)
辅助标志AF(Auxiliary carry flag) AC(1) NA(0)
奇偶标志PF(Parity flag) PE(1) PO(0)
进位标志CF(Carry flag) CY(1) NC(0)
adc指令
- 指令格式:adc 操作对象1, 操作对象2
- 功能:操作对象1=操作对象1+操作对象2+CF
- adc和add相配合就可以对更大的数据进行加法运算
对于有进位的操作,虽然两个inc si和add si 2 对si的结果一样,但是add会影响进位。如下,如果把两个inc si替换掉,就会因为进位标识符被重置导致结果不正确。
sbb指令
- 指令格式:sbb 操作对象1, 操作对象2
- 功能:操作对象1=操作对象1-操作对象2-CF
- sbb 和sub相配合就可以对更大的数据进行减法运算
- 例如
- 1000H-2000H = F000H 相当于跟上一位借了1,此时进制位也会置CY
cmp指令
-
cmp设计思路:通过减法运算,影响标志寄存器。标志寄存器相关位记录了比较的结果
-
对于有符号数,ah = FFH,代表ah = -1,因为超过127的都认为是负数,是补码
-
对于有符号数的cmp比较,处理比较符号位,还需要比较溢出位
-
-
-
总结,溢出导致结果相反
检测比较结果的条件转移指令,利用cmp指令的结果,进行工作的指令
- 根据无符号数比较结果进行转移的条件转移指令,检测ZF(0标志位)和CF(进位标志位)。
- 根据有符号数比较结果进行转移的条件转移指令,检测ZF,CF和OF(溢出标志位)的值。
- je等这些指令不关心前边是什么指令,只关心相应的标志位
je、jne、jb、jnb、ja、jna
各个字母的含义,j表示jump
DF标识和串传送指令
- DF = 0 :每次操作后si,di递增
- DF = 1 :每次操作后si,di递减
movsb和movsw:将ds:si指向的内存单元中的字节(movsb)或字(movsw)送入es:di中,然后根据标志寄存器DF位的值,将si和di递增或递减。
- movsb递增1
- movsw递增2
rep指令。movsb经常和rep指令配合,rep的作用是根据cx的值重复执行后边的串传送指令。
- 所以rep movsb可以实现循环传送cx个字符
改变DF的值
- cld指令,将标志寄存器的DF置0
- std指令:将标志寄存器的DF置1