Maximilian Krieg
Wissen, Technik & Erfahrungen
Wissen, Technik & Erfahrungen
Wissen, Technik & Erfahrungen

An ganz einfachen Programmen soll ermittelt werden, welchen Code ein Compiler erzeugt, wo welche Variablen abgefragt werden und wie ein call by value/ reference in ARM Assembler umgesetzt wird.
In einer Tabelle sind die elementaren Datentypen auszufüllen.
| Datentyp | Bit | kleinster Wert | größter Wert | Bemerkungen |
| Char | 8 | 0x80 / -128 | 0x7F / 127 | |
| short int | 16 | 0x8000 / -32768 | 0x7FFF / 32767 | |
| Int | (16)32(64) | 0x80000000 /-2.147.483.648 | 0x7FFFFFFF /2.147.483.647 | Abhängig von Compiler und System |
| unsigned int | 16 | 0 | 0xFFFFFFFF /2.147.483.648 | |
| long int | 32(64) | 0x80000000 /-2.147.483.648 | 0x7FFFFFFF /2.147.483.647 | Abhängig von Compiler und System |
| Float | 32 | ca. 3,4E-38 | ca. 3,4E38 | |
| double | 64 | ca. 1,7E-308 | ca. 1,7E308 | |
| long double | 80 | ca. 1,2E-4932 | ca. 1,2E4932 |
Anzugeben sind die folgenden Zahlen sowohl als int als auch als float.
| >Dezimal | >int | >float |
| >1 | >0x00000001 | >0x3F800000 |
| >-1 | >0xFFFFFFFF | >0xBF800000 |
| >65535 | >0x0000FFFF | >0x477FFF00 |
| >1,024*10³ | >0x00000400 | >0x44FFFFFF |
| >2.963.527.434.23 | >0x44FFFFFFFF | >0x4E8A0000 |
In einem C Programm werden zwei lokale Variablen angelegt, denen die Werte 0x1 und 0x2 zugewiesen werden. Das Programm soll übersetzt und der erzeugte Code dokumentiert werden.
49 int iLoc1 = 0x1;
0x8304 <main+248>: mov r3, #1 ; 0x1 // Variable 1 den Wert 0x1 zuweisen
0x8308 <main+252>: str r3, [r11, #-24] // und auf den Stack schieben
50 int iLoc2 = 0x2;
0x830c <main+256>: mov r3, #2 ; 0x2 // Variable 2 den Wert 0x2 zuweisen
0x8310 <main+260>: str r3, [r11, #-20] // und auf den Stack schieben 51
Anstelle von lokalen Variablen sollen nun globale Variablen benutzt werden und die Veränderung dokumentiert werden.
54 iGlob1 = 0x1;
0x8314 <main+264>: ldr r2, [pc, #72] ; 0x8364 <main+344>
0x8318 <main+268>: mov r3, #1 ; 0x1
0x831c <main+272>: str r3, [r2]
55 iGlob2 = 0x2;
0x8320 <main+276>: ldr r2, [pc, #64] ; 0x8368 <main+348>
0x8324 <main+280>: mov r3, #2 ; 0x2
0x8328 <main+284>: str r3, [r2]
56
Notiz: Wie man sieht werden die global definierten Variablen zunächst aus der data section geholt, modifiziert und schließlich wieder zurück geschrieben. Die Adressen der globalen Variablen findet man über den Befehl arm-eb63-elf-mn heraus.
Nun sollen zwei globale und zwei lokale Variablen angelegt und die Zuweisung „global=lokal“ gemacht werden.
58 iGlob1 = iLoc1;
0x832c <main+288>: ldr r2, [pc, #72] ; 0x837c <main+368>
0x8330 <main+292>: ldr r3, [r11, #-24]
0x8334 <main+296>: str r3, [r2]
59 iGlob2 = iLoc2;
0x8338 <main+300>: ldr r2, [pc, #64] ;
0x8380 <main+372>
0x833c <main+304>: ldr r3, [r11, #-20]
0x8340 <main+308>: str r3, [r2]
Notiz: Die globale Variable wird aus der data section geladen, die lokale Variable aus dem Stack. Anschließend erfolgt die Zuweisung. Durch eine höhere Optimierungsstufe wird die globale Variable direkt mit dem Wert der lokalen Variable initialisiert.
Es wird eine Funktion addition erstellt, die als Parameter zwei lokale und einer globale Variable übergeben kriegt.
63 addition(iLoc1,iLoc2,iGlob1);
0x833c <main+304>: ldr r2, [r11, #-108]
0x8340 <main+308>: ldr r1, [r11, #-112]
0x8344 <main+312>: ldr r3, [pc, #92] ;
0x83a8 <main+412>
0x8348 <main+316>: ldr r3, [r3]
0x834c <main+320>: mov r0, r2
0x8350 <main+324>: mov r2, r3
0x8354 <main+328>: bl
0x83b0 <addition>
Notiz: Es finden keine wesentlichen Änderungen im Vergleich zu Aufgabe 5 statt. Die höchste Optimierungsstufe lässt die Funktion vollständig verschwinden.