2016-03-04 49 views
-2

開始:32位乘法,而無需使用MUL

MOV AX,0012h 
MOV BX,0000h 
MOV CX,0033h 
MOV DX,0000h 

MOV [100h],AX 
MOV [102h],BX 
MOV [104h],CX 
MOV [106h],DX 
MOV SI,40h 

tekrar: 

MOV DI,AX ;sonucu indeks kaydeder 
AND DI,01h 
XOR DI,01h 
JZ topla_kaydir 

devam: 

RCR DX,1 
RCR CX,1 
RCR BX,1 
RCR AX,1 

SHR [100h],1 
SHR [102h],1 
DEC SI 
CMP SI,0 
JNZ tekrar 
JMP son 

topla_kaydir: 

ADD DX,[104h] 
ADC CX,[104h] 

JMP devam  

這是我的代碼部分。我想乘兩個32位數字而不使用mul操作和擴展寄存器。我無法得到正確的結果。

+3

'我無法得到正確的結果。什麼輸入數據導致不正確的結果?結果應該是什麼? –

+0

我想手動乘以兩個32位數字,第一個數字是0000 0012,第二個數字是0000 0033,結果應該是0396(64位) –

+0

您是否嘗試過使用調試器來檢查程序寄存器? ADC CX,[104h]不應該是ADC CX,[106h]'(假設你的邏輯通常是正確的,這是可疑的)? – lurker

回答

2
MOV DI,AX ;sonucu indeks kaydeder 
AND DI,01h 
XOR DI,01h 
JZ topla_kaydir 

如果AX的最低位設置爲標籤topla_kaydir
只需編寫代碼跳轉:

test ax,1 
jnz topla_kaydir 

topla_kaydir: 
ADD DX,[104h] 
ADC CX,[104h] 

您設置CX是低位字,DX是高位字。這個添加需要尊重那個訂單。
如果目的是提高在DX 32位值:CX那麼你應該寫:

add cx,[104h] 
adc dx,[106h] 

SHR [100h],1 
SHR [102h],1 

沒有太多的點,這些SHR的。他們生產的價值不在任何地方使用!
您需要的是將其中一個數字(當您找到一個位時添加到結果中的數字)的值加倍。

shl [104h],1 
rcl [106h],1 

MOV SI,40h 

不要重複64次,當你的源只有32位!這沒有意義。

mov si,32 
+0

非常感謝。你的回答可以幫助我很多 –

+1

另外一個觀察:你還應該清除結果__before__開始迭代。 'xor cx,cx''xor dx,dx''mov si,32' – Fifoernik

+0

非常感謝。 –