将两个字节乘以1.5表示短路

时间:2015-09-01 02:31:10

标签: assembly bit-manipulation z80

我正在查看一些汇编代码并遇到以下内容(为了方便读者,我已经转换了它)。所有寄存器均为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

1 个答案:

答案 0 :(得分:1)

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

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

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