ASM 4位乘4位软件乘法

时间:2019-02-21 08:20:53

标签: assembly avr multiplication

我需要替换ASM操作,因为我的体系结构中没有这样的操作(avrtiny)。

mul X,Y X和Y是4位数字

我想知道替换mul最快的操作是什么?我在Google中发现的是8位* 8位,这并不是真正的最佳选择。

2 个答案:

答案 0 :(得分:2)

您可以使用经典移位并添加乘法算法(假设您的数字是无符号的)。

它基于以下事实:一个4位数字b 3 ,b 2 ,b 1 ,b 0 代表数字 B = 2 3 ×b 3 + 2 2 ×b 2 + 2 1 ×b 1 + b0

并且A×B = 2 3 ×A×b 3 + 2 2 ×A×b 2 + 2 1 ×A×b 1 + A×b0

如果b i ≠1,乘以b i 位将为0,乘以2的幂只是一个移位。

shift-and-add-multiplication
// multiply A X B -> C
C=0
for i in 0..3
  if B & 0x01
     C = C + A
  end if
  A <<=1
  B >>=1
end for

我不了解avr asm,但是代码应该易于翻译。

如果您的数字是带符号的,则更简单的是计算其绝对值的乘积并更改结果的符号为sign(A)⊕sign(B)== 1

还有更复杂的算法,可以直接处理带符号整数并可以减少步数,例如修改后的Booth算法,但是实现起来更加复杂,我不确定收益会很大。

编辑:根据注释,第一个操作数始终为14 = 16-2 = 2 4 -2 1

在这种情况下,最快的是计算

C = (B << 4) - (B << 1)

答案 1 :(得分:0)

查找表无疑是最快的方法,但可能浪费的闪存很少,我宁愿使用简单的总和。

类似这样的东西(不知道你是不是,我假设是16位PC)。

mov  factor2, temp2
rla  temp2
mov  #32, temp
sub  temp2, temp
add  temp, PC
add  factor2, factor1
---copy 15 times last row---