ASP Blatt 04 - GEP-ASP

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.