2015-09-01 27 views
3

我在看一些汇编代码,并遇到以下(为便于读者转换)。所有寄存器都是8位,指针是16位。因此(q)加载8位。乘以两个字节表示一个短的1.5

(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位真糊涂我,因为什么上面的代码确实是1.5乘以16位值,而不管(即你解释为小端或大端,它的值在其各自的端序中乘以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

我将有助于了解CPU这应该是对的,但它看起来像SRL/RR指令执行16位右移(即除以2),而ADD/ADC指令执行16位加法。因此它计算Q = Q/2 + Q,其中Q是存储在(q)和(q + 1)处的16位大端值。 –

+0

对不起,但它的游戏CPU,我认为Z80组装,所以srl,rr等仅在8位操作 – Jason

+0

在组合SRL和RR共同执行一个16位的转变。同样,ADD和ADC一起工作来执行16位添加。 –

回答

1

我没有参加过的所有详细汇编代码的读取时间,但我强烈怀疑@Ross岭是正确的。

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

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