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

Я пробую, делят два числа на блок. Я работаю из блока 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 (программа действительно компилирует однако).

9
задан Help I'm in college 13 February 2010 в 00:21
поделиться

3 ответа

Вам необходимо обнулить регистр EDX перед выполнением деления:

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

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

15
ответ дан 4 December 2019 в 11:04
поделиться

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

0
ответ дан 4 December 2019 в 11:04
поделиться

Да, вам нужно установить edx на нуль.

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

xor edx, edx
4
ответ дан 4 December 2019 в 11:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: