算术运算指令是反映CPU运算能力的指令,也是编程时候最常用到的一组指令,包括加减乘除以及相关的辅助指令。
该组指令的操作数可以是8位,16位,32位(80386+),当存储单元是该类指令的操作数的时候,该操作数的寻址方式可以是任何一种存储单元的寻址方式。
1. 加法指令
ADD reg/mem, reg/mem/imm - 加法指令
受影响的标志位:AF CF OF PF SF ZF
功能:把源操作数的值加到目标操作数
INC reg/mem
受影响的标志位:AF、OF、PF、SF和ZF,不影响CF
功能:把操作数的值+1
ADC reg/mem, reg/mem/imm - 带进位加指令(
较少使用
)
受影响的标志位:AF CF OF PF SF ZF
功能:把源操作数和进位标志位CF的值一起加到目的操作数中
XADD reg/mem reg(较少使用)
受影响的标志位:AF CF OF PF SF ZF
功能:先交换两个操作数 然后执行加法运算
以上指令的ADC和XADD在标准VC++编译后的汇编代码中不出现。
2. 减法指令
SUB reg/mem reg/mem/imm
受影响的标志位:AF CF OF PF SF ZF
功能:把源操作数的值减去目的操作数
DEC reg/mem
受影响的标志位:AF、OF、PF、SF和ZF,不影响CF
功能:把操作数的值-1
SBB reg/mem reg/mem/imm
受影响的标志位:AF CF OF PF SF ZF
功能:把源操作数和进位标志位CF的值从目的操作数一起减去
NEG reg/mem
受影响的标志位:AF CF OF PF SF ZF
功能: 操作数 = 0 - 操作数, 改变操作数的正负号。
3. 乘法指令
计算机的乘法指令分为无符号指令和有符号指令两种,他们的区别在于:数值的最高位是做为“数值”参与运算还是做为“符号”参与运算。
乘法指令的被乘数都是做为
隐含操作数,乘数在指令中显示的写出来,CPU会根据乘数是8位,16位,32位来自动选用被乘数:
AL,AX或EAX。指令的功能是把显示操作数和隐含操作数相乘,并把乘积存入AL,AX或EAX中。(现在的80386+一般都是用EAX做为被乘数)
MUL/FMUL reg/mem - 无符号整数/浮点数乘法指令
受影响的标志位:CF和OF
功能:把显示操作数和隐含操作数都做为无符号数相乘。比如MUL 5就是eax = eax * 5
IMUL/FIMUL reg/mem - 有符号整数/浮点数乘法指令
IMUL/FIMUL reg, imm
IMUL/FIMUL reg,mem
功能:把两个操作数做为有符号数相乘。
4. 除法指令
DIV,无符号数的除法指令,和8086一样, 指令给出一个操作数,被除数已默认。如果指令中给出的操作数为32位,那么被除数将是EDX:EAX, 最终的商将存放在EAX, 余数将存放在EDX中。如果指令给出操作数为16位,那么被除数为EAX,最终得到的商放在AX,余数放在EAX的高16位。如果指令中给出的操作数为8 位,那么被除数是16位,最终得到的商将放在AL中,余数放在AH中。
IDIV,有符号数的除法指令,用法和8086相同,不过支持32位操作