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 |