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


Anmelden zum Antworten