% mögl. Lösung zur Aufgabe 5d) von Matthias Dräger (einfache Variante) % % Lösungsidee: Wir laden das erste Zeichen von der Eingabe und prüfen, ob es das Zeichen '4' ist. % Wenn nein -> Programm beenden. Danach wird das zweite Zeichen geladen und auf '2' geprüft. % Wichtig ist, dass wir das dritte Zeichen auf #A (Zeilenumbruch) prüfen, denn dies ist das Ende % der Eingabe. Wird nur auf '4' und '2' überprüft, dann würde auch die Eingabe "420" das Wort ausgeben. % % Sollten Warnungen auftreten, dann mit dem Parameter -b 200 assemblieren. % -> mmixal -b 200 Muster_Ueb1_Aufg5d.mms Eingabe OCTA 0,8 % Platz fuer die Uebergabe der Buffer-Adresse % es sollen 8 Zeichen gelesen werden inkl. terminierender 0 Buffer BYTE " " % an diese Stelle wird die Eingabe geschrieben newline BYTE #a,0 % ein newline-Zeichen mit String-Terminator LOC (@+4)&-4 % dies ist optional, um die Adresse wieder 4-teilbar zu machen % sonst gibt mmixal wegen GETA eine Warnung aus StrRechner BYTE "Rechnerstrukturen",0 % String Rechnerstrukturen anlegen BufAddr IS $42 EinAddr IS $43 Vergl IS $41 LOC #100 Main CMP Vergl,$0,1 % compare, ist die Anzahl der Kommandozeilen-Parameter % groesser als 1 (steht in $0) BP Vergl,option2 % Wenn ja (Ergebnis positiv) gehe zu option2 option1 GETA BufAddr,Buffer % sonst hier weiter, Adressen bestimmen GETA EinAddr,Eingabe STOU BufAddr,EinAddr,0 % Speichere die Adresse des Buffer bei ‘Eingabe’ SET $255,EinAddr % Setze Register $255 TRAP 0,Fgets,StdIn % Lies String von StdIn nach Buffer % Hier kommt unsere Überprüfung auf "42",#a GETA $1,Buffer % erstes Zeichen der Eingabe LDBU $2,$1,0 % in Register $2 speichern CMP $3,$2,'4' % prüfen, ob erstes Zeichen '4' ist BNZ $3,Stopp % falls nicht -> beende Programm LDBU $2,$1,1 % zweites Zeichen der Eingabe in Register $2 speichern CMP $3,$2,'2' % prüfen, ob zweites Zeichen '2' ist BNZ $3,Stopp % falls nicht -> beende Programm LDBU $2,$1,2 % drittes Zeichen der Eingabe in Register $2 speichern CMP $3,$2,#a % prüfen, ob drittes Zeichen der Zeilenumbruch ist (Ende der Eingabe) BNZ $3,Stopp % falls nicht -> beende Programm GETA $255,StrRechner TRAP 0,Fputs,StdOut % gib Rechnerstrukturen aus GETA $255,newline TRAP 0,Fputs,StdOut % gefolgt von newline Stopp TRAP 0,Halt,0 option2 LDOU $255,$1,0 % lies die Adresse des ersten Kommandozeilen-Parameters TRAP 0,Fputs,StdOut % in $255 ($1 zeigt darauf) und gib diesen aus GETA $255,newline TRAP 0,Fputs,StdOut LDOU $255,$1,8 % die Adresse des zweiten Parameters steht 8 Byte weiter, % lies sie ein ... TRAP 0,Fputs,StdOut GETA $255,newline TRAP 0,Fputs,StdOut TRAP 0,Halt,0