2010-02-13 15 views
8

Próbuję podzielić dwie liczby w zespole. Pracuję nad zbiorem Irvine dla książek o komputerach inteligencji i nie mogę dzielić działów na całe życie.przepełnienie podziału masm

Oto mój kod

.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 

Gdzie WriteDec powinien napisać cokolwiek numer w rejestrze eax (powinien być ustawiony na iloraz po wywołaniu dział). Zamiast tego za każdym razem, gdy go uruchamiam, studio graficzne ulega awarii (program się jednak kompiluje).

+1

można wejść przez nią w Visual Studio debugera? Jak daleko zajdziesz, jeśli weźmiesz udział w każdej instrukcji? –

+0

Nieobsługiwany wyjątek przy 0x00401075 w Project.exe: 0xC0000095: Przepełnienie Integer. Zdarza się zaraz po wywołaniu div. –

+0

Jeśli dzielisz przez 2 i jesteś zainteresowany wydajnością, możesz rozważyć użycie SHR. –

Odpowiedz

13

Musisz zera rozszerzyć swoją EDX zarejestrować przed wykonaniem podziału:

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

;set edx to zero jest komentarz w MASM. Nie wiem, czy to zadziała, jeśli używasz wbudowanego zestawu w C, więc nie kopiuj go, jeśli jesteś :)

+0

Tak! Dziękuję bardzo za pomoc mi w tym. –

+1

Zamiast zerwać eksplozję EDX, zwykle używa się instrukcji CDQ do podpisania rozszerzenia EAX do EDX. Jeśli EAX jest nieujemny, EDX jest wypełniony zerami; jeśli EAX jest ujemny, EDX jest wypełniany jednym bitem. –

+0

Tak, masz rację pod tym względem, ale OP robi * un * podpisany podział, więc utrzymywałem prostą odpowiedź. – slugster

0

Myślę, że wyżej wymieniony powód jest poprawny, ponieważ gdy u dzielisz eax przez ebx zarówno są 32-bitowe liczby, ale dywidenda musi być 64-bitowy dzielnik jest 32-bitowy, a więc uważa edx za msb ... u może zrobić edx 0 lub zamiast używać 3bx użyć tylko bx ... w ten sposób podzielimy 32-bitowe numer o numerze 16 bitowym

3

Tak, musisz ustawić edx na zero.

Najprostszym sposobem na to jest:

xor edx, edx