Praktikum ASP – Blatt 4 22 L EHRSTUHL FÜR R ECHNERTECHNIK UND R ECHNERORGANISATION Aspekte der systemnahen Programmierung bei der Spieleentwicklung 16.11.2015 - 20.11.2015 Arbeitsblatt 4 T1 Calling Conventions Wir werden uns in dieser Aufgabe mit den sogenannten Calling Conventions auseinandersetzen, welche der Compiler beim Funktionsaufruf verwendet. Die folgende Grafik sollten Sie im Verlauf der Teilaufgaben ausfüllen: r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 1. Arbeiten Sie für diese Aufgabe entweder mit DS-5 oder direkt auf dem BeagleBoard xM . Fügen Sie Ihrem Code eine Unterfunktion int add_all(int a, int b, int c, int d) hinzu, welche vier Integer Variablen als Eingabeparameter akzeptiert und die Summe aller Zahlen zurückliefert. Rufen Sie diese in der Funktion main() mit den Werten 1, 2, 3, 4 auf. Kompilieren Sie Ihr Projekt und versuchen Sie, im Assemblercode den Aufruf der Unterfunktion zu lokalisieren. Wie werden die vier Parameter an die Unterfunktion übergeben? Hinweis: Um überhaupt einen Effekt beobachten zu können, müssen Sie sicher stellen, dass die automatische Codeoptimierung des Compilers deaktiviert ist. Praktikum ASP – Blatt 4 23 2. Fügen Sie nun Ihrer Unterfunktion einen fünften Parameter int e hinzu, welcher beim Aufruf den Wert 5 zugewiesen bekommt. Kompilieren Sie Ihr Programm erneut und untersuchen Sie, wie der zusätzliche fünfte Parameter übergeben wird. Was vermuten Sie, würde mit einem sechsten oder siebten Parameter hinsichtlich der Übergabe an die Unterfunktion geschehen? Überprüfen Sie Ihre Vermutung anhand eines geeigneten Beispiels. 3. Fügen Sie Ihrer Funktion einen lokalen Pointer auf eine Integervariable namens first_two hinzu, welche den Wert der Summe der ersten beiden übergebenen Parameter a und b zugewiesen bekommt und geben Sie diesen Wert innerhalb der Funktion aus. Kompilieren Sie Ihr Programm neu und werfen Sie nun einen Blick auf die Assemblerrepräsentation der aufgerufenen Funktion add_all bei einfacher Optimierungsstufe (Compilerflag -O1). Was geschieht in der Unterfunktion mit den Aufrufeparamtern der Funktion? Können Sie einen Zusammenhang zwischen der ersten Instruktion innerhalb der Unterfunktion und der Verwendung der Register r4 bis r10 herstellen? 4. Kompilieren Sie das gleiche Programm nun ohne Optimierung (-O0) und untersuchen Sie den Assemblercode auf neu entstehende Speicherzugriffe hin. Welche Rolle spielt dabei das Register namens fp? 5. Welchen Zweck hat das Register r12 in der Calling Convention des GCC-Compilers? 6. Vervollständigen Sie die (Ihnen aus früheren Einheiten wohlbekannten) fehlenden drei Registernamen. Welchen speziellen Zweck verfolgen diese? Warum unterscheidet sich ihr genereller Nutzen von den oben genannten Teilen der Calling Convention? T2 Anwendung der Calling Conventions In dieser Aufgabe werden wir die Calling Conventions in der Praxis anwenden. Ziel ist es, eine Funktion void _asm_xor_cipher(char *str, char key); in ARM-Assembler in einer eigenen Datei zu implementieren, welche einen String übergeben bekommt und dann jeden einzelnen Buchstaben des Strings mit der binären XOR-Operation mit der Konstante key verrechnet. 1. Machen Sie sich klar, wie der binäre XOR-Operator funktioniert! Füllen Sie dazu Tabelle 1 aus. Schlagen Sie sodann in der offiziellen ARM-Dokumentation nach, welcher Opcode den XOR-Operator in ARM-Assembler implementiert. Praktikum ASP – Blatt 4 24 ⊕ 0 1 0 1 Tabelle 1: Der binäre XOR-Operator 2. Wir werden von nun an mit einer Projektvorlage arbeiten, die uns das Erstellen und Konfigurieren neuer Projekte für das BeagleBoard xM in DS-5 erleichtert. Sie finden diese Vorlage als Rahmenprogramm_DS5.zip unter https://gepasp.in.tum. de/blaetter#04 bei den Downloads zu diesem Arbeitsblatt. 1 a) Laden Sie die Projektvorlage herunter. b) Importieren Sie das Projekt in DS-5: i. File → Import... ii. General → Existing Projects into Workspace → Next > iii. Select archive file: → Browse... iv. Wählen Sie die heruntergeladene Datei Rahmenprogramm.zip aus. (Finish) c) Um nun das Projekt XOR mit der Source-Datei main.c zu erstellen, führen Sie folgende Schritte aus: i. Benennen Sie das Projekt in XOR um. ii. Benennen Sie die Datei default.c in main.c um. iii. Benennen Sie die Datei nop.S in worker.S um. iv. Ersetzen Sie im Makefile die Zeile TARGET = default durch TARGET = main und die Zeile ASM_TARGET = nop durch ASM_TARGET = worker und speichern Sie das Makefile. Machen Sie sich besonders den Zusammhang zwischen Umbenennung der Dateien und den Änderungen im Makefile klar. 3. Um sicherzustellen dass Sie alle Änderungen korrekt durchgeführt haben, kompilieren Sie ihr Projekt mit Build Project und erstellen Sie eine entsprechende Debug Configuration um es auf dem BeagleBoard xM auszuführen. 4. Fügen Sie Ihrem C-Programm die üblichen benötigten Zeilen hinzu, die dafür sorgen, dass die von der Kommandozeile an das C-Programm übergebenen Argumente als Parameter für die Funktion _asm_xor_cipher verwendet werden. Geben Sie den Inhalt der Variable str nach dem Funktionsaufruf per printf auf die Kommandozeile aus. 1 Falls Sie lieber direkt auf einem BeagleBoard xM arbeiten wollen, finden Sie eine Version des Rahmenprogramms dafür als Rahmenprogramm_manuell.tar.gz. Praktikum ASP – Blatt 4 25 Hinweis: In der Projektvorlage befinden sich bereits einige Kommentare und Hinweise, die ihnen später bei der Strukturierung ihrer Projektaufgabe helfen sollen. Diese gehen über die Aufgabe hinaus und können vorerst ignoriert werden. 5. Fügen Sie Ihrem C-Programm oberhalb der Funktion main die folgende Zeile hinzu und diskutieren Sie ihre Bedeutung. Gehen Sie auf den Unterschied zwischen Deklaration und Definition (in Programmiersprachen generell) ein. extern _asm_xor_cipher(char *str, int key); 6. Ihr C-Rahmen ist damit vollständig. Speichern Sie die Änderungen und passen Sie die Datei worker.S so an, dass die _asm_xor_cipher Funktion definiert und exportiert wird: 1 . g l o b l _asm_xor_cipher 2 3 . code 32 4 5 6 # # _asm_xor_cipher ( char ∗ s t r , i n t key ) ; _asm_xor_cipher : 7 8 # # I h r Code Diskutieren Sie die Funktion jeder Zeile mit Ihrem Tutor. 7. Implementieren Sie unter Einhaltung der Calling Conventions den Rumpf der Funktion _asm_xor_cipher, die die oben genannte Funktionalität besitzt. Wie werden die Argumente an die Funktion übergeben? Was müssen Sie hinsichtlich des Rücksprungs in den C-Rahmen berücksichtigen? 8. Überprüfen Sie Ihren Programmcode anhand eines selbstgewählten Beispiels. Hinweis: In DS-5 können Kommandozeilenparameter direkt in der DebuggerKonfiguration im Arguments Tab eingeben werden. Praktikum ASP – Blatt 4 26 H1 Entwickeln Sie Ihr Rahmenprogramm! Diese Hausaufgabe stellt eine wichtige Vorbereitung für Ihre Praktikumsausarbeitung dar. - Diese Hausaufgabe ist verpflichtend! Ihre heutige Hausaufgabe besteht aus dem Anlegen eines Rahmenprogramms für die bevorstehenden Projektaufgaben. H1.1 Vorlage Sie finden eine Vorlage für dieses Rahmenprogramm, die Sie in DS-5 einfach importieren können, unter https://gepasp.in.tum.de/blaetter#04 bei den Downloads zu diesem Arbeitsblatt. 1. Laden Sie die Projektvorlage herunter. 2. Importieren Sie das Projekt in DS-5: a) File → Import... b) General → Existing Projects into Workspace → Next > c) Select archive file: → Browse... d) Wählen Sie die heruntergeladene Datei Rahmenprogramm.zip aus. (Finish) 3. Jetzt können Sie das Projekt wie gewohnt über Build Project kompilieren und mit Hilfe einer neuen Debug Configuration auf dem BeagleBoard xM ausführen und debuggen. In der Vorlage befinden sich auch Hinweise die Ihnen dabei helfen sollen, Ihr Programm für die Projektaufgabe passend zu strukturieren. Diese gehen über die heutige Hausaufgabe hinaus. H1.2 Aufgabe Der Projektrahmen soll aus den zwei Dateien main.c sowie worker.S bestehen. 1. Implementieren Sie die main()-Funktion. Diese übernimmt folgende Aufgaben: a) Einlesen von Parametern und Daten von der Kommandozeile, der Standardeingabe oder aus Dateien. b) Alloziieren (und freigeben!) von Heap-Speicher, falls dieser benötigt wird. c) Aufrufen der Assembler-Funktion die den Programm- Algorithmus implementiert d) Ausgeben der Ergebnisse e) Test-Code: Aufruf der Assembler-Funktion mit sinnvoll gewählten Eingaben, die mit erwarteten Ergebnissen verglichen werden. f) Zeitmessung und Analyse Praktikum ASP – Blatt 4 27 2. Schreiben Sie sodann die Assembler-Funktion in der Assembler-Code- Datei. Folgendes muss in dieser Funktion passieren: a) Sichern von Registern auf dem Stack b) Anlegen eines Stackframes (FP setzen) c) Rücksprung nach Wiederherstellung des Stackframes und der Register Sollten Sie auf Probleme stoßen, können Sie sich an der vorangegangenen Tutoraufgabe orientieren. Implementieren Sie ein kompilierbares und lauffähiges Programm! Hinweis: Natürlich ist dieser Ansatz sehr generisch. Sie werden Ihr Rahmenprogramm für die konkrete Aufgabenstellung später noch etwas anpassen müssen (z.B. in der Zahl und Art der übergebenen Parameter). Diese Aufgabe soll Ihnen den Start in die Projektaufgaben erleichtern, nutzen Sie daher die Chance und sorgen Sie verlässlich dafür, dass Sie bis zur nächsten Einheit einen funktionierenden ( = ohne Fehler kompilierenden) Projektrahmen vorweisen können! 2 2 Auf dem nächsten Arbeitsblatt werden Sie lernen, wie Sie git benutzen, um den Code Ihres Projekts zu verwalten und zu synchroniseren.
© Copyright 2025 ExpyDoc