Assembler-Programmierung für x86-Prozessoren/ Befehlsreferenz
Dieses Kapitel beschreibt die Assembler-Syntax in der Intelschreibweise.
Die Syntaxbeschreibungen bestehen jeweils aus drei Teilen: Dem Opcode in hexadezimal, der eigentlichen Syntax und dem Prozessor, seit dem der Befehl existiert. Der Opcode-Aufbau soll in Zukunft in einem eigenen Kapitel beschrieben werden. Die Syntax hat die folgenden Bedeutungen:
- r8: Eines der folgenden 8-Bit-Register kann verwendet werden: AH, AL, BH, BL, CH, CL, DH oder DL
- r16: Eines der folgenden 16-Bit-Register kann verwendet werden: AX, BX, CX oder DX; BP, SP, DI oder SI
- r32: Eines der folgenden 32-Bit-Register kann verwendet werden: EAX, EBX, ECX oder EDX; EBP, ESP, EDI oder ESI
- imm8: Ein Bytewert zwischen –128 bis +127
- imm16: Ein Wortwert zwischen –32.768 bis +32.767
- r/m8: Der Wert kann entweder ein allgemeines 8-Bit-Register (AH, AL, BH, BL, CH, CL, DH oder DL) oder ein Bytewert aus dem Arbeitsspeicher sein
- r/m16: Der Wert kann entweder ein allgemeines 16-Bit-Register (AX, BX, CX oder DX; BP, SP, DI oder SI) oder ein Bytewert aus dem Arbeitsspeicher sein
- SReg: Segmentregister
Der Aufbau des Opcodes hat die folgende Bedeutung:
- ib: Operation bezieht sich auf 8 Bit Daten. (byte)
- iw: Operation bezieht sich auf 16 Bit Daten. (word)
- id: Operation bezieht sich auf 32 Bit Daten. (double word)
- /0 bis /7, /r, r+b, r+w, r+d: Interne Information zum Aufbau des Maschinenbefehls
Wenn nicht explizit etwas anderes angegeben ist, haben die Flags die folgende Bedeutung:
- OF – Overflow Flag / Überlauf
- SF – Sign Flag / Vorzeichen
- ZF – Zero Flag / Ist 1 falls das Resultat 0 ist, sonst 0
- AF – Auxiliary Flag / Hilfs-Übertragsflag bei Übertrag von Bit 3 auf 4. Dies macht nur Sinn bei BCD-Zahlen
- PF – Parity Flag / Paritätsflag
- CF – Carry Flag / Übertrag
ADD (Add)
[Bearbeiten]ADD addiert zu einem Speicherbereich oder einem Register einen festen Wert oder den Wert eines Registers.
04 ib add AL, imm8 8086+ 05 iw add AX, imm16 8086+ 80 /0 ib add r/m8, imm8 8086+ 81 /0 iw add r/m16, imm16 8086+ 83 /0 ib add r/m16, imm8 8086+ 00 /r add r/m8, r8 8086+ 01 /r add r/m16, r16 8086+ 02 /r add r8, r/m8 8086+ 03 /r add r16, r/m16 8086+ 05 id add eax,imm32 80386+ 81 /0 id add r/m32, imm32 80386+ 83 /0 ib add r/m32, imm8 80386+ 01 /r add r/m32, r32 80386+ 03 /r add r32, r/m32 80386+
Flags:
- OF, SF, ZF, AF, CF, PF
Beispiel:
ADD eax,10 ADD eax,ebx
ADC (Add with carry)
[Bearbeiten]ADC addiert zu einem Speicherbereich oder einem Register einen festen Wert sowie das Carry-Flag oder den Wert eines Registers.
14 ib adc AL, imm8 8086+ 15 iw adc AX, imm16 8086+ 80 /2 ib adc r/m8, imm8 8086+ 81 /2 iw adc r/m16, imm16 8086+ 83 /2 ib adc r/m16, imm8 8086+ 10 /r adc r/m8, r8 8086+ 11 /r adc r/m16, r16 8086+ 12 /r adc r8, r/m8 8086+ 13 /r adc r16, r/m16 8086+ 15 id adc EAX,imm32 80386+ 83 /2 ib adc r/m32, imm8 80386+ 11 /r add r/m32, r32 80386+ 13 /r add r32, r/m32 80386+
Flags:
- OF, SF, ZF, AF, CF, PF
AND
[Bearbeiten]Verknüpft die Operanden durch ein logisches AND.
24 ib and AL, imm8 8086+ 25 iw and AX, imm16 8086+ 80 /4 ib and r/m8, imm8 8086+ 81 /4 iw and r/m16, imm16 8086+ 83 /4 ib and r/m16, imm8 8086+ 20 /r and r/m8, r8 8086+ 21 /r and r/m16, r16 8086+ 22 /r and r8, r/m8 8086+ 23 /r and r16, r/m16 8086+ 25 id and EAX, imm32 80386+ 81 /4 id and r/m32, imm32 80386+ 21 /r and r/m32, r32 80386+ 83 /4 ib and r/m32, imm8 80386+ 23 /r add r32, r/m32 80386+
Flags:
- OF und CF werden gelöscht
- SF, ZF und PF
- AF ist undefiniert
CLC (Clear Carry Flag)
[Bearbeiten]Löscht das Carry-Flag.
F8 clc 8086+
Flags:
- CF wird gelöscht
CLI (Clear Interrupt Flag)
[Bearbeiten]Löscht das Interrupt-Flag. Die CPU bearbeitet keine Interrupt-Requests (Hardware-Interrupts) mehr.
FA cli 8086+
Flags:
- IF wird gelöscht
CMC (Complement Carry Flag)
[Bearbeiten]Dreht den Wahrheitswert des Carry-Flags um.
F4 cmc 8086+
Flags:
- CF -Wert wird invertiert; [ 0==>1 | 1==>0 ]
DEC (Decrement)
[Bearbeiten]Subtrahiert 1 vom Zieloperanden.
FE /1 dec r/m8 8086+ FF /1 dec r/m16 8086+ 48 r+w dec r16 8086+ FF /1 dec r/m32 80386+ 48 r+w dec r32 80386+
Flags:
- OF, SF, ZF, AF, PF
- Das Carry-Flag wird nicht beeinflust
Beispiel:
DEC eax DEC [eax]
DIV (Unsigned Divide)
[Bearbeiten]Dividiert das AX-, DX:AX- oder EDX:EAX-Register durch den Quelloperanden und speichert das Ergebnis im AX-, DX:AX- oder EDX:EAX-Register.
F6 /6 div r/m8 8086+ F7 /6 div r/m16 8086+ F7 /6 div r/m32 80386+
Flags:
- CF, OF, SF, ZF, AF und PF sind undefiniert
IMUL (Signed Multiply)
[Bearbeiten]Multipliziert eine vorzeichenbehaftete Zahl.
F6 /5 imul r/m8 8086+ F7 /5 imul r/m16 8086+ F7 /5 imul r/m32 80386+ 0F AF /r imul r16, r/m16 80386+ 0F AF /r imul r32, r/m32 80386+ 6B /r ib imul r16, r/m16, imm8 80186+ 6B /r ib imul r32, r/m32, imm8 80386+ 6B /r ib imul r16, imm8 80186+ 6B /r ib imul r32, imm8 80386+ 69 /r iw imul r16, r/m16, imm16 80186+ 69 /r id imul r32, r/m32, imm32 80386+ 69 /r iw imul r16, imm16 80186+ 69 /r id imul r32, imm32 80386+
Flags:
- Wenn
imul
nur einen Operanden hat, ist das Carry-Flag und das Overflow-Flag gesetzt, wenn ein Übertrag in die höherwertige Hälfte des Ergebnisses stattfindet. Passt das Ergebnis exakt in die untere Hälfte des Ergebnisses werden Carry- und Overflow-Flag gelöscht. Hatimul
zwei oder drei Operanden, wird das Carry- und Overflow-Flag zu groß für den Zieloperanden, andernfalls wird es gelöscht - SF, ZF, AF und PF sind undefiniert
INC (Increment)
[Bearbeiten]Addiert 1 zum Zieloperanden.
FE /0 inc r/m8 8086+ FF /0 inc r/m16 8086+ 40 r+w inc r16 8086+ FF /6 inc r/m32 80386+ 40 r+d inc r32 80386+
Flags:
- OF, SF, ZF, AF, PF
- Das Carry-Flag wird nicht beeinflusst
Beispiel:
INC eax INC [eax]
INT (Interrupt)
[Bearbeiten]INT löst einen Software-Interrupt aus. Dies ist vergleichbar mit dem Aufruf eines Unterprogramms (hier ein Interrupt-Handler). Über die allgemeinen CPU-Register können dem Interrupt-Handler Werte übergeben werden. Der Interrupt-Handler kann über diese Register auch Werte zurückliefern. Nach INT steht eine Interrupt-Nummer, die zwischen 00h und FFh liegt. Über diese kann man die Lage der Einsprungadresse für den entsprechenden Interrupt-Handler in der Interrupt-Vektor-Tabelle ermitteln. Der Interrupt-Befehl 3 dient beispielsweise als Haltepunkt beim Debuggen eines Programms. Dieser ist daher auch als Ein-Byte-Befehl zusätzlich vorhanden.
CC int3 8086+ CD int imm8 8086+
Flags:
(keine)
Beispiel:
MOV ah,4Ch; Der Wert 4Ch (= Beenden des Programms) wird dem Interrupt-Handler übergeben INT 21h; Der Interrupt-Handler wird aufgerufen. Die Interrupt-Nummer ist 21h (MS-DOS).
IRET (Interrupt Return)
[Bearbeiten]Rückkehr aus dem Interrupt-Handler, welcher mit INT aufgerufen wurde. Dieser Befehl ist vergleichbar mit RET, jedoch werden hier die Flags restauriert.
CF iret 8086+
Flags:
Alle Flag-Werte werden auf den Zustand vor dem Interrupt zurückgesetzt.
MOV (Move)
[Bearbeiten]Mit dem MOV Befehl wird der zweite Operand in den ersten Operanden kopiert.
88 /r mov r/m8, r8 8086+ 89 /r mov r/m16, r16 8086+ 8A /r mov r8, r/m8 8086+ 8B /r mov r16, r/m16 8086+ C6 /0 mov r/m8, imm8 8086+ C7 /0 mov r/m16, imm16 8086+ 8C /r mov r/m16, SReg 8086+ 8E /r mov SReg, r/m16 8086+ A0 mov al, moffs8 8086+ A1 mov ax, moffs16 8086+ A2 mov moffs8, al 8086+ A3 mov moffs16, ax 8086+
Flags:
(keine)
Beispiel:
mov eax,10 mov eax,ebx
MUL (unsigned Multiplication)
[Bearbeiten]Multipliziert den Zieloperanden mit dem AL-, AX- oder EAX-Register. Das Ergebnis wird im AX-, DX:AX- oder EDX:EAX-Register abgelegt (abhängig von der Größe des Zieloperanden). Der höherwertige Anteil des Ergebnisses befindet sich im AH-, DX- bzw. EDX-Register.
F6 /4 mul r/m8 8086+ F7 /4 mul r/m16 8086+ F7 /4 mul r/m32 80386+
Flags:
- OF und CF werden auf 0 gesetzt wenn der höherwertige Anteil des Ergebnisses 0 ist
NEG (Two’s Complement Negation)
[Bearbeiten]Bildet das Zweierkomplement indem der Operand von 0 abgezogen wird.
F6/3 neg r/m8 8086+ F7/3 neg r/m16 8086+ F7/3 neg r/m32 80386+
Flags:
- OF, SF, ZF, AF und PF
- Setzt das Carry-Flag auf 0, wenn das Ergebnis 0 ist, andernfalls wird es auf 1 gesetzt.
NOP (No Operation)
[Bearbeiten]Führt keine Aktion aus.
90 nop 8086+
(Der Opcode entspricht xchg ax,ax
bzw. xchg eax,eax
.)
Flags:
(keine)
NOT
[Bearbeiten]Dreht den Wahrheitswert der Bits um. Entspricht dem Einerkomplement.
F6 /2 not r/m8 8086+ F7 /2 not r/m16 8086+ F7 /2 not r/m32 80386+
Flags:
(keine)
OR
[Bearbeiten]Verknüpft die Operanden durch ein logisches ODER.
0C ib or AL, imm8 8086+ 0D iw or AX, imm16 8086+ 80 /1 ib or r/m8, imm8 8086+ 81 /1 iw or r/m16, imm16 8086+ 83 /1 ib or r/m16, imm8 8086+ 08 /r or r/m8, r8 8086+ 09 /r or r/m16, r16 8086+ 0A /r or r8, r/m8 8086+ 0B /r or r16, r/m16 8086+ 0D id or EAX, imm32 80386+ 81 /1 id or r/m32, imm32 80386+ 09 /r or r/m32, r32 80386+ 83 /1 ib or r/m32, imm8 80386+ 0B /r or r32, r/m32 80386+
Flags:
- OF und CF werden gelöscht
- SF, ZF und PF
- AF ist undefiniert
SBB (Subtraction with Borrow)
[Bearbeiten]SBB subtrahiert von einem Speicherbereich oder einem Register den Wert eines Speicherbereichs oder eines Registers und berücksichtigt dabei das Carry-Flag.
1C ib sbb AL, imm8 8086+ 1D iw sbb AX, imm16 8086+ 80 /3 ib sbb r/m8, imm8 8086+ 81 /3 iw sbb r/m16, imm16 8086+ 83 /3 ib sbb r/m16, imm8 8086+ 18 /r sbb r/m8, r8 8086+ 19 /r sbb r/m16, r16 8086+ 1A /r sbb r8, r/m8 8086+ 1B /r sbb r16, r/m16 8086+ 1D id sbb EAX, imm32 80386+ 81 /3 id sbb r/m32, imm32 80386+ 83 /3 ib sbb r/m32, imm8 80386+ 19 /r sbb r/m32, r32 80386+ 1B /r sbb r32, r/m32 80386+
Flags:
- OF, SF, ZF, AF, PF, CF
SHL (Shift Left)
[Bearbeiten]Verschiebt alle Bits im Register um x Stellen nach links. Mathematisch wird der Wert im Register zum Beispiel beim Verschieben um eine Stelle mit 2 multipliziert. Beim Multiplizieren mit 2, 4 und so weiter sollte statt MUL besser dieser Befehl eingesetzt werden, da er von der CPU schneller abgearbeitet wird.
shl r8,x 8086+ shl r16,x 8086+ shl r32,x 80386+
Flags:
- CF
Beispiel:
mov al,00000001b (al = 00000001b) shl al,1 (al = 00000010b)
SHR (Shift Right)
[Bearbeiten]Verschiebt alle Bits im Register um x Stellen nach rechts. Mathematisch wird der Wert im Register zum Beispiel beim Verschieben um eine Stelle durch 2 dividiert.
shr r8,x 8086+ shr r16,x 8086+ shr r32,x 80386+
Flags:
- ZF?
Beispiel:
mov al,00000010b (al = 00000010b) shr al,1 (al = 00000001b)
STC (Set Carry Flag)
[Bearbeiten]Setzt das Carry-Flag.
F9 stc 8086+
Flags:
- CF
STI (Set Interrupt Flag)
[Bearbeiten]Setzt das Interrupt-Flag.
FB sti 8086+
Flags:
- IF
SUB (Subtract)
[Bearbeiten]SUB subtrahiert von einem Speicherbereich oder einem Register den Wert eines Speicherbereichs oder eines Registers.
2C ib sub AL, imm8 8086+ 2D iw sub AX, imm16 8086+ 80 /5 ib sub r/m8, imm8 8086+ 81 /5 iw sub r/m16, imm16 8086+ 83 /5 ib sub r/m16, imm8 8086+ 28 /r sub r/m8, r8 8086+ 29 /r sub r/m16, r16 8086+ 2A /r sub r8, r/m8 8086+ 2B /r sub r16, r/m16 8086+ 2D id sub EAX, imm32 80386+ 81 /5 id sub r/m32, imm32 80386+ 83 /5 ib sub r/m32, imm8 80386+ 29 /r sub r/m32, r32 80386+ 2B /r sub r32, r/m32 80386+
Flags:
- OF, SF, ZF, AF, PF, CF
Beispiel:
SUB eax,10 SUB eax,ebx
XCHG (Exchange)
[Bearbeiten]Der erste und zweite Operand wird vertauscht.
90+rw xchg ax, r16 8086+ 90+rw xchg r16, ax 8086+ 86 /r xchg r/m8, r8 8086+ 86 /r xchg r8, r/m8 8086+ 87 /r xchg r/m16, r16 8086+ 87 /r xchg r16, r/m16 8086+
Flags:
(keine)
XOR
[Bearbeiten]Verknüpft die Operanden durch ein logisches exklusives Oder (Antivalenz).
34 ib xor AL, imm8 8086+ 35 iw xor AX, imm16 8086+ 80 /6 ib xor r/m8, imm8 8086+ 81 /6 iw xor r/m16, imm16 8086+ 83 /6 ib xor r/m16, imm8 8086+ 30 /r xor r/m8, r8 8086+ 31 /r xor r/m16, r16 8086+ 32 /r xor r8, r/m8 8086+ 33 /r xor r16, r/m16 8086+ 35 id xor EAX, imm32 80386+ 81 /6 id xor r/m32, imm32 80386+ 31 /r xor r/m32, r32 80386+ 83 /6 ib xor r/m32, imm8 80386+ 33 /r xor r32, r/m32 80386+
Flags:
- OF und CF werden gelöscht
- SF, ZF und PF
- AF ist undefiniert