Я пытаюсь написать программу сборки, чтобы умножить два 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
Я думаю, что моя логика является правильной, но тогда Я не могу понять, что такое ошибка. Любая помощь приветствуется. :)
Что вы обнаружили, когда вы отлаживали программу? –
Получаю ваше мнение. Я нажал клавишу F1 на отладчике AFD до тех пор, пока cx не станет нулевым, а затем сопоставим ответ с калькулятором. я понял, что после 32-битных ошибок это становится неправильным. Я должен был бы полностью сделать это: P ..... хорошо спасибо @RaymondChen .. :) –
Это не отладка, если вы проверяете значение только в конце. Попробуйте проверить значение чаще, например, каждый раз, когда выполнение достигает «checkbit» или даже после каждой инструкции, видя, что программа настолько кратка. (Он выполняет всего несколько сотен инструкций, вы должны иметь возможность переходить через каждый из них.) –