Fehler bei Divisions mit "DIV"



  • Ich habe ein Testprogramm zur Division geschrieben und das funktioniert.
    Dann habe ich auch noch ein Linienprogramm, in dem ein Divisionsbefehl vorkommt, geschrieben mit dem man Linien auf den Grafikbildschirm zeichnen kann geschrieben.
    Das funktioniert soweit ja auch, aber wenn ich das programm fuer die Linie in ein Unterprogramm setze und eine Schleife drumherumbaue, bekomme ich einen Fehler und das Programm haelt an.
    Bei Turbo Debug habe ich den Exit-Code 3.
    Bei genauerer Untersuchung habe ich herausgefunden, dass das Programm falsch dividiert. Als ich jedoch edx vorsichtshalber auf 0 gesetzt habe, obwohl ich eine 16-bit division durchgefuert habe, hat es noch nicht einmal die erste Linie, die es vorher noch zu sehen gab, auf den Schirm gebracht.

    Jetzt veraendert der assemblercode alleine bei diesem einen Divisionsbefehl (div) sowohl Register AX, als auch BX, CX und DX.

    Wie kann das sein? Eigentlich sollte das Ergebniss doch in AX landen und der Rest in DX. BX und CX sollten doch eigentlich unberuehrt bleiben, oder?
    😕
    😮



  • Hi.

    div r/m16 dividiert ax:dx durch r/m16. Wie du schon sagtest, landet das Ergebnis in ax und Rest in dx. bx und cx sollten nicht veraendert werden. Kann aber vorkommen, wenn kein vernuenftiger Exception-Handler fuer Division durch 0 eingerichtet wurde und die Division nicht fehlerfrei ausgefuehrt werden kann.
    Ueberpruefe in deinem Code also nochmal, ob ax, dx und der Divisor auch richtig gesetzt wurden. Richte ggF. auch einen Exception-Handler und eigene DebugFunktionen ein - der TD ist leider auch nicht unfehlbar.



  • Also einen "Division durch 0" - Fehler gibt es bei mir sicher nicht.

    Gibt es noch andere vielleicht bessere Debug - bzw. Testwerkzeuge fuer Assemblerprogramme?
    Wer kennt welche? 🙄


  • Mod

    kannst du evtl. ein bisschen code posten?



  • Wie sieht der Divisionsbefehl genau aus? Poste mal ein bisschen Kontext (vorher, Division und nachher).

    Auf welcher CPU wird der Code ausgefuehrt?

    Vergleiche mal den Maschinencode, den der Assembler fuer den Divisionsbefehl erzeugt hat, mit der Befehlsbeschreibung bzw. der Assembler-Tabelle im IA-32 Referenzhandbuch.

    Bei echtem 16-Bit-Code ist lediglich zu beachten, dass alle Befehle defaultmaessig mit 16-Bit-Operanden arbeiten, und dass ein Operand-Size-Modifier (0x66) vor dem Befehl stehen muss, wenn er 32-bittig arbeitet. Du kannst in einem Befehl 32-Bit- und 16-Bit Operanden nicht mischen.

    DIV kann nur vorzeichenlose Register/Speicher-(r/m-)Divisionen mit AX durch r/m8 (Ergebnis in AL/AH), DX:AX durch r/m16 (Ergebnis in AX/DX), und EDX:EAX durch r/m32 (Ergebnis in EAX/EDX) durchfuehren.

    Wenn Du z.B. bei einer 16-Bit Division AX durch BX dividieren willst, musst Du vorher DX auf 0 setzen.


Anmelden zum Antworten