% mögl. Lösung zur Aufgabe 5b) von Matthias Dräger [einfache Variante] % % Lösungsidee: Es wird ein String mit dem Minuszeichen angelegt. Bevor die Ausgabe-Routine beginnt, % überprüfen wir, ob die auszugebene Zahl nicht negativ ist. Sollte sie negativ sein, dann geben % das Minuszeichen aus. % % Sollten Warnungen auftreten, dann mit dem Parameter -b 200 assemblieren. % -> mmixal -b 200 Muster_Ueb1_Aufg5c_einfach.mms Buffer BYTE " 0",#a,0 % acht Zeichen, newline, String-Terminator 0 LOC (@+4)&-4 % dies ist optional, um die Adresse wieder 4-teilbar zu machen % sonst gibt mmixal wegen GETA eine Warnung aus Sign BYTE "-" % das Minuszeichen als String anlegen x IS $14 digit IS $42 LOC #100 Main SET x,2 % die Zahl, die ausgegeben werden soll NEG x,x % zu Testzwecken die Zahl x negativ machen BNN x,NotNeg % die Zahl ist nicht negativ? -> zu NotNeg springen GETA $255,Sign % Adresse von Sign ins globale Register 255 laden TRAP 0,Fputs,StdOut % Ausgabe des Minus-Zeichens NEG x,x % die negative Zahl positiv machen (damit das Hornerschema funktioniert) NotNeg GETA $17,Buffer % get address of Buffer -> $17 SET $18,3 % zaehlt die Stellen herunter 7...0 Loop DIV x,x,10 % durch 2 teilen um die letzte Stelle als Rest zu erhalten GET digit,rR % der Rest der Division steht in rR -> digit ADD digit,digit,'0' % addiere den Wert des ASCII Zeichens ’0’ STBU digit,$17,$18 % store byte unsigned, schreibe das Zeichen in den Buffer mit dem Offset $18 (3...0) SUB $18,$18,1 % Offset herunterzaehlen BN $18,Stopp % prüfen, ob die Stelle negativ ist -> Programm beenden, damit kein Fehler auftritt BNZ x,Loop % branch if x not zero -> loop SET $255,$17 % Adresse des Buffer in $255 laden Stopp TRAP 0,Fputs,StdOut % String, auf den $255 zeigt, ausgeben TRAP 0,Halt,0