переполнение разделения masm

Я пытаюсь разделить два числа на ассемблере. Я работаю над сборкой Irvine для intel computers book, и я не могу заставить подразделение работать на меня.

вот мой код

.code
main PROC
    call division
    exit
main ENDP

division PROC
    mov eax, 4
    mov ebx, 2
    div ebx
    call WriteDec
    ret
divison ENDP

END main

где WriteDec должен записать любое число в регистре eax (должно быть установлено в фактор после вызова разделения). Вместо этого каждый раз, когда я запускаю его visual studio аварийно завершает работу (программа компилируется, однако).

3 ответов


вам нужно нулевое расширение регистра EDX перед выполнением деления:

mov eax, 4
mov ebx, 2
xor edx, edx          ;set edx to zero
div ebx
call WriteDec

на ;set edx to zero является комментарием в MASM. Я не знаю, будет ли это работать, если вы используете встроенную сборку в C, поэтому не копируйте ее, если вы:)


да, вам нужно установить edx к нулю.

самый простой способ сделать это:

xor edx, edx

Я думаю, что вышеупомянутая причина верна, потому что, когда U делит eax на ebx, оба являются 32-битными числами, но дивиденд должен быть 64-битным делителем 32 бит, и поэтому он рассматривает edx как msb...u может сделать edx 0 или вместо использования 3bx использовать только bx..таким образом, u разделит 32-битное число на 16-битное число