| Zeile 12: | Zeile 12: | ||
Das erste Objekt, das wir uns genauer anschauen wollen, ist das gute alte Hello World (hello01.c): | Das erste Objekt, das wir uns genauer anschauen wollen, ist das gute alte Hello World (hello01.c): | ||
| − | <c>#include <stdio.h> | + | <syntaxhighlight lang=c>#include <stdio.h> |
int main(void) | int main(void) | ||
| Zeile 18: | Zeile 18: | ||
printf("Hello world!\n"); | printf("Hello world!\n"); | ||
return 0; | return 0; | ||
| − | }</ | + | }</syntaxhighlight> |
Wie wir alle wissen, lässt sich dieses Programm mit <i>gcc -m32 -o hello01 hello01.c</i> in eine ausführbare Datei hello01 kompilieren (ich produziere hier absichtlich eine 32-Bit-Datei auf meinem 64-Bit-System, weil noch nicht jeder ein 64-Bit-System hat und wir hinterher auch ein 32-Bit-System schreiben wollen). gcc ist aber nicht eine große Blackbox, die vom C-Code einlesen bis zur ausführbaren Datei alles macht, sondern ruft auch nur andere Programme auf, die die eigentlichen Teilschritte machen. Mit <i>--verbose</i> kann man sich diese Schritte anzeigen lassen: | Wie wir alle wissen, lässt sich dieses Programm mit <i>gcc -m32 -o hello01 hello01.c</i> in eine ausführbare Datei hello01 kompilieren (ich produziere hier absichtlich eine 32-Bit-Datei auf meinem 64-Bit-System, weil noch nicht jeder ein 64-Bit-System hat und wir hinterher auch ein 32-Bit-System schreiben wollen). gcc ist aber nicht eine große Blackbox, die vom C-Code einlesen bis zur ausführbaren Datei alles macht, sondern ruft auch nur andere Programme auf, die die eigentlichen Teilschritte machen. Mit <i>--verbose</i> kann man sich diese Schritte anzeigen lassen: | ||
| Zeile 171: | Zeile 171: | ||
Also frisch ans Werk: | Also frisch ans Werk: | ||
| − | <c>#define SYSCALL_EXIT 1 | + | <syntaxhighlight lang=c>#define SYSCALL_EXIT 1 |
#define SYSCALL_WRITE 4 | #define SYSCALL_WRITE 4 | ||
| Zeile 184: | Zeile 184: | ||
// sys_exit(0) | // sys_exit(0) | ||
asm("int $0x80" : : "a" (SYSCALL_EXIT), "b" (0)); | asm("int $0x80" : : "a" (SYSCALL_EXIT), "b" (0)); | ||
| − | }</ | + | }</syntaxhighlight> |
Wen es interessiert, die genaue Syntax des Inlineassemblers ist in [[Inline-Assembler mit GCC]] beschrieben. An dieser Stelle befülle ich einfach die Register mit den Parametern und löse dann den Interrupt 0x80 aus. Linken wollen wir dieses Mal selber, damit uns keine libc in die ausführbare Datei hineingezogen wird: | Wen es interessiert, die genaue Syntax des Inlineassemblers ist in [[Inline-Assembler mit GCC]] beschrieben. An dieser Stelle befülle ich einfach die Register mit den Parametern und löse dann den Interrupt 0x80 aus. Linken wollen wir dieses Mal selber, damit uns keine libc in die ausführbare Datei hineingezogen wird: | ||