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