3

我正在查看一些汇编代码并遇到以下内容(为了便于阅读,我已对其进行了转换)。所有寄存器均为 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)获得第 0 位(q+1)

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

我对他们如何使用两个 8 位值将 16 位值乘以 1.5 感到困惑。这里发生了什么?具体来说,添加的第0位和向右(q+1) to (q)旋转的目的是什么?(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
4

1 回答 1

1

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

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

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

于 2015-09-01T04:12:10.153 回答