算术运算指令
1. 加法指令
【1】ADD 目标操作数 dest , 源操作数 src
将两个数相加的结果赋值给目标操作数 OPRD1。
注意:由于 ADD 指令是不考虑低位向高位的进位的,因此,ADD指令多用于两个8位二进制数的相加
【2】ADC dest , src
ADC考虑了低位向高位的进位,它执行的操作是:OPRD1 + OPRD2 + CF,并且将结果赋值给目标操作数OPRD1。但是特别注意:使用 ADC 之前记得将 CF 的状态清零(CLC指令)
ADC指令常常用于多字节数的相加
【3】INC OPRD
INC 指令类似于我们 C++ 里面的自增操作,它执行的是 OPRD + 1,并将结果赋给 OPRD。
注意:INC 指令是单操作数指令,它的操作数不能是段寄存器!!,常常用于修改地址指针
2. 减法指令
【1】SUB dest , src
这个 SUB 指令对应于 ADD 指令,也是不考虑低位向高位的借位的。因此它也只适用于两个字节数的减法
【2】考虑借位的SBB
【3】DEC OPRD
对应于 INC ,这里完成的是 OPRD 的自减操作。同样,操作数不能是段寄存器!
【4】NEG OPRD
这里 NEG 执行的是用 0 去减操作数:0 - OPRD,结果再赋给OPRD。NEG 指令常常用于求补码
一般,NEG指令执行后会使CF=1,除非OPRD=0,这样 CF 就是0
3. 乘法指令
有分别针对无符号数和有符号数的运算指令,之前是靠我们自己的
乘法指令中,结果的长度是操作数长度的2倍。也就是说如果是两个单字节数相乘,结果就是16位的;如果是两个16位数相乘,结果就是 32 位的。
【1】无符号数指令MUL:MUL OPRD
注意:OPRD不能是立即数
【2】有符号数指令IMUL OPRD
关于对操作数的一些要求和 MUL 一样。IMUL 的执行过程是:
将两个操作数取补码;
做乘法运算
将乘积取补码
4. 除法指令
要求被除数一定是除数的双倍字长
【1】 DIV(无符号数除法)
【2】IDIV(有符号数除法)
比较指令:cmp
CMP OPRD1, OPRD2
这个CMP指令执行的是 :OPRD1 - OPRD2。但是大家注意:仅仅是减而已,CMP 将会把结果丢弃
OPRD1-OPRD2 减完了结果不要,只是为了影响标志位,两个操作数不影响。
CMP 最大的作用是用于比较两个操作数的大小
,但是比大小也分为 无符号数的比较 和 有符号数的比较