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位添加。 –