переполнение деления - PullRequest
9 голосов
/ 13 февраля 2010

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

Ответы [ 3 ]

15 голосов
/ 13 февраля 2010

Перед делением необходимо расширить регистр EDX на ноль:

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

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

4 голосов
/ 22 мая 2010

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

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

xor edx, edx
0 голосов
/ 01 марта 2010

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

...