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 |