Das erste Programm assemblieren, linken und ausführen

Nun ist es soweit, wir werden unser erstes Programm mit NASM assemblieren und ausführen :-)

Code abspeichern

Hier der Code des ersten Beispiels, das üblicherweise einem „Hello World“-Programm entspricht:

section .data
    HelloString: db "Hallo Welt!",10
    HelloStringLength equ $ - HelloString
 
section .text
    global _start
    _start:
        mov rax, 4
        mov rbx, 1
        mov rcx, HelloString
        mov rdx, HelloStringLength
        int 0x80
        mov rax, 1
        mov rbx, 0
        int 0x80

Keine Angst, es ist natürlich noch nicht notwendig auch nur ansatzweise zu verstehen was dieser Code macht ;-)
Dieser Code wird in der Datei „first.asm“ gespeichert. „.asm“ ist eine gängige Dateierweiterung für Assembler-Code, wir machen hier auch keine Ausnahme.

Code assemblieren

Nun können wir unseren Assembler-Code in echten Binär-Code umwandeln, den der Prozessor versteht. Da es verschiedene Formate für ausführbare Dateien gibt, muss das Ausgabeformat beim Assemblieren mit dem „-f“-Flag angegeben werden. Linux verwendet für ausführbare Dateien das format ELF. Da wir für ein 64-bit System assemblieren, lautet unser Format „elf64“. Dadurch ergibt sich folgender Befehl zum Assemblieren:

$ nasm -f elf64 first.asm

Dieser Befehl liefert normal keine Ausgabe in der Konsole, legt aber eine Objektdatei „first.o“ an.

Objektdatei linken

Eine Objektdatei ist eine rohe Binärdatei, die so aber noch nicht ausgeführt werden kann. Dafür muss sie erst mit dem Linker zu einer echten ausführbaren Datei umgewandelt werden. Um das zu tun, wird dem Linker ld einfach die Binärdatei als Parameter übergeben. Dadurch wird eine ausführbare Datei mit dem Namen „a.out“ angelegt. Der Name dieser Datei kann über den „-o“-Flag verändert werden. Wollen wir unser Programm als „first“ speichern, wird der Linker folgendermaßen ausgeführt:

$ ld first.o -o first

Programm ausführen

Das Programm kann nun wie jedes andere aus der Konsole aufgerufen werden:

$ ./first 
Hallo Welt!
$

Abschließendes

So weit, so gut :-)
Wir haben es nun geschafft unseren ersten Assembler-Code in ein ausführbares Programm umzuwandeln. Dieses Kapitel dient hauptsächlich dem Testen der Entwicklungs-Umgebung. Die für das Verständnis des Codes notwendigen Mechanismen werden in den folgenden Kapiteln erklärt.