如何使用x86汇编语言将两个64位数字相乘?

时间:2020-03-05 19:00:05  来源:igfitidea点击:

我该怎么办...

  • 两个64位数字相乘
  • 将两个16位十六进制数相乘

...使用汇编语言。

我只允许使用寄存器%eax,%ebx,%ecx,%edx和堆栈。

编辑:哦,我在x86上使用ATT语法
EDIT2:不允许反编译为程序集...

解决方案

回答

我们可能要指定使用的程序集。通用技术可以交叉应用(通常),但是助记符在平台之间几乎总是不同的。 :-)

回答

这取决于我们使用哪种语言。从我从学习MIPS汇编中学到的内容来看,有一个从高位移动命令和从低位移动命令,或者是mflo和mfhi。 mfhi存储总数的高64位,而mflo存储总数的低64位。

回答

使用课程教科书,即兰德尔·海德(Randall Hyde)的"汇编语言的艺术"。

参见4.2.4扩展精度乘法

Although an 8x8, 16x16, or 32x32 multiply is usually sufficient, there are times when you may want to multiply larger values together. You will use the x86 single operand MUL and IMUL instructions for extended precision multiplication ..
  
  Probably the most important thing to remember when performing an extended precision multiplication is that you must also perform a multiple precision addition at the same time. Adding up all the partial products requires several additions that will produce the result. The following listing demonstrates the proper way to multiply two 64 bit values on a 32 bit processor ..

(有关完整的装配清单和插图,请参见链接。)

回答

啊,大会,因为我已经使用了一段时间。因此,我假设这里的真正问题是我们正在使用的微控制器(无论如何我还是用汇编语言编写代码)都没有64位寄存器?如果是这样,我们将需要分开处理正在使用的数字,并对该部分进行多次乘法。

这听起来像是措辞方式中的一项家庭作业,所以我不会再详细说明了:P

回答

由于我们使用的是x86,因此需要4个考虑指令。将64位量分成两个32位字,并将低位字乘以结果的最低和第二低字,然后分别使用不同编号的低和高字对(它们分别进入结果的第二和第三低字)和最终将两个高位词转换为结果的2个最高位词。将它们加在一起不要忘记处理进位。我们没有指定输入和输出的内存布局,因此无法编写示例代码。

回答

只需执行普通的长乘法,就好像我们要对一对2位数字相乘,只是每个"数字"实际上是32位整数。如果我们要在地址X和Y上将两个数字相乘并将结果存储在Z中,那么我们想要做的(用伪代码)是:

Z[0..3] = X[0..3] * Y[0..3]
Z[4..7] = X[0..3] * Y[4..7] + X[4..7] * Y[0..3]

请注意,我们将丢弃结果的高64位(因为64位数字乘以64位数字就是128位数字)。另请注意,这是假设为小端的。另外,请注意有符号乘法和无符号乘法。

回答

查找一个支持64位的C编译器(GCC执行IIRC),编译仅执行此操作的程序,然后进行反汇编。 GCC可以自己将其吐出,并且可以使用正确的工具将其从目标文件中删除。

OTOH他们是x86上的32bX32b = 64b op

a:b * c:d = e:f
// goes to
e:f = b*d;
x:y = a*d;  e += x;
x:y = b*c;  e += x;

一切都溢出

(未试)

仅编辑未签名

回答

我打赌你是一个学生,所以看看你能不能做这个工作:逐字逐句地做,并使用移位。想想最有效的解决方案。当心标志位。