11.6 adc指令
adc 代位加法指令,利用了CF记录的进位值
adc ax,bx->(ax)+(bx)+CF
mov ax,
mov bx,1
sub bx,ax
adc ax,1
结果ax=4
11.7 sbb指令
abb是带借位减法指令
abb ax,bx ->(ax)=(ax)-(bx)-CF
类似于adc指令
11.8 cmp指令
cmp是比较指令,相当于减法,只是不保存结果,执行结束后将对标志寄存器产生影响。其他指令通过标志寄存器得知比较结果。
cmp 操作对象1,操作对象2
功能:对1-对2
对于无符号
对于有符号
以下图片来自王爽老师汇编语言第四版:
11.9检测比较结果的条件转移指令
“转移"指的是他能够修改IP
条件指的是它可以根据某种条件决定是否修改IP
jcxz就是一种条件转移指令
所有条件转移指令转移的范围都是[-128,127]
大多数转移指令都检测标志寄存器的相关标志位,他们通常和cmp结合使用,好比call
和ret一样的关系
一下图片来自王爽老师汇编语言第四版若有侵权联系删除
助记:
有符号的话只是检测结果不同而已,实际上含义是不变的。
在写这类判断代码的时候往往用反向思维比较便捷
另外,判断转移指指令仅仅只是对标志寄存器相应位进行判断。如果通过其他指令改变寄存器也可以达到指令的转移。
11.10 DF标志寄和串传送指令
flag的第十位,DF,方向标志位。在串处理指令中,控制每次操作后的si,di的增减
df=0 每次操作后si,di递增
df=1 每次操作后si,di递减
串传送指令:movsb
相当于mov es:[di],byte ptr ds:[si]//cpu不支持哈只是一种描述
其实就是将ds:[si]中的数据传送到es:[di]中
然后:
根据DF中的值
0+ 1-
inc di/dec di
inc si/dic si
还可以进行字的传送
命令如下
movsw
它的功能是将ds:[si]中的字数据传送到es:[di]中
如果df=0
然后add si,2
add di,2
如果df=1
sub si,2
sub di,2
movsb/movsw通常和rep结合使用,格式如下
rep movsb
rep movsw
用汇编相当于
mov cx,(要传送的次数)
s:movsb/w
loop s
那么我们应该怎样决定它是向前传送还是向后传送呢?
伟大的CPU制作者给我们发明了两个指令:
cld指令:令df=0,也就是说执行完命令后让si和di加
std指令:令df=1,也就是说执行完命令后让si和di减
11.11 pushf和popf
这俩指令的操作是让flag标志寄存器中的值入栈和出栈
11.12标志寄存器在debug中的位置
dosbox中标志寄存器中位置以及含义 | ||||||||||||
标志 | OF(溢出标志位) | DF(方向标志位) | SF(符号标志为) | ZF(零标志位) | PF(奇偶标志位) | CF(进位标志位) | ||||||
值为1(真) | OV(over flow 溢出) | DN(down减) | NG(negative 复数) | ZR(zero 零) | PE(plus 加起来 even 偶数) | CY (carry yes 有进位) | ||||||
值为0(假) | NV(not over 没有溢出) | UP(up加) | PL(plus 正数) | NZ(not zero 非零) | PO(plus 加起来 odd 奇数) | NC(not varry 没有进位) |