汇编——算术运算指令

--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