将表示short的两个字节乘以1.5



我正在查看一些汇编代码,并发现了以下内容(为了方便读者,我已将其转换为)。所有的寄存器都是8位,指针是16位。所以(q)加载8位

(q+1) = (q+1) = rr(q+1),其中(q)qrr(q)的微分是右旋(q) = (q) + (q)/2 + bit((q+1), 0),其中bit((q+1), 0)获取(q+1)的第0位

这真的让我很困惑,因为上面的代码所做的是将16位值乘以1.5,而不管它的端序(即无论你如何解释q是小端序还是大端序,它的值在其各自的端序中乘以1.5)。

我对他们如何使用两个8位值将16位值乘以1.5感到困惑。这是怎么回事?具体来说,添加(q+1) to (q)的第0位以及将(q+1)向右旋转的目的是什么?

下面是汇编代码:

ld a, (q)
ld b, a
ld a, (q+1)
ld c, a
srl b
rr c
add c
ld (q+1), a
ld a, (q)
adc b
ld (q), a
ret

我没有花时间详细阅读所有的汇编代码,但我强烈怀疑@Ross Ridge是对的。

这个技巧被称为霍纳方法。这在没有乘法器的小型嵌入式mcu中尤其常见,但可用于一般速度优化。看到

http://www.ti.com/lit/an/slaa329/slaa329.pdf

相关内容

最新更新