Ungültiger Befehl
-
Hallo,
ich schreibe gerade meine ersten Programme in Assembler. Folgendes Programm habe ich gerade als EXE-Datei erstellt (ohne Fehlermeldung):
.MODEL Small .STACK 100h .DATA Meldung DB "Super Mario$" .CODE start: mov ax, @data mov ds, ax mov dx, OFFSET Meldung mov ah, 09h int 21h call PR PR PROC NEAR push ax push cx mov cx, 05h mov ah, 09h LoopLbl: int 21h Loop LoopLbl pop cx pop ax ret PR ENDP mov ah, 4Ch ; Programm beenden int 21h ; Programm beenden end start
Wenn ich das Programm jedoch starte, dann bekomme ich immer eine Fehlermeldung wegen einem ungültigen Befehl.
Ich finde den Fehler aber einfach nicht. Könnt ihr mir sagen wo in dem Code der Fehler liegt ?
Vielen Dank,
MfG Arenas
-
arenas schrieb:
Wenn ich das Programm jedoch starte, dann bekomme ich immer eine Fehlermeldung wegen einem ungültigen Befehl.
Ich finde den Fehler aber einfach nicht. Könnt ihr mir sagen wo in dem Code der Fehler liegt ?
Mit 'call PR' rufst Du ein Unterprogramm PR auf. Soweit so gut, aber wenn das Unterprogramm beendet ist, befindet sich das Programm an Zeile 17 und macht stur weiter. Das Programm überspringt nicht das Unterprogramm, sondern arbeitet dessen Befehle ab. Spätestens beim 'ret' wird es kritisch, denn wohin soll zurückgekehrt werden? Es wird also irgendwohin zurückgekehrt - und dort lauert der ungültige Befehl.
viele grüße
ralph
-
Ach, daran habe ich gar nicht gedacht. Aber ist ja eigentlich logisch.
So funktioniert es:
.MODEL Small .STACK 100h .DATA Meldung DB "Super Mario$" .CODE start: mov ax, @data mov ds, ax mov dx, OFFSET Meldung mov ah, 09h int 21h call PR mov ah, 4Ch ; Programm beenden int 21h ; Programm beenden PR PROC NEAR push ax push cx mov cx, 5 mov ah, 09h LoopLbl: int 21h Loop LoopLbl pop cx pop ax ret PR ENDP end start
Vielen Dank nochmal für deine Antwort.
-
Jetzt habe ich noch eine Frage. Mal angenommen ich habe in meinem Programm eine Variable, mit einer Zahl angelegt:
Zahl_1 DB 10
Wie kann ich diese Zahl dann am leichtesten ausgeben ? Mit dem Interrupt 21h scheint das ja gar nicht so einfach zu sein.
Hat einer von euch vielleicht eine fertige Prozedur für die Ausgabe von Zahlen ?
Vielen Dank,
MfG arenas
-
arenas schrieb:
Hat einer von euch vielleicht eine fertige Prozedur für die Ausgabe von Zahlen ?
Ich darf mal ganz unbescheiden auf meine Homepage verweisen:
http://dcla.rkhb.de/umwandlung/int2dez.html
Wenn Du die Zahl in eine ASCII-Folge umgewandelt hast, kannst Du den Int21 darauf loslassen (abschließendes Dollar-Zeichen nicht vergessen!)
viele grüße
ralph