汇编中的乘法指令

来源:互联网 发布:货运接单软件 编辑:程序博客网 时间:2024/05/21 07:01

汇编中的乘法指令分为signed、unsigned指令两种。

 

unsigned:

mulsource//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.imulsource//用法同unsigned 的mul

2.imulsource,destination//这个指令格式能让你指定结果的目的地,但是有一个缺点,如果目标register大小不够,运算结果将被截断

3.imulimmediate,source,destination//destination = immediate * source,immediate 可以是signed

 

测试代码: