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

问题描述 投票:3回答:1

我需要使用加法和移位将两个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 8bits MSB,累加器-B 8bits LSB)。

我正在使用CPU12:Reference Manual

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

assembly bit-shift multiplication addition
1个回答
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乘法和qa​​zxswpoi位移/添加。不要忘记继续更高的数字(如8/16)。

希望我没有犯错

PS。

如果你有16位乘法可以用基本add,adc,adc,...重写所有进程而不是也可以使用Karatsuba算法乘以一些加速但是在这种情况下要小心携带它需要更多的位。

此外,我会在非签名数字上执行此操作,稍后再添加符号评估

我的一些相关QA:

© www.soinside.com 2019 - 2024. All rights reserved.