Praktikum ASP Blatt 2 6 LEHRSTUHL FÜR RECHNERTECHNIK UND RECHNERORGANISATION Aspekte der systemnahen Programmierung bei der Spieleentwicklung T1 Organisatorisches T1.1 Handhabung der Boards 26.10.2015-30.10.2015 Arbeitsblatt 2 Vergessen Sie bitte nicht, am Ende ihrer Arbeit mit dem BeagleBoard xm die Stromversorgung auszustecken. Zuvor können Sie ihr BeagleBoard xm durch Eingabe des Befehls 1 s ystemctl poweroff in ein Terminal beenden. Sofern Sie sich nicht in einer root-shell befinden, müssen Sie dazu Ihr Passwort eingeben. Achten Sie bitte auch darauf, die microsd-karten nicht direkt aus dem BeagleBoard xm zu ziehen, sondern durch drücken gegen die Feder im microsd-karten-slot ausgeben zu lassen.
Praktikum ASP Blatt 2 7 T2 Wiederholung der theoretischen Grundlagen T2.1 Von-Neumann-Architektur Diskutieren Sie mit Ihrem Tutor und den Teilnehmern Ihrer Praktikumsgruppe das Von-Neumann-Konzept hinsichtlich seiner fünf Bestandteile. Ziehen Sie dazu Vergleiche zum modernen Rechner und überlegen Sie, inwieweit das damals vorgestellte Konzept in modernen Rechnerarchitekturen heute noch Gültigkeit besitzt. Die folgende Grafik kann Ihnen dabei als Gedächtnisstütze dienen: Befehle (Programm) E/A-Geräte (Benutzer), Peripherie
Praktikum ASP Blatt 2 8 T2.2 Die ARM-Architektur Machen Sie sich abermals mit den aus der Vorlesung bekannten Grundprinzipien der ARM-Architektur vertraut 2. Diskutieren Sie vorallem die von der Architektur definierten Aufgaben der Register r13-r15 sowie die Statusregister. Sprechen Sie auch über die Funktionsweise der Befehle add, mov, ldr, str, cmp, blx, b, push, pop und deren bedingte Entsprechungen, welche zusätzlich Suffixe wie eq, neq, le oder gt verwenden. Was ist der Unterschied zwischen den zwei Ausführungsmodi THUMB und ARM? T3 Von der Hochsprache zum Maschinenprogramm Ziel dieser Aufgabe wird es sein, ein generelles Verständnis für die Kette zu entwickeln, welche von einem Programm während des Kompilierungsvorgangs durchlaufen wird. Außerdem soll vermittelt werden, wo das Praktikum Aspekte der Systemnahen Programmierung und seine Inhalte einzuordnen sind. Betrachten Sie dazu zunächst das folgende Bild: 1. 2. 3. 4. Präprozessor Compiler Linker 1. Erklären Sie kurz die Grafik und erläutern Sie die einzelnen Schritte. Gehen Sie exemplarisch von folgendem C-Quelltext aus: 1 # include < s t d i o. h> 2 3 # i f d e f unix 4 i n t x = 2 1 ; 5 # e l s e 6 i n t x = 1 2 ; 7 # endif 8 9 i n t main ( i n t argc, char argv ) { 10 x = 2 ; 11 p r i n t f ( " The answer i s %d\n", x ) ; 12 return 0 ; 13 } 2 Alle architekturrelevanten Auskünfte über den Prozessor und die Assemblerbefehle erhalten Sie in der Online-Dokumentation http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc. dui0068b/cacbjbdg.html
Praktikum ASP Blatt 2 9 2. Versuchen Sie nun, die obigen Schritte am Beispiel der Aufgabe T3 von Blatt 1 nachzuvollziehen. Sie sollen dadruch ein Gefühl dafür entwickeln, was in DS-5 während der Softwareentwicklung im Hintergrund geschieht. DS-5 ist die Entwicklungsumgebung, welche von ARM für die Cortex-A Serie entwickelt wird. Die Verwendung von DS-5 wird auf dem kommenden Übungsblatt vorgestellt. Kompilieren Sie also das Beispielprogramm von Hand auf der Konsole. Loggen Sie sich dazu mittels SSH auf das BeagleBoard xm ein und erstellen Sie im Verzeichnis /home/alarm/gauss_ssh die Datei gauss.c (wenn noch nicht vorhanden): 1 cd ~/gauss_ ssh 2 touch gauss. c Verwenden Sie sodann Ihren Lieblingstexteditor (nano, vi oder den grafischen gnome-text-editor), um in der Datei gauss.c das folgende Programm abzuspeichern (sofern noch nicht in einer vorangegangenen Übung geschehen): 1 # include < s t d i o. h> 2 3 i n t main ( i n t argc, char argv ) { 4 i n t sum = 0 ; 5 i n t i = 0 ; 6 7 f o r ( i = 1 ; i <= 1 0 0 ; i ++) { 8 sum += i ; 9 } 10 11 p r i n t f ( " Die Summe a l l e r natü r l i c h e n Zahlen " \ 12 " von 1 b i s 100 b e t r ä gt %d.\n", sum) ; 13 14 return 0 ; 15 } Listing 1: gauss.c Kompilieren Sie die Datei mit dem Befehl 1 gcc gauss. c und machen Sie sich anhand der Abbildung oben klar, welche Punkte der Kette zu welchen Zeitpunkt durchlaufen wurden. Welche Rolle spielt die Datei mit dem Namen a.out dabei? Versuchen Sie die Ausgabe des folgenden Befehls zu verstehen: 1 nm g a. out
Praktikum ASP Blatt 2 10 3. Kompilieren Sie die Datei gauss.c nun mit folgendem Befehl: 1 gcc s t a t i c gauss. c Was hat sich verändert? An welcher Stelle der Kette von oben ist die Veränderung aufgetreten? Was lässt sich hinsichtlich von Größe, Portabilität und Kompatibilität der Datei a.out im Vergleich zwischen den beiden Kompilierungsvorgängen sagen? Welche Ausgabe liefert der Befehl ls -lh a.out für beide Versionen von a.out (mit und ohne -static kompiliert)? 4. Kompilieren Sie gauss.c abermals mit dem Parameter -static und führen Sie danach noch den folgenden Befehl aus: 1 s t r i p a. out Was ändert sich an der Datei a.out? (Verwenden Sie nm und ls.) 5. Wir kehren zurück zur dynamisch gelinkten Binärdatei und wollen nun den Assemblercode untersuchen. Verwenden Sie dazu den Befehl 1 objdump d a. out und versuchen Sie, die Schleife aus der Hochsprache im Assemblercode zu lokalisieren. Sehen Sie Optimierungspotential? Was geschieht mit dem Assemblercode, wenn Sie beim Kompilieren eine der Optionen -O0, -O1 oder -O2 verwenden? Hinweis: Die Ausgabe von objdump ist der Assemblercode des Programms im Format <adresse>: opcode_bytes opcode_mnemonic. Die Repräsentation des Programms findet sich ausschließlich in opcode_mnemonic. Verwenden Sie zur Orientierung die Folien aus der Vorlesung! 6. Sie sollten nun ein erstes grobes Bild davon haben, wie aus einer Hochsprache ein Maschinenprogramm wird. Ihnen sollte außerdem klar geworden sein, wie Assemblercode verwendet wird und was beim Kompilieren (mit gcc oder im Entwicklungsstudio DS-5 ) im Hintergrund geschieht. Klären Sie alle verbleibenden Fragen mit Ihrem Tutor.
Praktikum ASP Blatt 2 11 H1 Monoalphabetische Chiffren Die in der ersten Hausaufgabe behandelte ROT13-Verschlüsselung ist ein spezieller Fall der Klasse der sogenannten monoalphabetischen Substitutionschiffren. Wir werden in dieser Hausaufgabe die Implementierung von ROT13 etwas sicherer machen. 1. Implementieren Sie (sofern noch nich geschehen) eine Funktion ROT13 in C, mit der folgenden Signatur: void rot13(char *input); 2. Programmieren Sie eine weitere Funktion rotn, welche zusätzlich zur verschlüsselnden Zeichenkette auch noch einen Parameter n erhält, der angibt, um wie viele Stellen im Alphabet rotiert werden soll. void rotn(char *input, int n); 3. Wie viele Schlüssel sind bei der rotn-chiffre möglich? Wie viele Bit Sicherheit garantiert Ihnen das erweiterte Verfahren? Die Formel zum Bestimmen der Sicherheit in Bits ist S = log 2 (N) wobei N genau der Anzahl aller möglichen Schlüssel entspricht. Bewerten Sie das Ergebnis anhand der Tatsache, dass durchschnittliche Heimcomputer derzeit Schlüsselräume von der Größe 2 40 (für weitaus kompliziertere Chiffren) problemlos vollständig durchsuchen können. 4. Wie Sie sicherlich bemerkt haben, ist die Idempotenzeigenschaft für die Funktion ROT13 nicht mehr gegeben. (rotn(rotn(geheim, 7), 7)!= GEHEIM) Finden Sie eine Zuordnung y = f(x) zwischen dem Schlüssel x der zum Verschlüsseln verwendet wurde, und dem Schlüssel y, der zum Entschlüsseln des Geheimtextes verwendet werden muss. Definieren Sie zwei Makros #define ENCRYPT_ROTN(X, Y) und #define DECRYPT_ROTN(X, Y), die die Transformation des Schlüssels verstecken, sodass für Ver- und Entschlüsselung der gleiche Schlüssel Y verwendet werden kann: DECRYPT_ROTN(ENCRYPT_ROTN(X, Y), Y) 5. Entschlüsseln Sie folgenden, mit ROTN verschlüsselten Geheimtext ohne Kenntnis des geheimen Schlüssels n. (Es handelt sich um ein Palindrom.) Wduqh qlh hlqhq Udw. Es besteht keine Verpflichtung, diese Hausaufgaben abzugeben. Sie dienen lediglich der Übung und werden in der folgenden Tutorstunde besprochen.