2012-03-08 6 views
0

私は割り当ての一部として2つの32ビットの数値を乗算し、結果を64ビットの場所に格納しようとしています。しかし、私の結果は間違っています。それは189F5C9A6(12月で6609553830)である必要があり、一方、AFDデバッガで答えがF6B3A6(DEC、IN 16587802)である理由拡張乗算nasm

[org 0x0100] 
jmp start 
multiplicand:  dd 100122,0 
multiplier:   dd 66015 
result:    dd 0,0 
start: 
initialize:   mov cl,16 

        mov bl,1 
checkbit:   test bl,[multiplier] 
        jz decrement 

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


decrement:   shl bl,1 
        shl [multiplicand],1 
        rcl [multiplicand+2],1 
        rcl [multiplicand+4],1 
        dec cl 
        jnz checkbit 

        mov ax, 0x4c00 
        int 0x21 

私が把握助けてください。私はデバッガを通過したが、コードに間違ったものは見つけられません。

+0

は、あなただけの32ビット×32ビット= 64ビット(I)MULを使用することができませんか?あなたはpre-i80386 CPUでこれを実行していませんか? –

+0

そのためのコースの要件は、今のところ16ビットで作業するために、最後のレッスンで32ビットがカバーされています(下のアプローチからビルドアップ、私は廃止されていることを知っています) –

答えて

2

は数D'OHのためのコメントを参照してください:

[org 0x0100] 
jmp start 

multiplicand: dd 100122,0 
multiplier: dd 66015 
result:  dd 0,0 

start: 
initialize: mov cl,32 ; multipliers are 32-bit, so 32 iterations, not 16 

       mov bl,1 
checkbit:  test bl,[multiplier] 
       jz decrement 

multiply:  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] ; forgot this 
       adc [result+6], ax  ; forgot this 

decrement: ; shl bl,1    ; bl is 8-bit, but you need to test 32 
       shr word [multiplier+2],1 ; so, shift multiplier right instead 
       rcr word [multiplier],1 ; of shifting bl left 

       shl word [multiplicand],1 ; this is NASM, I'd rather tell 
       rcl word [multiplicand+2],1 ; the operand size here 
       rcl word [multiplicand+4],1 ; because it's unclear 
       rcl word [multiplicand+6],1 ; forgot this 
       dec cl 
       jnz checkbit 

       mov ax, 0x4c00 
       int 0x21 
+0

ありがとう、ええ、私はintricaciesをたくさん無視していた –

+0

そして、コードに何か間違っているものを見つける "。 :) –

0

mov cl,16mov cl,32に置き換えます。

[multiplicand+6]を忘れないでください。