2015-09-01 48 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