我正在查看一些汇编代码,并发现了以下内容(为了方便读者,我已将其转换为)。所有的寄存器都是8位,指针是16位。所以(q)
加载8位
(q+1) = (q+1) = rr(q+1)
,其中(q)
对q
和rr(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