2012-03-08 2 views
0

как часть задания Я пытался умножить два 32-битных числа и сохранить результат в 64-битном месте. Однако мой результат неверен. пожалуйста, помогите мне понять, почемурасширенное умножение с 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 

ответ в Afd отладчик F6B3A6 (16587802 IN DEC), тогда как она должна быть 189F5C9A6 (6609553830 в десятичную). Я прошел через отладчик, но не смог найти что-то не так с кодом.

+0

Не может просто использовать 32-битный х 32-битный = 64-бит (I) Мультиэкран Вы не используете это на процессоре pre-i80386, не так ли? –

+0

его требование к курсу для работы на 16 бит на данный момент, 32 бит покрывается в последних уроках (создание из нижнего подхода, я знаю его устаревшее) –

ответ

2

Смотрите комментарии для нескольких d'ой-х:

[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

Спасибо, да, я проигнорировал множество тонкостей –

+0

И были «неспособны найти что-то не так с кодом ». :) –

Смежные вопросы