Assembly – die Sprache der CPU
Assembly ist die maschinennahe Programmiersprache: Jede Anweisung entspricht direkt einem Assembler-Befehl der CPU. Sie wird eingesetzt, wenn maximale Kontrolle über Speicher und Register gefragt ist – etwa in Betriebssystem-Kernen, Bootloadern, Treibern oder Embedded-Systemen. Der verbreitetste freie Assembler ist NASM (Netwide Assembler) für x86/x64, ergänzt um GAS (GNU Assembler, AT&T-Syntax).
Assemblieren und Linken
nasm -f elf64 prog.asm– 64-Bit-ELF-Objektdatei erzeugennasm -f bin prog.asm -o prog.bin– reines Binärformat (Bootloader)gcc -no-pie -o prog prog.o– Objektdatei linken (ohne PIE für einfache Adressen)ld -o prog prog.o– direkt mit dem Linkeras prog.s -o prog.o/objdump -d prog– GAS assemblieren / Disassembly ansehen
Register, Speicher und der Stack
section .data
msg db "Hallo", 10
len equ $ - msg
section .text
global _start
_start:
mov rax, 1 ; syscall write
mov rdi, 1 ; stdout
mov rsi, msg ; Adresse des Strings
mov rdx, len ; Laenge
syscall
mov rax, 60 ; syscall exit
xor rdi, rdi ; Rueckgabewert 0
syscall
mov– Daten kopieren:mov rax, 1,mov [addr], rbxadd/sub/imul/idiv– Arithmetik,inc/dec– Zählercmp– Vergleich,jmp/je/jne/jg/jl– Sprüngepush/pop– Werte auf den Stack legen/holencall/ret– Unterprogramm aufrufen/zurückkehrenlea– Adresse berechnen,and/or/xor/not– Bitoperationensyscall– Linux-Systemaufruf (Nummer inrax, Argumente inrdi,rsi,rdx)section .data/.bss/.text– Daten, uninitialisierte Daten, Codedb/dw/dd– Bytes/Wörter/Doppelwörter definieren,equ– Konstante
Die CPU-Register rax bis r15 (64-Bit) sind die „Arbeitsvariablen“ der CPU; 32-Bit-Schreibzugriffe wie eax setzen die obere Hälfte automatisch auf null.
Systemaufrufe auf Linux
Anders als bei C gibt es keine Laufzeitbibliothek: Der Aufruf des Betriebssystems läuft direkt über syscall mit der Syscall-Nummer in rax und bis zu sechs Argumenten in rdi, rsi, rdx, r10, r8, r9. Die Syscall-Tabelle findet sich in /usr/include/asm/unistd_64.h.
Verwandte Einträge: Assembler, Adresse (Speicher), Stack, Kernel, Bootloader sowie C und C++ für die höhere Systemprogrammierung.