我正在查看一些汇编代码并遇到以下内容(为了方便读者,我已经转换了它)。所有寄存器均为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
答案 0 :(得分:1)
我没有花时间仔细阅读所有汇编代码,但我强烈怀疑@Ross Ridge是对的。
这个技巧叫做霍纳的方法。它在没有乘法器的较小嵌入式MCU中尤为常见,但可用于一般速度优化。参见