我需要使用加法和移位将两个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位数字。
将数字重写为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
乘法和qazxswpoi位移/添加。不要忘记继续更高的数字(如8/16
)。
希望我没有犯错
PS。
如果你有16位乘法可以用基本add,adc,adc,...
重写所有进程而不是也可以使用Karatsuba算法乘以一些加速但是在这种情况下要小心携带它需要更多的位。
此外,我会在非签名数字上执行此操作,稍后再添加符号评估
我的一些相关QA:
65536
为karatsuba和其他方法