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 erzeugen
  • nasm -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 Linker
  • as 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], rbx
  • add/sub/imul/idiv – Arithmetik, inc/dec – Zähler
  • cmp – Vergleich, jmp/je/jne/jg/jl – Sprünge
  • push/pop – Werte auf den Stack legen/holen
  • call/ret – Unterprogramm aufrufen/zurückkehren
  • lea – Adresse berechnen, and/or/xor/not – Bitoperationen
  • syscall – Linux-Systemaufruf (Nummer in rax, Argumente in rdi,rsi,rdx)
  • section .data/.bss/.text – Daten, uninitialisierte Daten, Code
  • db/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.