汇编中的乘法指令分为signed、unsigned指令两种。
unsigned:
mul source //the source can be a 8、16、32-bits unsigned register or memory value
你可能在想,只有一个数怎么进行乘法运算呢,其实还有一个乘数已经隐含的放在eax中,其中根据mul指令后缀b、w、l大小放入al,ax,eax中。
由于乘法运算后产生的数比其中任何一个都大,所以一般用2倍于source位长的空间存放计算结果。
例如:
1.如果source是8-bits那么,运算结果将放在ax中,ax是16-bits。
2.如果source是16-bits,那么整个eax将被使用?错!为了与以前的处理器兼容,dx:ax的register pair将被使用,dx存储高字节的16-bits,ax存储低字节的16-bits,两个register大小加起来刚好32-bits。
3.如果source是32-bits,那将怎样存储运算结果呢,依旧使用eax么,可是eax只有32-bits啊,不够存储整个运算结果……
这时候一个64-bits的edx:eax的register pair将被使用,其中edx存储计算结果的高字节的32-bits,eax存储低字节的32-bits。
注意,如果在32-bits乘法指令运算之前,你如果有数据保存在edx中,请提前保存好,一进行32-bits mul指令,你的edx中数据就没了……
测试代码:
signed:
1.imul source //用法同unsigned 的mul
2.imul source,destination //这个指令格式能让你指定结果的目的地,但是有一个缺点,如果目标register大小不 够,运算结果将被截断
3.imul immediate,source,destination //destination = immediate * source,immediate 可以是signed
测试代码: