两个32位有符号数相乘,汇编实现。

两个32位有符号数相乘,汇编语言实现,请高手给个思路及注意事项.
寄存器16位,关键是数是有符号。

你用来保存32位有符号数必须是四个8位的寄存器,也就是说比如第一个数用了寄存器A,B,C和D,第二个数用E,F,G和H。你的结果肯定需要8个8位寄存器,比如说是Z1,Z2,Z3,...Z8.你肯定没有这么多寄存器,你可以把结果直接放到内存。
首先判断两个符号的正负,32位的最高位与一下就好了,你可以把A和E做一个与操作,然后把结果,就是最高位直接赋给结果。
第二,把A和E的最高位变成0,也就是接下来做两个31位无符号数的乘法。
最简单的办法是就像竖式算乘法一样:
A B C D
E F G H
×_______
(ABCD)*H
(ABCD)*G
(ABCD)*F
(ABCD)*E
+________
Z1....Z8
就像小学学乘法的时候一样,乘完了记得移位然后相加。中间步骤都可以先写到结果里面。
比如(ABCD)*H
可以先把D*H,得到的结果肯定保存在DH和DL,那么DL肯定是最低8位的结果,把DH拿出来暂存在另外一个寄存器里面,然后计算C*H,结果一定还是在DH和DL里面,把刚才暂存的结果和DH相加,就是(ABCD)*H的第低15-8位的结果,依次类推。
这个算法比较慢,如果有时间建议看看Karatsuba乘法,是一个俄国人写的,速度提升25%。如果只为了写作业,32位乘法,这个就行了。
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-03-26
IMUL r32,r/m32,imm32

参考资料:奔腾指令集

相似回答