Assembler Anweisungen

die wichtigsen Anweisungen und Register

Ein Compiler nutzen nur eine Teilmenge der Instruktionen, die von der CPU unterstützt wird. Dahr muss man nicht alle Assembler-Instruktionen kennen, wenn man von einem Compiler erzeugten Maschinen-Code lesen will.

Hier ein Auszug der wichtigsten Assembler Register/Anweisungen:

Register

32-Bit 64-Bit Bemerkung
EAX RAX Ergebnis vieler Anweisungen (z.B. Add), Rückgabewert von Funktionen.
EBX RBX Allg. Register
ECX RCX Schleifenzähler für loop-Anweisungen.
EDX RDX EDX: Bei 64-Bit Ergebnissen der hohe Anteil (Gegenstück zu EAX). Sonst allg. Register
ESP RSP Stack-Pointer
EBP RBP Base-Pointer
- R8-R15 Allg. Register (nur 64-Bit)
ESI RSI Source Adresse für String Operationen
EDI RDI Destination Adresse für String Operationen
EIP RIP Adresse der aktuellen Anweisung.
EFL / EFLAGS RFL / (RFLAGS) Flags. Der VS-Debugger zeigt das Register EFLAGS als EFL an. 64-Bit: Die hohen 32-Bit sind resaviert und z.Z. immer 0 (Null).

Stack Manipulationen

Anweisung Beschreibung
push reg reg auf Stack speichern. (ESP -= sizeof(reg) )
pop reg reg von Stack laden. (ESP += sizeof(reg)
pusha, popa Alle Register auf dem Stack sichern. (Eigendlich nur in System Dlls)
enter Erzeugt einen Procedure Stack Frame.
leave Löscht einen Procedure Stack Frame. Entspricht: mov ESP, EBP ; pop EBP. Leave ist die letzte Anweisung vor ret.

Enter / Leasve

Enter wird von den aktuellen Compiler nicht verwendet, da die äquivalente mov/push Kombination schneller ist.

Im Release Mode verwenden die Microsoft Compiler Leave, da diese Anweisung wiederum schneller ist als das entsprechende mov/pop Äquivalent.

Funktionen

Anweisung Beschreibung
call addr Aufruf der Funktion an der Adresse addr.
ret Rücksprung aus einer Funktion.

Vergleich

Anweisung Beschreibung
test Logischer Vergleich
cmp Numerischer Vergleich
jXX Sprung mit Bedingung. Basierend auf einem Aufruf von test oder cmp.
je Jump if Equal
jne Jump if Not Equal
jz Jump if Zero
jnz Jump if Not Zero
jle Jump if Less Equal
... ...

Weitere häufige Anweisungen

Anweisung Beschreibung
mov dest,source Kopie von source nach dest. (Achtung: Kopie, kein Verschieben)
movzx dest,source Move mit auffüllen. Wenn ein kleinerer Wert (z.B. 16 Bit) in ein größeres Register (z.B. 32 Bit) kopiert werden soll, wird der freie Bereich mit Nullen aufgefüllt.
sub op1, op2 Subtraktion. Nicht nur für numerische Werte - wird auch für Stack-Manipulationen verwendet. (op1 = op1 - op2)
add op1, op2 Addition. (op1 = op1 + op2)
int 3 Debugger-Breakpoint
lea load effective address. Zugriff auf Speicher, der mittels Pointer oder Referenzen referenziert wird.
jmp addr Sprung die Adresse addr (ohne EIP zu sichern)
nop No Operation. Diese Anweisung tut nichts.
xor logisches exclusives oder. Wird oftmals zum löschen von Werten benutzt (xor eax, eax für eax := 0)
rep XXX String operationen. Der Befehl wind n-fach durchgeführt, bzw. bis eine Zero Condition auftritt