汇编——算术运算指令
–Inc 自增1
–Dec 自减1
和 ADD/SUB 区别:ADD AX,1会改动 CF,INC和DEC不会
–Add 加法指令 //直接加,不考虑cf标志位的值
–Adc 带进位的加法 //不仅将两个数相加,还会加上cf标志位的值
低位+低位用add,高位+高位用adc
adc指令在处理多位数加法时能够正确处理进位问题,从而得到正确的结果
–Sub 减法指令 //直接减
–Sbb 带借位的减法 //不仅将两个数相减,还会减去cf标志位的值
比如:AX=01H,BX=02H
SUB AX,BX //AX=0FFFFH,产生借位 CF=1
SBB AX,BX //AX=0FFFF-2 -1=0FFFDH
–Neg 进行数据求补
规则:NEG op //op = operand 操作数
操作数≠0:CF=1
操作数=0:CF=0
例:MOV BL,0x80
NEG BL //8 位 0x80 → -128
–Mul 乘法指令 用于无符号数
–Imul 乘法指令 用于有符号数
例:
有两个8位无符号整数A5H和64H,它们分别表示无符号整数165和100
如果我们使用MUL指令对这两个数进行无符号乘法运算,结果将是4074H,表示无符号整数16500
如果我们使用IMUL指令对这两个数进行有符号乘法运算(假设A5H表示-91,64H表示100),结果将是DC74H,表示有符号整数-9100
除数不能是立即数,溢出直接触发 CPU 异常
//立即数是写死在指令代码里的常数 mov bl,0x80 ; 0x80=立即数
–Div op 无符号数除法指令
16位数除以8位数:
格式:div 除数,比如div cl
除数:由8位的通用寄存器或者内存单元提供
被除数:放在ax中
结果:商存放在al中,余数存放在ah中
32位数除以16位数:
格式:div 除数,比如div cx
除数:由16位的通用寄存器或者内存单元提供
被除数:低16位放在ax中,高16位放在dx中
结果:商存放在ax中,余数存放在dx中
位数 被除数 除数 商 余数
8 位除 AX r/m8 AL AH
16 位除 DX:AX r/m16 AX DX
32 位除 EDX:EAX r/m32 EAX EDX
//r = register(寄存器),m = memory(内存),8=8 位 (1 字节)
r/m8:是【8 位寄存器】或【8 位内存单元】
–Idiv 有符号数除法指令
寄存器分配格式和DIV完全一致,仅按补码有符号数运算
注意:被除数位数是除数两倍,比如 16÷8 必须提前把符号扩展进DX
