Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly ASM 4位乘4位软件乘法_Assembly_Avr_Multiplication - Fatal编程技术网

Assembly ASM 4位乘4位软件乘法

Assembly ASM 4位乘4位软件乘法,assembly,avr,multiplication,Assembly,Avr,Multiplication,我需要替换ASM操作,因为在我的体系结构(avrtiny)中没有这样的操作 mul X,Y 其中X和Y是一个4位数字 我想知道更换mul的最快操作是什么?我在谷歌找到的是8比特*8比特,这并不是最理想的。查找表肯定是最快的方法,但可能你没有多少闪存可浪费,我宁愿用一个简单的总和 类似这样的东西(不知道你是谁,我假设是16位pc机) 您可以使用经典的移位和加法乘法算法(假设您的数字是无符号的) 它基于一个4位数字b3、b2、b1、b0表示数字的事实 B=23×b3+22×b2+21×b1+b0 A

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

mul X,Y 其中X和Y是一个4位数字


我想知道更换mul的最快操作是什么?我在谷歌找到的是8比特*8比特,这并不是最理想的。

查找表肯定是最快的方法,但可能你没有多少闪存可浪费,我宁愿用一个简单的总和

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


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

它基于一个4位数字b3、b2、b1、b0表示数字的事实 B=23×b3+22×b2+21×b1+b0

A×B=23×A×b3+22×A×b2+21×A×b1+A×b0

如果是bi,则与位bi的乘法将为0≠1乘以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
移位和加法乘法
//乘以A X B->C
C=0
因为我在0..3
如果是B&0x01
C=C+A
如果结束
A=1
结束
我不知道avr asm,但代码应该很容易翻译

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

还有更复杂的算法,可以直接处理有符号整数,并可以减少步骤数,如改进的Booth算法,但实现更复杂,我不确定增益是否显著

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

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

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

C=(B最快的可能是一个256字节的查找表。将两个操作数连接成一个8位数字来索引该表。@prl这足以作为一个答案,而不仅仅是一个注释。@Alexey,可能吧,但我对AVR体系结构、数组索引或内存计时一无所知,所以希望有人可以进行注释。@prl您不必使用注释始终提供代码。@prl:AVR可以使用8位整数对静态数组进行索引。它通常有一些SRAM,您可以在其中预先计算一个表以进行快速查找。在LUT上花费256字节可能会很浪费,我认为每个指令只有1位的移位,但如果倍增吞吐量是最重要的,那么这可能是可行的(AVR的ISA参考列出了计时。LSL是添加相同、相同的代码的别名,需要1个周期。)谢谢,我以前并不需要在ASM中编程。我认为在这种情况下查找表会更快。我以前不知道这会很重要:X将始终是14,Y在[0..10]之间如果X是常数,那么一个小的查找表是正确的选择。@ebalcsk您也可以通过移位和减法来实现。回想一下14=2·(8-1),这样您就可以计算
((Y
C = (B << 4) - (B << 1)