Prof. Frederik Armknecht Sascha Müller Daniel Mäurer Grundlagen der Informatik 3 Wintersemester 09/10 Praktikum 1 Römische Zahlen In den kommenden übungen und Vorlesungseinheiten lernen Sie die MIPS Assemblersprache kennen. Verwenden Sie für die Umsetzung der Praktikumsaufgaben die MARS IDE. Download und Infos unter: http://courses.missouristate.edu/KenVollmar/MARS/index.htm Auf den Poolrechnern ist MARS bereits installiert. Sie können ihn mit dem Kommando mars starten. Römische Zahlen Das auf den römischen Ziffern beruhende Zahlensystem stellt natürliche Zahlen in einem Additionssystem zur Basis 10 mit der Hilfsbasis 5 dar. I 1 V 5 X 10 L 50 C 100 D 500 M 1000 Die Ziffern werden additiv in zehner und fünfer Blöcken gereiht. Nach der ursprünglichen Version können also maximal vier gleiche Zeichen hintereinander stehen. Die Zeichen sind der entsprechenden grösse nach absteigend sortiert. Beispiel: XXXXII = 42 Im Laufe der Zeit übernahm man aus anderen Zahlensystemen eine verkürzte Schreibweise, die sogenannte Subtraktionsregel. Nach ihr kann das nächst kleinere ZehnerpotenzZeichen (I, X, C, M) vor einem Zeichen stehen, was so viel bedeuted wie eine Subtraktion des kleineren vom grösseren Wert. Fünfer Blöcke dürfen nicht vorangestellt werden. Beispiel: IV = 4 (statt IIII) IX = 9 (statt VIIII) XL = 40 (statt XXXX) XC = 90 (statt LXXXX) Es ist nicht zulässig, mehr als ein einziges Zeichen subtraktiv zu verwenden (z.B. IIX statt VIII für 8, XXC statt LXXX für 80) Es ist nicht zulässig einem Zeichen auch seinem drittoder viertgrösseren Zeichen subtraktiv voranzustellen, also IL statt XLIX für 49, IC statt XCIX für 99 oder XM statt CMXC für 990 zu schreiben. Aufgabenstellung a) Schreiben sie ein MIPS Programm, das alle mit der Subtraktionsregel darstellbaren römischen Zahlen mit den den Ziffern I, V, X, L, C, D, M ins Zehnersystem mit arabischen Ziffern umwandelt. Überprüfen Sie zuerst, ob die Eingabe gültig ist und geben 1 Römische Zahlen GdI 3, WS 09/10 ggf eine Fehlermeldung als Ausgabe. Die grösste Zahl ist demnach: MMMDCCCLXXXVIII = 3888. Verwenden Sie den vorgegebenen Programmrahmen ”toRoman.asm” und vervollständigen Sie Diesen. b) Schreiben Sie ein MIPS Programm ”toDecimal.asm”, dass die natürlichen Zahlen bis 3888 in römischer Darstellung nach Subtraktionsschreibweise konvertiert. Überprüfen sie auch hier, ob die eingegebene Zahl gültig ist. Die Ein und Ausgabe soll (wie im Rahmenprogramm) mit Syscalls erfolgen. Eine ausführliche Dokumentation zu Syscalls finden Sie unter: http://courses.missouristate.edu/KenVollmar/MARS/Help/MarsHelpIntro.html Tipps zur Vorgehensweise Entwickeln oder suchen sie einen einfachen Algorithmus für die Transformationen der Zahlensysteme. Skizzieren Sie den Algorithmus in C oder Pseudocode und übertragen ihn zeilenweise in MIPS Code. Überprüfen sie die Richtigkeit ihrer Programme indem sie beide hintereinander ausführen und den resultierenden String mit der Eingabe vergleichen. Einreichen und Testieren Finaler Abgabetermin ist der 15.11.2009 um 23:59 Uhr. Die Abgabe erfolgt durch einen der Gruppenteilnehmer im Moodle. http://moodle.tu-darmstadt.de/ Als Login benötigen sie ihre TU-ID. Vermerken sie bitte sowohl in ihrem Quellcode als auch im Kommentarfeld bei der Abgabe sämtliche Gruppenteilnehmer einschliesslich Matrikelnummer. Die Ergebnisse werden vom jeweiligen Tutor für jeden Gruppenteilnehmer ins Webreg eingetragen (nicht im Moodle). Ihre Abgabe sollte umfassen: • toRoman.asm • toDecimal.asm Machen sie mit Ihrem Tutor einen Termin für das Testat aus. Nutzen Sie für weitere Fragen das Fachschaftsforum und die Sprechstunden. Viel Erfolg! 2 Römische Zahlen 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 # # # # GdI 3, WS 09/10 wandelt die eingegebene Dezimalzahl in eine roemische Zahl um Gruppenmitglieder : Donald Duck - 12345678 < - - - - - - - - - - - - - - - - - - - - - - - - - HIER IHRE GRUPPE .data Aufforderung : .asciiz " Bitte geben sie eine Dezimalzahl zwischen 1 und 3888 ein : " # < - - - - - - - - - - - - - - - - - - - - - - - - - HIER IHRE DATEN .text start : # print aufforderung li $v0 , 4 la $a0 , Aufforderung syscall # lese Zahl ein li $v0 , 5 syscall # setzte Parameter add $a0 , $v0 , $zero # < - - - - - - - - - - - - - - - - - - - - - - - - HIER IHR CODE ! li $v0 , 10 syscall # Programm beenden 3