3
我在看一些汇编代码,并遇到以下(为便于读者转换)。所有寄存器都是8位,指针是16位。因此(q)
加载8位。乘以两个字节表示一个短的1.5
(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位真糊涂我,因为什么上面的代码确实是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
我将有助于了解CPU这应该是对的,但它看起来像SRL/RR指令执行16位右移(即除以2),而ADD/ADC指令执行16位加法。因此它计算Q = Q/2 + Q,其中Q是存储在(q)和(q + 1)处的16位大端值。 –
对不起,但它的游戏CPU,我认为Z80组装,所以srl,rr等仅在8位操作 – Jason
在组合SRL和RR共同执行一个16位的转变。同样,ADD和ADC一起工作来执行16位添加。 –