Я пробую, делят два числа на блок. Я работаю из блока Irvine на компьютерную книгу Intel, и я не могу заставить подразделение работать ни за что в жизни.
Вот мой код
.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 (программа действительно компилирует однако).
Вам необходимо обнулить регистр EDX перед выполнением деления:
mov eax, 4
mov ebx, 2
xor edx, edx ;set edx to zero
div ebx
call WriteDec
; установить edx в ноль
- это комментарий в MASM. Я не знаю, сработает ли это, если вы используете встроенную сборку на C, поэтому не копируйте его, если вы используете:)
Я думаю, что вышеупомянутая причина верна, потому что когда u делит eax на ebx, оба являются 32-битными числами, но делимое должно быть 64-битным, делитель 32-битный, поэтому edx считается msb ... u может сделать edx 0 или вместо 3bx используйте только bx .. таким образом u разделит 32-битное число на 16-битное число
Да, вам нужно установить edx
на нуль.
Самый простой способ сделать это:
xor edx, edx