Divide overflow in Assembler
Habe ich eine einfache Assembler-Programm, wo ich will, dividieren von zwei zahlen (zwei-byte-Format) und ausdrucken Rest. Hier ist mein code
.model small
.stack 256
.data
ten dw 10
.code
main proc
mov ax, @data
mov ds, ax
mov ax, 12 ; divident
div ten ; ax/10
mov ah, 9 ; for printing dx
int 21h
mov ax, 4c00h ; ending program
int 21h
main endp
end main
Also wenn ich diesen code ausführen, das Ergebnis ist "Divide overflow" und ich habe keine Ahnung, warum überlauf passiert.
Irgendwelche Ideen?
- Haben Sie versucht, auf der Suche für die Montage-Abteilung Probleme/Fragen? Ihre Frage ist nicht der erste. Es ist ein Duplikat der anderen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
DIV mem16
teiltDX:AX
durch den angegebenen Operanden. So müssen Sie sich-erweiternAX
inDX
, die Sie leicht tun können, mit derCWD
Unterricht vor der division (in deinem FallMOV DX,0
oderXOR DX,DX
auch funktionieren würde). I. e.:Anderes problem mit deinem code ist, dass Sie anscheinend davon ausgehen, dass
int 21h /ah=9
können verwendet werden, um drucken numerische Werte. Das ist nicht der Fall. Wenn Sie möchten, drucken Sie den WertDX
(also den Rest) haben Sie es zu konvertieren in eine Zeichenfolge ersten und drucken Sie die Zeichenfolge. Ansonsten erhalten nur Müll ausgegeben, und das Programm sogar zum Absturz.DX
0, wenn Ihr Programm startet. In diesen Fällen ist die division richtig arbeiten würden, aber Sie sollten nicht auf diese angewiesen sind. VerwendenCWD
und du wirst sicher sein. Für Druck-Müll, habe ich schon erwähnt, warum das passiert im zweiten Teil meiner Antwort. Wenn Sie nur drucken wollen, eine einzelne Ziffer, die Sie hinzufügen könnte'0'
zuDL
nach der Teilung und Nutzungint 21h / ah=2
. Oder Sie können schreiben Sie Ihre eigenen int-zu-string-Funktion, siehe z.B. meine Antwort auf diese frühere Frage.Schreiben "zehn DB 10" oder "div BYTE PTR-ten".
Und ich bin sicher, wenn Sie so etwas schreiben
werden Sie auch bekommen, was Sie wollen. Wenn es sein sollte Worttrennung ist, müssen Sie klar DX, Michael schrieb im Beitrag unten, wie.
BTW ich weiß nicht, was die Montage Dialekt es ist, aber wissen Sie wirklich brauchen, dies zu schreiben?
Nicht DS Punkt-zu-Daten-Abschnitt durch defaut?
Und 09h nicht tun, was Sie wollen. Werfen Sie einen Blick auf 02h.
mov segreg, reg16
ist eine perfekt gültige x86-Instruktion.mov es,0a000h
. Das ist keine gültige Instruktion und könnte getan werden, mitpush / pop
statt. Verschieben eines 16-bit-GPR zu einem segment-register hat seit der ersten x86-Modelle, though.mov ds, ax
ich habe versucht, es in andere Programme, wie gut und auch hier.Modell klein
.stack 256
.Daten
zehn dw 10
.code
Haupt proc
mov ax, @data
mov ds, ax
main endp
Ende main