本文参考了马维华老师的《微机原理与接口技术》这本书
命令格式:
MUL REG/MEM; REG寄存器,MEM存储器
IMUL REG/MEM
MUL和IMUL指令分别用于实现无符号数的乘法运算和有符号数的乘法运算。 它们都只有一个源操作数,可以使用寄存器或存储器,目标操作数隐含在累加器中。
1 ) MUL命令
) a )、在字节乘法的情况下,ALREG8/MEM8,乘积存储于AX中。 ) b )、在字乘法的情况下,AXREG16/MEM16,乘积的高位16比特被存储在DX中,低位16比特被存储在AX中。 ) c ),对于32位乘法的情况,对于EAXREG32/MEM32,乘积的上32位存储在EDX中,而下32位存储在EAX中。 在d )、64位乘法的情况下,RAXREG64/MEM64、乘积的上位64位被存储在RDX中,下位64位被存储在RAX中。 如果乘积的上半部分AH、DX、EDX、RDX )具有结果的有效数字,则CF=OF=1,否则CF=OF=0。 2 ) IMUL命令
除了完成两个有符号数的乘法运算外,IMUL命令与MUL完全相似。
注:乘法指令在乘积中保留两倍于原始操作数的存储空间,因此不会发生溢出。
自己的疑问:第2个操作数寻址方式应该可以是立即寻址方式吧?
回答:不可以,另外一个操作数必须是在寄存器或者内存单元中再次注意:
对于8位乘法,一个数字缺省存储在al中;对于另外一个数字存放在其他8位寄存器中或者字节型内存单元中16位乘法,一个数字缺省存储在ax中,另一个数字存储在其他16位寄存器中或者字型内存单元中中。 因此,乘法指令的另一操作数不应该是随机数。 另一个操作数必须位于寄存器或存储器单元中。 如果想实现bx*10的操作,参考以下方法,用交换命令xchg交换bx和ax的内容,马上把10 mov数到cx寄存器,使用“mul cx”,得到的积为dx:cx,积大于65536
如下所示。
xchg ax,bx
mov cx,10d
mul cx
xchg ax,bx
这也是程序集实现decibin 从输入的十进制转换为二进制并存储在bx中)的代码中的小片段。)