我需要使用加法和移位将两个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位数字。
答案 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: