将两个带有加法和移位的32位SIGNED数字相乘

时间:2013-11-01 23:47:19

标签: assembly bit-shift multiplication addition

我需要使用加法和移位将两个32位SIGNED数相乘,并将64位数存储在内存位置$0408-$040F中。这两个数字存储在8位存储器中。

 movb #$1F, $0400 ; the first number is $1F230001
 movb #$23, $0401
 movb #$00, $0402
 movb #$01, $0403
 movb #$F8, $0404 ; the second number is $F8012346
 movb #$01, $0405
 movb #$23, $0406
 movb #$46, $0407

我知道如何通过加法和移位将两个8位数相乘,但我不知道如何继续使用其他数字。我使用了16位累加器-D(累加器-A 8位MSB,累加器-B 8位LSB)。

我正在使用CPU12:Reference Manual

你能帮助我,指导我或告诉我怎么做吗?谢谢,我花了很多时间在这上面,但我不知道如何使用32位数字。

1 个答案:

答案 0 :(得分:3)

将数字重写为8位数字(base = 256)并以代数方式求解乘法:

 (a0+(a1<<8)+(a2<<16)+(a3<<24))
*(b0+(b1<<8)+(b2<<16)+(b3<<24))
------------------------------------
=(a0·b0                        )<< 0
+(a0·b1 + a1·b0                )<< 8
+(a0·b2 + a1·b1 + a2·b0        )<<16
+(a0·b3 + a1·b2 + a2·b1 + a3·b0)<<24
+(        a1·b3 + a2·b2 + a3·b1)<<32
+(                a2·b3 + a3·b2)<<40
+(                        a3·b3)<<48

现在只有8-bit * 8-bit乘法和8/16位移位/加法。不要忘记继续使用更高的数字(如add,adc,adc,...)。

希望我没有犯错误

<强> PS。

如果你有16位乘法可以用base 65536重写所有进程,而且也可以使用Karatsuba算法进行乘法以获得一些加速,但是在这种情况下要小心使用它需要更多位。

此外,我会对非签名号码执行此操作,稍后在

添加符号评估

这里有一些与我相关的QAs: