乘法指令
- mul 源操作数
源操作数可以是字节,字或双字,而且可以在存储器或寄存器中不能是立即数
乘积结果以两倍操作数的空间存放
源操作数
字节 ax = al × 源操作数
字 dx:ax = ax × 源操作数
双字 edx = eax × 源操作数
注意:
如果乘积结果高位部分不为零,那么进位标志位CF和溢出标志位OF将置为1
-
imul 源操作数
可以理解为带符号的mul指令。和mul指令类似,不过是有符号数的乘法指令
用法与mul指令相同 -
imul 寄存器,源操作数
源操作数可以在寄存器中,存储器中,或者是立即数
另一个乘数在寄存器中,它也作为目的地址 -
imul 寄存器,源操作数,立即数
第一个操作数-寄存器仅用来存放乘积。
第二个操作数可能在寄存器中或者在存储器中。
第三个操作数为立即数。
第一个操作数和第二个操作数长度相同,都是16位或都是32位。如果乘积和目的寄存器长度一致,那么CF和OF清零,否则置1.
除法指令
- div 源操作数
无符号数除法指令 - idiv 源操作数
有符号数除法指令
源操作数就是除数,除数可以存放在寄存器或存储器中,但不能是立即数。idiv和div使用隐式的被除数(该操作数被除)。
单操作数除法指令
被除数长度默认是源操作数长度的两倍。例如,若源操作数是一个字长,则双字长度的被除数高16位存放在DX寄存器中,低16位存放在AX寄存器中
源操作数(除数) | 第二个操作数(被除数) | 商 | 余数 |
---|---|---|---|
字节 | AX | AL | AH |
字 | DX:AX | AX | DX |
双字 | EDX:EAX | EAX | EDX |
除法指令的两种常见错误
- 除数为零
- 商太大而不能存入单倍长的目的地址中(这时就要用到位数扩展)
位数扩展(cdw,cwd,cdq用于有符号的除法指令)
- 正的被除数高位必须用0扩展,负的被除数高位必须用1扩展
指令 | 含义 |
---|---|
cbw(字节转换为字) | 将AL寄存器中的二进制补码数扩展位AX中的字长 |
cwd(字转换为双字) | 将AX寄存器中的二进制补码数扩展为DX和AX中的双字 |
cdq(将双字转换为四字) | EAX -> EDX:EAX |
cwde(字 to 双字) | AX -> EAX(不和除法指令配套使用) |
movzx 寄存器,源操作数 | 用0来扩展源操作数 |
movsx 寄存器,源操作数 | 复制符号位来扩展源操作数 |
说明:
- movzx和movsx指令源操作数可以存放在寄存器或存储器,源操作数可以是8位,16位,目的地址寄存器可以是16位或32位
网友评论