2017-10-07 10 views
0

32ビットの乗算をしようとしています。私はその問題を理解できません。答えが計算機と一致しません32ビット乗算アセンブリiApx88

[org 0x0100] 
mov cx,0 
mov cx,32 
mov dx,[multiplier] 
mov bx,[multiplier+2] 

check_bit: 
shr bx,1 
rcr dx,1 
jnc skip 
mov ax,[multiplicand+6] 
add [result+6],ax 
mov ax,[multiplicand+4] 
adc [result+4],ax 
mov ax,[multiplicand+2] 
adc [result+2],ax 
mov ax,[multiplicand] 
adc [result],ax 

skip: 
shl word[multiplicand+6],1 
rcl word[multiplicand+4],1 
rcl word[multiplicand+2],1 
rcl word[multiplicand],1 
dec cl 
jnz check_bit 

mov ax,0x4c00 
int 0x21 
multiplicand: dd 0x00000000 , 0x98765432 
multiplier: dd 0x12345678 
result: dd 0 , 0 
+0

_一致しない_は良い問題の説明ではありません。あなたの入力と予想される実際の出力は何ですか?また、デバッガを使用し、特に他の人に手助けをしたい場合はコードをコメントする方法を学んでください。 PS: 'MUL'命令を避ける理由は何ですか? – Jester

+0

[編集]を使ってこれを[mcve] –

答えて

1

数字はメモリに保存されている方法で処理されないため、問題が発生します。
乗数はOKですが、被乗数も結果もOKです!

値はリトルエンディアン形式でメモリに保存されているので、最初の添加は、最高の単語に登って、メモリ内の最低語で行われます:

mov ax,[multiplicand] 
add [result],ax 
mov ax,[multiplicand+2] 
adc [result+2],ax 
mov ax,[multiplicand+4] 
adc [result+4],ax 
mov ax,[multiplicand+6] 
adc [result+6],ax 

同じことを被乗数を倍増し。あなたはローエンドで始まり、高い単語のそれぞれにCFを挿入します。

skip: 
    shl word[multiplicand],1 
    rcl word[multiplicand+2],1 
    rcl word[multiplicand+4],1 
    rcl word[multiplicand+6],1 

multiplicand: dd 0x00000000 , 0x98765432 

この被乗数はあなたが望むものではないことを良いチャンスがありますか!
次は32ビット乗算の方が意味があります。

multiplicand: dd 0x98765432 , 0x00000000 
関連する問題