3

我需要使用加法和移位将两个 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:参考手册

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

4

1 回答 1

3

将数字重写为 8 位数字(基数 = 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 位乘法,可以用基数重写所有进程,65536也可以使用 Karatsuba 算法进行乘法以加快速度,但要小心进位,在这种情况下它需要更多位。

我也会对非签名数字执行此操作,并稍后添加符号评估

这是我的一些相关的质量保证:

于 2013-11-05T00:14:12.093 回答