EMZETT.
Login

Kurz: System-V-Argumente: rdi rsi rdx rcx r8 r9 (Rückgabe: rax) Syscall-Argumente: rax=Nr rdi rsi rdx r10 r8 r9 (Rückgabe: rax) Callee-saved: rbx rbp r12 r13 r14 r15 ```

Teil des Kurses Assembler (x86-64)

Kapitel 8 von 8 im Kurs Assembler (x86-64) (Abschnitt „Nachschlagen“). Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

Befehle im Überblick

GruppeBefehle
Daten bewegenmov, movzx, movsx, lea, xchg, push, pop, cmov*
Rechnenadd, sub, inc, dec, neg, imul, mul, idiv, div, adc, sbb
Logik/Bitsand, or, xor, not, shl, shr, sar, rol, ror, bt, test
Vergleichcmp, test, set*
Sprüngejmp, je/jne, jl/jle/jg/jge, jb/ja, js, jc, loop
Funktionencall, ret, leave, enter
Stringsmovsb, stosb, lodsb, scasb, cmpsb, rep, repe
Systemsyscall, int 0x80, cpuid, rdtsc, nop, hlt
Fließkomma/SIMDmovsd, addsd, mulsd, sqrtsd, cvtsi2sd, movdqu, paddd, addps

Register-Schnellübersicht

Allgemein:   rax rbx rcx rdx rsi rdi rbp rsp r8-r15
32 Bit:      eax ebx ecx edx esi edi ebp esp r8d-r15d
16/8 Bit:    ax bx cx dx / al bl cl dl (ah bh ch dh)
Sonstige:    rip (Befehlszeiger)  rflags (Flags)  xmm0-xmm15 / ymm0-ymm15
 
System-V-Argumente:  rdi rsi rdx rcx r8 r9   (Rückgabe: rax)
Syscall-Argumente:   rax=Nr  rdi rsi rdx r10 r8 r9   (Rückgabe: rax)
Callee-saved:        rbx rbp r12 r13 r14 r15

Bedingte Sprünge nach cmp a, b

Bedingungvorzeichenbehaftetvorzeichenlos
a == bjeje
a != bjnejne
a < bjljb
a <= bjlejbe
a > bjgja
a >= bjgejae

Typische Muster

section .bss
    puffer resb 32
 
section .text
    global _start
 
_start:
    xor rax, rax                 ; rax = 0
    mov rax, 5
    lea rbx, [rax + rax*4]       ; rbx = rax * 5 (ohne imul)
    mov rax, rbx
    call ausgabe_zahl            ; 25
 
    mov rax, 17
    and rax, 15                  ; rax mod 16
    call ausgabe_zahl            ; 1
 
    mov rax, 100
    shr rax, 2                   ; rax / 4
    call ausgabe_zahl            ; 25
 
    mov rax, 8
    mov rbx, 3
    xchg rax, rbx                ; tauschen
    call ausgabe_zahl            ; 3
 
    mov rax, 5
    mov rbx, 9
    cmp rax, rbx
    cmovl rax, rbx               ; Maximum ohne Sprung
    call ausgabe_zahl            ; 9
 
    mov rax, 60
    xor rdi, rdi
    syscall
 
; --- Hilfsroutine: gibt die Zahl in RAX dezimal aus (mit Zeilenumbruch), alle Register bleiben erhalten ---
ausgabe_zahl:
    push rax
    push rbx
    push rcx
    push rdx
    push rsi
    push rdi
    mov rcx, puffer + 20        ; Ende des Puffers
    mov byte [rcx], 10          ; Zeilenumbruch ans Ende
    mov rbx, 10
.schleife:
    xor rdx, rdx
    div rbx                     ; RAX = RAX / 10, RDX = Rest
    add dl, '0'                 ; Ziffer in ASCII umwandeln
    dec rcx
    mov [rcx], dl
    test rax, rax
    jnz .schleife
    mov rax, 1                  ; write
    mov rdi, 1
    mov rsi, rcx
    lea rdx, [puffer + 21]
    sub rdx, rcx
    syscall
    pop rdi
    pop rsi
    pop rdx
    pop rcx
    pop rbx
    pop rax
    ret

Ausgabe:

25
1
25
3
9

Typische Fehler

SymptomUrsache
Segmentation faultZugriff auf ungültige Adresse; [ ] vergessen oder Zeiger nicht gesetzt
Programm läuft ins Leere und stürzt abexit-Systemaufruf fehlt
Falsche Zahl beim RechnenTeilregister (eax) füllt die oberen Bits mit 0; rdx vor div nicht gelöscht
div löst “Floating point exception” ausDivision durch 0 oder Quotient passt nicht in rax
Stack zerstörtpush/pop nicht ausgeglichen
error: symbol 'x' not definedLabel vergessen oder nicht global
Falsche Reihenfolge der OperandenIntel: mov ziel, quelle (AT&T-Syntax ist umgekehrt!)
Ausgabe fehltwrite mit falscher Länge oder falschem Dateideskriptor
Vorzeichen falschjl und jb verwechselt (vorzeichenbehaftet / -los)

AT&T- und Intel-Syntax

GNU-Werkzeuge (gcc -S, objdump ohne Option) zeigen standardmäßig die AT&T-Syntax: Quelle zuerst, Register mit %, Konstanten mit $.

Intel (NASM):  mov rax, 5          add rax, [rbx + 8]
AT&T (GAS):    movq $5, %rax       addq 8(%rbx), %rax

Weiterlernen

  • Intel/AMD-Handbücher (Intel SDM), Agner Fog “Optimizing Assembly” (agner.org/optimize)
  • NASM-Handbuch (nasm.us/doc), Programming from the Ground Up, x86-64 Assembly Language Programming with Ubuntu
  • Übungen: pwn.college, OverTheWire, Crackmes.one, Compiler Explorer (godbolt.org)
  • Wiki dieser Seite: Artikel zu Prozessoren, Sicherheit und Reverse Engineering

Merke

  • Intel-Syntax: befehl ziel, quelle; Systemaufrufe über rax + syscall
  • Sprünge nach cmp: vorzeichenbehaftet jl/jg, vorzeichenlos jb/ja
  • Funktionen: System-V-Konvention, Stack-Rahmen, Callee-saved-Register beachten
  • Werkzeuge: nasm, ld, objdump, gdb, strace, Compiler Explorer

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Fließkomma und SIMD

Alle Kapitel: Assembler (x86-64) im Überblick