8086汇编div和mul不是很理解
8086汇编里面的div和mul不是很理解
同道啊 我也记不住 可以现查嘛
无符号数乘法指令MUL(Unsigned Multiply Instruction)
指令的格式:MUL Reg/Mem
受影响的标志位:CF和OF(AF、PF、SF和ZF无定义)
指令的功能是把显式操作数和隐含操作数(都作为无符号数)相乘,所得的乘积按表5.2的对应关系存放。
表5.2 乘法指令中乘数、被乘数和乘积的对应关系
乘数位数 隐含的被乘数 乘积的存放位置 举例
8位 AL AX MUL BL
16位 AX DX-AX MUL BX
32位 EAX EDX-EAX MUL ECX
、有符号数乘法指令IMUL(Signed Integer Multiply Instruction)
指令的格式: IMUL Reg/Mem
IMUL Reg, Imm ;80286+
IMUL Reg, Reg, Imm ;80286+
IMUL Reg, Reg/Mem ;80386+
受影响的标志位:CF和OF(AF、PF、SF和ZF无定义)
1)、指令格式1——该指令的功能是把显式操作数和隐含操作数相乘,所得的乘积按表5.2的对应关系存放。
2)、指令格式2——其寄存器必须是16位/32位通用寄存器,其计算方式为:
Reg ← Reg × Imm
3)、指令格式3——其寄存器只能是16位通用寄存器,其计算方式为:
Reg1 ← Reg2×Imm 或 Reg1 ← Mem×Imm
4)、指令格式4——其寄存器必须是16位/32位通用寄存器,其计算方式为:
Reg1 ← Reg1×Reg2 或 Reg1 ← Reg1×Mem
在指令格式2~4中,各操作数的位数要一致。如果乘积超过目标寄存器所能存储的范围,则系统将置溢出标志OF为1。
下面是学习和掌握乘法类指令的控件,可模拟执行MUL和IMUL等指令。
4、除法指令
除法指令的被除数是隐含操作数,除数在指令中显式地写出来。CPU会根据除数是8位、16位,还是32位,来自动选用被除数AX、DX-AX,还是EDX-EAX。
除法指令功能是用显式操作数去除隐含操作数,可得到商和余数。当除数为0,或商超出数据类型所能表示的范围时,系统会自动产生0号中断。
、无符号数除法指令DIV(Unsigned Divide Instruction)
指令的格式:DIV Reg/Mem
指令的功能是用显式操作数去除隐含操作数(都作为无符号数),所得商和余数按表5.3的对应关系存放。指令对标志位的影响无定义。
、有符号数除法指令IDIV(Signed Integer Divide Instruction)
指令的格式:IDIV Reg/Mem
受影响的标志位:AF、CF、OF、PF、SF和ZF
指令的功能是用显式操作数去除隐含操作数(都作为有符号数),所得商和余数的对应关系见表5.3。
表5.3 除法指令除数、被除数、商和余数的对应关系
除数位数 隐含的被除数 商 余数 举例
8位 AX AL AH DIV BH
16位 DX-AX AX DX DIV BX
32位 EDX-EAX EAX EDX DIV ECX
乘法比较慢 3-12个时钟周期 在还是在目前的core架构上 以前可能更慢罢
除法一贯很慢 以前要大约100个时钟周期 现在是大约50个
上面说的都是整数的 浮点的除法比较快
所以 记不住除法没关系 用的少 乘法嘛 如果是386以上用哪个imul的形式比较好
8086比较悲剧了 不过能查总是好的