将表示 short 的两个字节乘以 1.5
Multiplying two bytes representing a short by 1.5
我在查看一些汇编代码时遇到了以下内容(为了方便 reader,我已经对其进行了转换)。所有的寄存器都是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 in它各自的字节序)。
我对他们如何使用两个 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 中尤为常见,但可用于一般速度优化。见
我在查看一些汇编代码时遇到了以下内容(为了方便 reader,我已经对其进行了转换)。所有的寄存器都是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)
这真的让我很困惑,因为上面的代码所做的是将 16 位值乘以 1.5,而不管它的字节顺序如何(即无论你如何解释 q 是小端还是大端,它的值乘以 1.5 in它各自的字节序)。
我对他们如何使用两个 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 中尤为常见,但可用于一般速度优化。见