Verzweigung



  • Bin zurzeit dabei Assembler aus einem Buch zu lernen, um den Umgang mit Verzweigungen zu üben, habe ich ein kleines Programm geschrieben, dass den User fragt ob es ihm gut geht, und entsprechend reagiert(Wenn es ihm gut geht, gibt das Programm "schoen!" aus, wenn nicht "Ohh..."

    Jetzt habe ich aber das Problem, dass das Programm - unabhängig vom Input des Users - immer "schoen!" ausgibt

    Hier der Code:

    .model small
    
    .data
    
    Frage db "Geht es ihnen gut?"
    endl db 10,13,"$"
    J db "Schoen!$"
    N db "Ohh...$"
    
    .code
    .startup
    
    lea dx, Frage
    mov ah, 9
    int 21h
    
    mov ah, 1
    int 21h
    
    lea dx, endl
    mov ah, 9
    int 21h
    
    cmp al, 'j'
    je gut
    cmp al, 'J'
    je gut
    cmp al, 'n'
    je schlecht
    cmp al, 'N'
    je schlecht
    
    gut:
    
    lea dx, J
    mov ah, 9
    int 21h
    jmp ENDE
    
    schlecht:
    
    lea dx, N
    mov ah, 9
    int 21h
    jmp ENDE
    
    ENDE:
    
    .exit
    end
    


  • Die Eingabe (und nicht noch eine Ausgabe!) sollte die letzte Anweisung vor "cmp" sein.



  • ...oder du sicherst das Ergebnis der Abfrage z.B. auf den stack (push/pop).
    ausserdem:
    Ein jump zu einem direkt nachfolgenden Label ist reichlich unsinnig (Zeile 45).
    Du behandelst den standard-Fall nicht (weder j noch n).
    Schau dir mal eine ASCII-Tabelle an: Vergleich unabhaengig von Gross-/Kleinschreibung kriegt man auch eleganter hin.
    Und zuletzt: Was hat das alles konkret eigentlich mit Schleifen ueben zu tun?



  • Nobuo T schrieb:

    Und zuletzt: Was hat das alles konkret eigentlich mit Schleifen ueben zu tun?

    Ich meinte Verzweigungen, nicht Schleifen, da hab ich mich vertippt - ich editier´s auch gleich

    Edit:

    Nobuo T schrieb:

    ...oder du sicherst das Ergebnis der Abfrage z.B. auf den stack (push/pop).

    So weit bin ich noch nicht in Assembler

    @Topic:

    das ganze hat jetzt auch erstmal funktioniert, indem ich die letzte Asugabe entfernt habe, damit die Eingabe die letzt Anwendung vor cmp ist

    Eine Frage hätte ich noch:

    Wie mache ich es ohne den Abschnitt

    lea dx, endl
    mov ah, 9
    int 21h
    

    dass nach der Eingabe noch eine Leerzeile kommt - sonst sieht das ganze nämlich ein bisschen unübersichtlich aus

    Edit 2:

    Habe jetzt noch den Abschnitt

    cmp al, 'j'
    je gut
    cmp al, 'J'
    je gut
    

    entfernt, da der Programmcode wenn man etwas anderes als N eingibt logischerweisse eh zum Abschnitt gut weiterläuft

    Edit 3:

    Die Bezeichnung "gut" für den Abschnitt habe ich auch entfernt, da sie ohne einen Jump der dorthin führt unnötig ist



  • 0xFFFFFF schrieb:

    Wie mache ich es ohne den Abschnitt

    lea dx, endl
    mov ah, 9
    int 21h
    

    dass nach der Eingabe noch eine Leerzeile kommt - sonst sieht das ganze nämlich ein bisschen unübersichtlich aus

    Du koenntest zB. den wesentlichen Teil von endl (die beiden Bytes 10 und 13) vor deine Texte J und N haengen...

    0xFFFFFF schrieb:

    Die Bezeichnung "gut" für den Abschnitt habe ich auch entfernt, da sie ohne einen Jump der dorthin führt unnötig ist

    Das war immer noch sinnvoller als der erwaehnte letzte Sprung zu "Ende"...


Anmelden zum Antworten