2015-01-18 1 views
1

Я пытаюсь написать программу сборки, чтобы умножить два 32-разрядных числа со знаком и сохранить ответ в 64-битном номере, но мой код дает только мне правильный ответ до 32 бит. Я искал его и искал многие сайты, но не смог удовлетворить себя. Я не могу получить эту проблему, хотя я отлажен его много times.This моего первый вопрос, как студент, так что я очень жаль, если я unclear.Thanks :)Ассемблер 8088: 32-разрядная подпись Умножение с добавлением и бит-манипуляцией с использованием 16-разрядных регистров

; 32bit multiplication 
[org 0x0100] 
multiplicand dd 0,9000008    ; 32bit multiplicand 64bit space 
multiplier: dd 45009     ; 32bit multiplier 
result: dd 0,0      ; 64bit result 
start: 
    mov cx,32       ; initialize bit count to 32 
    mov bx, [multiplier]    ; load multiplier in dx and bx 
    mov dx, [multiplier+2]    

checkbit: 
    sar dx,1       ; move right most bit in carry 
    rcr bx,1 
    jnc skip       ; skip addition if bit is zero 
    mov ax,[multiplicand] 
    add word[result],ax 
    mov ax,[multiplicand+2] 
    adc word[result+2],ax 
    mov ax,[multiplicand+4] 
    adc word[result+4],ax 
    mov ax,[multiplicand+6] 
    adc word[result+6],ax 
    mov ax,[multiplicand+8] 
    adc word[result+8],ax 
    mov ax,[multiplicand+10] 
    adc word[result+10],ax 
    mov ax,[multiplicand+12] 
    adc word[result+12],ax 
    mov ax,[multiplicand+14] 
    adc word[result+14],ax 

skip: 
    shl word [multiplicand],1 
    rcl word [multiplicand+2],1 
    rcl word [multiplicand+4],1 
    rcl word [multiplicand+6],1 
    rcl word [multiplicand+8],1 
    rcl word [multiplicand+10],1 
    rcl word [multiplicand+12],1 
    rcl word [multiplicand+14],1 
    dec cx 
    jnz checkbit 

mov ax,0x4c00       ; terminate program 
int 0x21 

Я думаю, что моя логика является правильной, но тогда Я не могу понять, что такое ошибка. Любая помощь приветствуется. :)

+0

Что вы обнаружили, когда вы отлаживали программу? –

+0

Получаю ваше мнение. Я нажал клавишу F1 на отладчике AFD до тех пор, пока cx не станет нулевым, а затем сопоставим ответ с калькулятором. я понял, что после 32-битных ошибок это становится неправильным. Я должен был бы полностью сделать это: P ..... хорошо спасибо @RaymondChen .. :) –

+0

Это не отладка, если вы проверяете значение только в конце. Попробуйте проверить значение чаще, например, каждый раз, когда выполнение достигает «checkbit» или даже после каждой инструкции, видя, что программа настолько кратка. (Он выполняет всего несколько сотен инструкций, вы должны иметь возможность переходить через каждый из них.) –

ответ

0
multiplicand dd 0,9000008    ; 32bit multiplicand 64bit space 

Вы устанавливаете 64-битное пространство, но ваш код изменяет 128-битное пространство !!

Также из-за небольшой энтузиазма вы должны поменять слова множественности.

+0

Спасибо .. я проверил его ... это сделано .. на самом деле я думал, что каждые четыре бит в двоичном формате, есть добавление одного бит в шестнадцатеричном, но логически я сделал ошибку и добавил два бита на четыре бит и теперь благодаря вам. Я понимаю, что он ... Маленький Endian thingy .. –

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