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
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"...