2010-02-13 13 views
8

Ich versuche, zwei Zahlen in der Montage zu teilen. Ich arbeite aus der Irvine Versammlung für Intel Computer Buch heraus und ich kann Division Arbeit für das Leben von mir nicht machen.Masm Division Überlauf

Hier ist mein Code

.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 

Wo WriteDec sollte schreiben, was Nummer im EAX-Register ist (soll nach der Teilung Aufruf des Quotienten eingestellt wird). Stattdessen stürzt Visual Studio bei jedem Programmabsturz ab (das Programm kompiliert jedoch).

+1

Können Sie durch sie in der Visual Studio-Debugger Schritt? Wie weit kommst du, wenn du in jede Anweisung trittst? –

+0

Nicht behandelte Ausnahme bei 0x00401075 in Project.exe: 0xC0000095: Integer-Überlauf. passiert direkt nach dem Anruf div. –

+0

Wenn Sie durch 2 dividieren und an der Leistung interessiert sind, sollten Sie SHR in Betracht ziehen. –

Antwort

13

Sie müssen auf Null erweitern EDX registrieren, bevor die Teilung zu tun:

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

die ;set edx to zero ist ein Kommentar in MASM. Ich weiß nicht, ob es funktioniert, wenn Sie Inline-Assembly in C verwenden, also kopieren Sie es nicht, wenn Sie :)

+0

Ja! Vielen Dank, dass Sie mir dabei geholfen haben. –

+1

Anstatt die EDX-Explikation auf Null zu setzen, würde man normalerweise den CDQ-Befehl verwenden, um Extend EAX in EDX zu unterschreiben. Wenn EAX nicht negativ ist, wird EDX mit Nullen gefüllt; Wenn EAX negativ ist, wird EDX mit Ein-Bits gefüllt. –

+0

Ja, Sie sind in dieser Hinsicht richtig, aber das OP tut * un * unterzeichnete Abteilung, so behielt ich meine Antwort einfach. – slugster

0

Ich denke, der oben genannte Grund ist richtig, weil wenn Sie eax durch ebx beide teilen sind 32-Bit-Zahlen, aber die Dividende muss 64-Bit-Divisor ist 32 Bit und so sieht Edx als die msb ... Sie können Edx 0 oder statt 3bx verwenden nur bx..in dieser Weise teilen Sie ein 32bit Nummer durch eine 16-Bit-Nummer

3

Ja, Sie müssen edx auf Null setzen.

Der einfachste Weg, dies zu tun ist:

xor edx, edx