8086 Assembler:
Detaillierte Befehlsbeschreibung

Unvollständig in der Befehlsbeschreibung sind die mit späteren Prozessoren neu hinzugekommene Befehlserweiterungen und Befehle.

Zu den Beschreibungen der Flags:

Das betreffende Feld ist bei den Befehlsbeschreibungen leer, wenn das betreffende Flagbit durch den Befehl nicht verändert wird. Die sonstigen Zeichen haben die folgende Bedeutung:

Nach Ausführung des Befehls ist das Flagbit
? undefiniert,
± je nach Ergebnis gesetzt (1) oder gelöscht (0),
0 gelöscht (0),
1 gesetzt (1).

  • O Overflow Flag Überlaufkennzeichen
  • D Direction Flag Richtungskennzeichen
  • I Interrupt enable Flag Unterbrechungsfreigabekennzeichen
  • T Trap Flag Einzelschrittkennzeichen
  • S Sign Flag Vorzeichenbit
  • Z Zero Flag Nullkennzeichen
  • A AL Carry Flag Hilfsübertragungskennzeichen für AL
  • P Parity Flag Paritätskennzeichen
  • C Carry Flag Übertragskennzeichen


Zu den Abkürzungen:

imm = Direktwert
imm8 = Byte-Direktwert
imm16 = Wort-Direktwert
imm32 = Doppelwort-Direktwert

m = Speichervariable (memory)
m8 = Bytevariable
m16 = Wortvariable
m32 = Doppelwortvariable

r = Register
r8 = Byteregister (AL, Ah, ...)
r16 = Wortregister (AX, BX, ...)
r32 = Doppelwortregister (EAX, EBX, ...)

segr = Segmentregister

80286 im Protected Mode:

I/O PL I/O Privilege Level Maximale Zugriffsrechte für E/A Operationen
NT Nested Task Kennzeichen für verschachtelte Tasks

Ganz nach oben / Auswahl

AAA ASCII (bzw. BCD-ungepackt)- Korrektur nach einer Addition

wandelt den Inhalt im Al-Register in eine ungepackte BCD-Zahl. Das Ergebnis steht in AH und AL.

AAA überprüft das niederwertige Halbbyte von AL darauf, ob es eine gültige Dezimalziffer darstellt. Ist dies der Fall werden die Flags AF und CF zurückgesetzt. Enthält das Halbbyte einen Wert größer als 9 oder steht AF auf 1, muss die Zahl justiert werden. Dazu wird auf das AL-Register 6 addiert, das AH-Register erhöht und es wird CF gesetzt, um den Überlauf anzuzeigen.

Nach Ausführung des AAA-Befehls enthält das höherwertige Halbbyte von AL immer Nullen. Vorgehensweise des Befehls:
falls das niederwertige Halbbyte in AL > 9 oder AF= 1 dann:

  • AL = AL + 6
  • AH = AH + 1
  • AF = 1
  • CF = 1
  • lösche das höherwertige Halbbyte in AL
andernfalls:
  • AF = 0
  • CF = 0
  • lösche das höherwertige Halbbyte in AL
Beispiel zu AAAAHAL
vor Ausführung von AAA024A
nach Ausführung von AAA031
Der Hexadezimalwert 2A entspricht dem Dezimalwert 39.
OperandenFlags
keineODITSZAPC
???±?±

Ganz nach oben / Auswahl

AAD ASCII (bzw. BCD-ungepackt)- Justierung vor einer Division

wandelt eine ungepackte zweistellige BCD-Zahl in einen Binärwert um. Dazu wird die Zehnerstelle der BCD-Zahl in AH und die Einerstelle in AL übergeben. AAD multipliziert AH mit 10, addiert AH auf AL und löscht abschließend AH. Vorgehensweise des Befehls:
  • AL = (AH * 10) + AL
  • AH = 0
Beispiel zu AADAHAL
vor Ausführung von AAD0308
nach Ausführung von AAD0026
Der Hexadezimalwert 26 entspricht dem Dezimalwert 38.
AAD muss stets vor einer Division mit BCD-Zahlen ausgeführt werden, um zu gewährleisten, dass das Divisionsergebnis ebenfalls eine gültige BCD-Zahl darstellt. AAD kann auch benutzt werden, um eine ungepackte BCD-Zahl in eine Hexadezimalzahl umzuwandeln.

OperandenFlags
keineODITSZAPC
?±±?±?

Ganz nach oben / Auswahl

AAM ASCII (bzw. BCD-ungepackt)- Korrektur nach einer Multiplikation

wandelt das Ergebnis einer Multiplikation in zwei gültige ungepackte BCD-Zahlen. AAM geht davon aus, dass sich das Produkt aus der Multiplikation in AL befindet. Nach der Ausführung des AAM-Befehls enthalten die höherwertigen Halbbytes von AL und AH Nullen. In AH steht die Zehnerstelle, in AL steht die Einerstelle. Die Halbbytes von AH und AL enthalten Werte im Bereich 0 bis 9 einschließlich. Vorgehensweise des Befehls:
  • AH = AL / 10
  • AL = Divisionsrest
OperandenFlags
keineODITSZAPC
?±±?±?

Ganz nach oben / Auswahl

AAS ASCII (bzw. BCD-ungepackt)- Korrektur nach einer Subtraktion

wandelt des Inhalt des AL-Registers in eine ungepackte Dezimalzahl.

AAS justiert das Ergebnis einer dezimalen Subtraktion, wobei sich das Ergebnis der Subtraktion im AL-Register befinden muss. Dazu untersucht AAS das niederwertige Halbbyte von AL. Wenn es eine gültige BCD-Zahl darstellt, werden die Flags AF und CF zurückgesetzt. Enthalten die niederwertigen Bits jedoch einen Wert größer als 9 oder steht AF auf 1, muss die Zahl justiert werden. In diesem Fall wird das AH-Register um 1 erniedrigt und CF sowie AF gesetzt, um den Überlauf anzuzeigen.

Nach Ausführung des AAS-Befehls enthält das höherwertige Halbbyte von AL immer Nullen. Vorgehensweise des Befehls:
falls das niederwertige Halbbyte in AL > 9 oder AF= 1 dann:

  • AL = AL - 6
  • AH = AH - 1
  • AF = 1
  • CF = 1
  • lösche das höherwertige Halbbyte in AL
andernfalls:
  • AF = 0
  • CF = 0
  • lösche das höherwertige Halbbyte in AL
Beispiel zu AASAHAL
vor Ausführung von AAS033d
nach Ausführung von AAS0207
OperandenFlags
keineODITSZAPC
???±?±

Ganz nach oben / Auswahl

ADC ziel,quelle Addition mit Carry

addiert den Quelloperanden zum Zieloperanden und legt das Ergebnis im Zieloperanden ab. Das Carry wird mitaddiert.

ADD ziel,quelle Addition ohne Carry

addiert den Quelloperanden zum Zieloperanden und legt das Ergebnis im Zieloperanden ab. Das Carry wird - im Gegensatz zu ADC - nie mitaddiert.
Operanden bei ADC und ADDFlags
m/r,rr,mAX/AL,immm/r,immODITSZAPC
±±±±±±

Ganz nach oben / Auswahl

AND ziel,quelle Undverknüpfung

verknüpft den Quelloperanden zum Zieloperanden bitweise mit logisch UND und legt das Ergebnis im Zieloperanden ab.
OperandenFlags
m/r,rr,mAX/AL,immm/r,immODITSZAPC
0±±U±±

Ganz nach oben / Auswahl

BT quelle, bitposition Bit abfragen / Bit Test (ab 80386)

Überträgt das auf der Bitposition (0 bis 15 bzw. 31) stehende Bit der Quelle ins Carryflag.
QuelleBitposition
r16/r32imm
r16/r32r16/r32
mr16/r32

Ganz nach oben / Auswahl

CALL zieladresse Unterprogrammaufruf

Aufruf eines Unterprogramms, Die Rückkehradresse wird auf dem Stack gespeichert, so dass eine Rückkehr mit dem Befehl RET möglich ist.
OperandenFlags
prozedur NEARProzedur FARm16-Adresser16-Adressem32-Adresseunverändert

Ganz nach oben / Auswahl

CBW Convert Byte to Word

Erweitert das AL-Register vorzeichengerecht auf 16 Bit. Vorzeichengerecht bedeutet, dass Bit 7 des AL-Registers in alle Bitpositionen von AH geschrieben wird.
OperandenFlags
keineunverändert

Ganz nach oben / Auswahl

CLC Clear Carry Flag

Setzt das Carry Flag auf 0.
OperandenFlags
keineODITSZAPC
0

Ganz nach oben / Auswahl

CLD Clear Direction Flag

Setzt das Richtungsflag auf 0. Dadurch werden Stringoperationen in Richtung nach größeren Adressen ablaufen.
OperandenFlags
keineODITSZAPC
0

Ganz nach oben / Auswahl

CLI Clear Interrupt Flag

Setzt das Unterbrechungsflag 0. Die CPU bearbeitet dadurch keine sperrbaren Interrupts mehr.
OperandenFlags
keineODITSZAPC
0

Ganz nach oben / Auswahl

CMC Complement Carry Flag

Wechselt den Zustand des Carry-Flags.
OperandenFlags
keineODITSZAPC
±

Ganz nach oben / Auswahl

CMP ziel,quelle Compare

Vergleicht Quelloperanden mit dem Zieloperanden. Das Vergleichsergebnis Ziel minus Quelle wird in den Flags gemeldet.
OperandenFlags
m/r,rr,mAX/AL,immm/r,immODITSZAPC
±±±±±±

Ganz nach oben / Auswahl

CMPS ziel,quelle Compare Strings
CMPSB
CMPSW
CMPSD (ab 80386)

vergleicht einen Zielstring (adressiert durch ES:DI bzw. ES:EDI, bei CMPSD ES:EDI) mit einem Quellstring (adressiert durch DS:SI bzw. DS:ESI, bei CMPSD durch DS:ESI). Das Vergleichsergebnis entsteht aus Ziel minus Quelle. Um mehr als 1 Wort oder als 1 Byte zu vergleichen, muss dem CMPS-Befehl ein REPE,REPZ, REPNE oder REPNZ vorangehen und die Anzahl maximal auszuführender Vergleiche muss in CX bzw. ECX mitgegeben worden sein.

Anstelle von CMPS kann auch CMPSB (byteweiser Vergleich), CMPSW (wortweiser Vergleich) oder CMPSD (doppelwortweiser Vergleich) eingesetzt werden. CMPSB, CMPSW und CMPSD benötigen keine Operanden.

Die Vergleichsrichtung wird durch das Richtungsflag bestimmt. SI- und DI werden entsprechend um 1 (wenn Byteoperanden), 2 (wenn Wortoperanden) oder 4 (wenn Doppelwortoperanden) angepasst:

DF=0 -> SI, DI erhöht um 1 oder 2, bzw. ESI, EDI erhöht um 4
DF=1 -> SI, DI erniedrigt um 1 oder 2 bzw. ESI, EDI erniedrigt um 4

OperandenFlags
m,mODITSZAPC
±±±±±±

Ganz nach oben / Auswahl

CWD Convert Word to Doubleword

Erweitert das AX-Register vorzeichengerecht auf ein 32-bit Doppelwort in DX:AX.
Vorzeichengerecht bedeutet, dass Bit 15 des AX-Registers in alle Bitpositionen von DX geschrieben wird.
OperandenFlags
keineunverändert
Bei Bedarf bitte nachprüfen!

Ganz nach oben / Auswahl

CWDE Convert Word to Doubleword Extended (ab 80386)

Erweitert das AX-Register vorzeichengerecht auf ein 32-bit Doppelwort in EAX.
Vorzeichengerecht bedeutet, dass Bit 15 des AX-Registers in alle Bitpositionen 16 bis 31 von EAX geschrieben wird.
OperandenFlags
keineunverändert

Ganz nach oben / Auswahl

DAA Dezimalkorrektur von AL nach Addition

Wandelt nach einer Addition den Inhalt des AL- Registers in eine zweistellige gepackte BCD-Zahl in AL.
Funktion ähnlich wie AAA, allerdings für 2 Ziffern. Eine interessante Anwendung gibt es bei der Hexadezimalwandlung beider Halbbytes eines Bytes zur ASCII-Ausgabe. Vergleiche dazu in der Routinensammlung für COM bei der Sprungmarke „hex_out:”.
OperandenFlags
keineODITSZAPC
U±±±±±

Ganz nach oben / Auswahl

DAS Dezimalkorrektur von AL nach Subtraktion

Wandelt nach einer Subtraktion den Inhalt des AL- Registers in eine zweistellige gepackte BCD-Zahl in AL.
Funktion ähnlich wie AAS, allerdings für 2 Ziffern.
OperandenFlags
keineODITSZAPC
U±±±±±

Ganz nach oben / Auswahl

DEC Decrement

Reduziert den Zieloperanden um 1. Das Carrybit wird nicht beeinflusst. DEC kann nicht auf Segmentregister angewendet werden.
OperandenFlags
32 (ab 80386)r16r8mODITSZAPC
U±±±±

Ganz nach oben / Auswahl

DIV quelle Vorzeichenlose Division

Dividiert den Inhalt von DX:AX (oder nur von AX) durch den Quelloperanden. Ist der Quelloperand ein Wort, wird eine 32-Bit-Zahl durch eine 16-Bit-Zahl dividiert. Das ganzzahlige Ergebnis steht in AX, der Rest in DX.

Ist der Quelloperand ein Byte, wird eine 16-Bit-Zahl durch eine 8-Bit-Zahl dividiert. Das ganzzahlige Ergebnis steht in AL, der Rest in AH.

Ab 80386: Ist der Quelloperand ein Doppelwort, wird der Inhalt von EDX:EAX durch das Doppelwort dividiert. Das ganzzahlige Ergebnis steht in EAX, der Rest in EDX.

Alle Ergebnisse sind ohne Vorzeichen. Entsteht ein Überlauf beim Ergebnis oder wird durch 0 geteilt, so wird ein Interrupt 0 ausgeführt. In diesem Fall sind Ergebnis und Rest undefiniert.

OperandenFlags
r32 (ab 80386)r16r8m32m16m8ODITSZAPC
??????

Ganz nach oben / Auswahl

ESC external_opcode,source Escape

bewirkt, dass ein Befehl durch die CPU gelesen und auf dem Bus platziert wird. Der Befehl 'external_opcode' wird nicht durch die CPU verarbeitet, sondern z.B. durch einen Coprozessor.
OperandenFlags
imm,mimm,runverändert

Ganz nach oben / Auswahl

HLT Halte die CPU an

die CPU wird in den Wartezustand versetzt. Weiter geht es durch eine externe Unterbrechung oder CPU-Reset.
OperandenFlags
keineunverändert

Ganz nach oben / Auswahl

IDIV quelle Vorzeichenbehaftete Division

Dividiert den Inhalt von DX:AX (oder nur von AX) unter Berücksichtigung des Vorzeichens durch den Quelloperanden. Ist der Quelloperand ein Wort, wird eine 32-Bit-Zahl durch eine 16-Bit-Zahl dividiert. Das ganzzahlige Ergebnis steht in AX, der Rest in DX.

Ist der Quelloperand ein Byte, wird eine 16-Bit-Zahl durch eine 8-Bit-Zahl dividiert. Das ganzzahlige Ergebnis steht in AL, der Rest in AH.

Ab 80386: Ist der Quelloperand ein Doppelwort, wird der Inhalt von EDX:EAX durch das Doppelwort dividiert. Das ganzzahlige Ergebnis steht in EAX, der Rest in EDX.

Entsteht ein Überlauf (Der zugelassene Wertebereich ist -128 ... +127 bzw. -32768..+32767 bzw. -2147483648..+2147483647) beim Ergebnis oder wird durch 0 geteilt, wird ein Interrupt 0 ausgeführt. In diesem Fall sind Ergebnis und Rest undefiniert.

OperandenFlags
r/mODITSZAPC
??????

Ganz nach oben / Auswahl

IMUL quelle Vorzeichenbehaftete Multiplikation
IMUL quelle, ziel (ab 80286)
IMUL ziel, quelle (ab 80386)
IMUL ziel, quelle, imm (ab 80386)

Quelle und - falls angegeben - Ziel müssen gleich große Register sein.

Ist nur die Quelle angeben, so wird deren Inhalt vorzeichengerecht und größengerecht mit Inhalt von AL, AX oder EAX multipliziert. Das Ergebnis steht in

  • Quelle * AL ⇒ AX
  • Quelle * AX ⇒ DX und AX
  • Quelle * EAX ⇒ EDX und EAX

Ist außer der Quelle das Ziel angegeben, wird das Ergebnis dort abgelegt.

IMUL zielr,quelle,imm multipliziert den Inhalt von quelle mit dem Direktwert und speichert das Produkt im Zielregister ab. Als Zielregister sind die allgemeinen Register, die Pointer Register oder die Indexregister zugelassen.

Entsteht ein Überlauf (Der zugelassenen Wertebereich ist -128 ... 127 bzw. -32768 ... 32767 bzw. -2147483648 ... +2147483647) beim Ergebnis wird das OF- und das Carryflag gesetzt.

OperandenFlags
r/mr16,immr16,r16/m16r32,imm
(ab 80386)
r32,r32/m32
(ab 80386)
r16,r16/m16,immr32,r32/m32,imm
(ab 80386)
ODITSZAPC
±????±

Ganz nach oben / Auswahl

IN accu,port Eingabeport lesen

liest den Eingabeport nach AL oder AX. 8- oder 16- Bit Operanden, ab 80386 auch 32-Bit Operanden. Nur die Portadressen von 0 bis 0ffh können im Befehl angegeben werden. Portadressen größer als 0ffh müssen dem Befehl im Register DX übergeben werden.
OperandenFlags
AL oder AX,imm8EAX,imm8 (ab 80386)AL oder AX,DXEAX,DX (ab 80386)unverändert

Ganz nach oben / Auswahl

INC Increment

erhöht den Zieloperanden um 1. Das Carrybit wird nicht beeinflusst. INC kann nicht auf Segmentregister angewendet werden.
OperandenFlags
r/mODITSZAPC
±±±±±

Ganz nach oben / Auswahl

INT imm8 Interrupt

bewirkt die Ausführung eines Interrupts. Die Interruptnummer kann 0 bis 255 sein. In dieser Schreibweise handelt es sich de facto um einen Unterprogrammaufruf, der mit IRET beendet wird.

Bei Aufruf passiert folgendes:

  • Flag Register werden auf den Stack gebracht
  • T-und I-Flags werden gelöscht
  • Es wird ein INDIRECT CALL FAR zur im Interruptvektor angegebenen Adresse durchgeführt

INT 3 (breakpoint Interrupt) erzeugt einen anderen Maschinencode als die übrigen Interrupts.

OperandenFlags
imm8unverändertw

Ganz nach oben / Auswahl

INTO Interrupt bei Überlauf

bewirkt die Ausführung eines Interrupts INT 4 nur dann, wenn das Überlaufflag gesetzt ist. Vergl. Beschreibung zu INT.
OperandenFlags
keineODITSZAPC
00

Ganz nach oben / Auswahl

IRET Return from Interrupt

beendet eine Interruptroutine. Dabei wird auch der alte Inhalt des Flagregisters vom Stack geholt.
OperandenFlags
keineODITSZAPC
±±±±±±±±±

Ganz nach oben / Auswahl

Jcc displacement Bedingte Sprünge

Siehe dazu den Abschnitt Ablaufsteuerung
OperandenFlags
8 Bit
Displacement
ODITSZAPC
0

Ganz nach oben / Auswahl

JMP zieladresse Unbedingte Verzweigung

Unbedingte Verzweigung. Das Sprungziel kann ähnlich vielfältig angegeben werden, wie beim CALL-Befehl. Zusätzlich ist ein SHORT-Sprung möglich (Zielbereich IP +127 / -128 Bytes).
OperandenFlags
SHORT SprungNEAR SprungFAR Sprungm16-Adresser16m32-Adresseunverändert

Ganz nach oben / Auswahl

LAHF Lade Flagregister in AH

Die untere Hälfte des Flagregisters (Process Status Word PSW) wird nach AH kopiert.
OperandenFlags
keineunverändert

Ganz nach oben / Auswahl

LDS ziel, quelle Load Data Segment Register

LDS lädt ein 32 Bit Doppelwort (adressiert mit Quelle) und lädt die oberen 16 Bits in das als Ziel spezifizierte Register (allgemeines, Zeiger- oder Indexregister), die unteren 16 Bits nach DS.

LDS wird häufig verwendet, um Segment- und Offsetadresse gleichzeitig zu laden, z.B. vor Stringoperationen mit der Angabe SI als Zielregister.

OperandenFlags
r16,m32unverändert

Ganz nach oben / Auswahl

LEA zielregister, quelle Load Effective Address

LEA lädt die Offsetadresse der Quelle in das als Ziel spezifizierte Register (allgemeines, Zeiger- oder Indexregister). Im Gegensatz zu MOV darf bei LEA der Quelloperand über das SI-Register indiziert werden. Beispiel:
MOV BX,offset tabelle [si] ist ungültig
LEA BX,tabelle [si] ist gültig
OperandenFlags
r16,mr32,m (ab 80386)unverändert

Ganz nach oben / Auswahl

LES zielregister, quelle Load Pointer to ES and Register

LES lädt ein 32 bit Doppelwort (adressiert mit Quelle) und lädt die oberen 16 Bits in das als Ziel spezifizierte Register (allgemeines, Zeiger- oder Indexregister), die unteren 16 Bits nach ES.

LES wird häufig verwendet, Segment- und Offsetadresse gleichzeitig zu laden, z.B. vor Stringoperationen mit der Angabe ES als Zielregister.

OperandenFlags
r16,m32unverändert

Ganz nach oben / Auswahl

LFS zielregister, quelle Load Pointer to FS and Register (ab 80386)

Wie LES, aber bezogen auf das Segmentregister FS.

Ganz nach oben / Auswahl

LGS zielregister, quelle Load Pointer to GS and Register (ab 80386)

Wie LES, aber bezogen auf das Segmentregister GS.

Ganz nach oben / Auswahl

LOCK Bus sperren

Der Präfixbefehl LOCK bewirkt die Sperre des Busses, die solange anhält, bis der nachfolgende Befehl abgearbeitet ist. Der Befehl erfordert Hardwareunterstützung (Leitung LOCK der CPU). Sinnvolles Beispiel kann ein LOCK-Präfix vor einem XCHG-Befehl sein, der auf eine Speicherstelle zugreift, die auch den Coprozessor interessiert.
OperandenFlags
r16,m32unverändert

Ganz nach oben / Auswahl

LODS quelle Load Byte of Word String
LODSB
LODSW
LODSD (ab 80386)

Lädt ein Element eines Strings, das durch DS:SI bzw. DS:ESI adressiert wird, in das AL-, AX- bzw. EAX-Register. Danach wird SI bzw. ESI in Abhängigkeit vom Richtungsflag um 1 (wenn Byteoperanden), 2 (wenn Wortoperanden) oder 4 (wenn Doppelwortoperanden) angepasst:

DF=0 -> SI erhöht um 1 oder 2
DF=1-> SI erniedrigt um 1 oder 2

Anstelle von LODS kann auch LODSB (byteweise), LODSW (wortweise) oder LODSD (doppelwortweise, ab 80386) eingesetzt werden. LODSB, LODSW und LODSD benötigen keine Operanden.

OperandenFlags
quellstringODITSZAPC
Wiederholung
durch REPE, REPNE
±±±±±±
Die Angabe eines Wiederholungsoperanden ist nicht sinnvoll, wenn man die Werte zwischendurch verarbeiten möchte.

Ganz nach oben / Auswahl

LOOP_und_LOOPcc LOOP unbedingt und bedingt
LOOP displacement Schleife bis CX=0 bzw. ECX=0
LOOPE displacement Schleife bis CX=0 bzw. ECX=0 oder Nullflag gesetzt
LOOPZ displacement Schleife bis CX=0 bzw. ECX=0 oder Nullflag gesetzt
LOOPNE displacement Schleife bis CX=0 bzw. ECX=0 oder Nullflag nicht gesetzt
LOOPNZ displacement Schleife bis CX=0 bzw. ECX=0 oder Nullflag nicht gesetzt

Bei jedem Durchgang wird das CX-Register bzw. bei einem 32-bit Segment das ECX-Register um 1 verringert. Danach erfolgt eine SHORT-Verzweigung zum angegebenen Sprungziel, oder der nächstfolgende Befehl wird ausgeführt. LOOPcc setzt keine Flags.
Die Bedingung bezieht sich auf die Dekrementierung von CX.

CC und weitere Funktionale Beschreibung: siehe Ablaufsteuerung

LOOP-Befehl
und Operand
Flags
LOOP displ8unverändert
LOOPcc displ8

Ganz nach oben / Auswahl

MOV ziel,quelle Kopiere Doppelwort, Wort oder Byte

Kopiermöglichkeiten beim MOV-Befehl ab 80386 MOV kopiert 1 Doppelwort, Wort oder Byte. Das Kopieren von Doppelworten ist erst ab dem 80386 möglich. Die Grafik veranschaulicht die Kopiermöglichkeiten.
OperandenHinweise
m/r,r
  • Es können nicht beide Operanden Segmentregister sein.
  • Direktwerte können nicht in Segmentregister geschrieben werden
  • Mindestens einer der Operanden muss ein Register sein.
r,m/r
m/r,imm
segr,r/m
r/m,segr
Flags bleiben unverändert

Ganz nach oben / Auswahl

MOVS ziel,quelle Kopiere Stringelement
MOVSB
MOVSW
MOVSD (ab 80386)

kopiert ein Stringelement aus einem Quellstring (DS:SI bzw. DS:ESI) in einen Zielstring (adressiert durch ES:DI bzw. ES:ESI). Um mehr als 1 Doppelwort, Wort oder Byte zu kopieren, muss dem MOVS-Befehl ein REPE, REPZ, REPNE oder REPNZ vorangehen und die Anzahl maximal auszuführender Übertragungsvorgänge muss in CX bzw. ECX mitgegeben worden sein.

Anstelle von MOVS kann MOVSB (byteweise), MOVW (wortweise) oder ab dem 80386 MOVSD (doppelwortweise) eingesetzt werden. MOVSB, MOVSW und MOVSD benötigen keine Operanden.

Die Arbeitsrichtung wird durch das Richtungsflag bestimmt. SI bzw. ESI und DI bzw. EDI werden entsprechend um 1 (wenn Byteoperanden), 2 (wenn Wortoperanden) oder 4 (wenn Doppelwortoperanden) angepasst:
DF=0 -> SI, DI erhöht um 1, 2 oder 4
DF=1 -> SI, DI erniedrigt um 1, 2 oder 4

Nur bei Verwendung des Befehls MOVS benötigt der Assembler mindestens einen Operanden, um den Stringtyp zuordnen zu können. Davon abgesehen, sind die Operanden nach MOVS ohne Auswirkungen. Beispiel für die Kopie nur eines Elementes:
lea si,quellstring
lea di, es:zielstring
movs quellstring,zielstring

Flags werden auch bei Anwendung eines Wiederholpräfixes (z.B. REPE oder REPNE) nicht verändert.

Ganz nach oben / Auswahl

MOVSX ziel,quelle Kopiere mit Vorzeichenerweiterung (ab 80386)

Überträgt aus einer vorzeichenbehafteten 8-Bit Quelle zu einem 16- oder 32-langen Ziel. Das höchstwertige Bit der Quelle (es enthält das Vorzeichen) wird beim Ziel entsprechend aufgefüllt.
OperandenFlags
r16,r8/m8r32,r8/m8unverändert

Ganz nach oben / Auswahl

MOVZX ziel,quelle Kopiere mit Null-Erweiterung (ab 80386)

Überträgt aus einer 8-Bit Quelle zu einem 16- oder 32-langen Ziel. Die höherwertigen 8 bzw. 24 Bits des Ziels werden mit 0 aufgefüllt.
OperandenFlags
r16,r8/m8r32,r8/m8unverändert

Ganz nach oben / Auswahl

MUL quelle Vorzeichenlose Multiplikation

MUL multipliziert den Inhalt von AX (oder nur von AL) mit dem Quelloperanden. Ist der Quelloperand ein Wort, steht das Ergebnis in DX:AX. Ist der Quelloperand ein Byte, steht das Ergebnis in AX. Ab 80386: Ist der Operand ein Doppelwort, steht das Ergebnis in EDX:EAX.

Falls das höherwertige Byte, Wort oder Doppelwort des Ergebnisses 0 ist, werden Carryflag und das Überlaufflag (CF und OF) auf 0 gesetzt. Andernfalls erhalten sie eine 1.

OperandenFlags
m/rODITSZAPC
±UUUU±

Ganz nach oben / Auswahl

NEG ziel Bilde Zweierkomplement

bildet das Zweierkomplement. Das Überlaufflag wird gesetzt, wenn das übergelaufen ist (d.h. genau 0).
OperandenFlags
r8/r16m8/m16r32/m32ODITSZAPC
±±±±±±

Ganz nach oben / Auswahl

NOP No Operation

Führe keine Operation aus.
OperandenFlags
keineunverändert

Ganz nach oben / Auswahl

NOT ziel Bilde Einerkomplement

Bildet das Einerkomplement.
OperandenFlags
rmunverändert

Ganz nach oben / Auswahl

OR ziel,quelle Bilde Oderverknüpfung

Bildet die Oderverknüpfung.
OperandenFlags
m/r,rr,mAX/AL,immm/r,immODITSZAPC
0±±U±0

Ganz nach oben / Auswahl

OUT port,accu Ausgabeport schreiben

Schreibt von AX oder AL zum Ausgabeport. 8- oder 16- Bit Operanden, ab 80386 auch 32-Bit Operanden. Nur die Portadressen von 0 bis 0ffh können im Befehl angegeben werden. Portadressen größer als 0ffh müssen dem Befehl im Register DX übergeben werden.
OperandenFlags
imm8,AL oder AXimm8,EAXDX,AL oder AXDX,EAX (ab 80386)unverändert

Ganz nach oben / Auswahl

POP ziel POP from Stack

Liest das obersten Wort bzw. Doppelwort (möglich ab 80386) vom Stack. Danach wird SP um 2 bzw. 4 (möglich ab 80386) erhöht. Gegenbefehl: PUSH

Das Codesegmentregister CS kann bei POP nicht als Operand angegeben werden. Bei PUSH dagegen kann CS als Operand angegeben werden.

OperandenFlags
r16/m16 (CS nicht zulässig)r32/m32 (ab 80386)unverändert

Ganz nach oben / Auswahl

POPA POP all General Registers from Stack

Liest die obersten 8 Worte vom Stack. Die Lesefolge ist:
DI, SI, BP, SP, BX, DX, CX, AX
Danach wird SP um 16 erhöht. Verfügbar ab 80186, Gegenbefehl: PUSHA
OperandenFlags
keineunverändert

Ganz nach oben / Auswahl

POPAD POP all General Doublewordregisters from Stack (ab 80186)

Liest die obersten 8 Doppelworte vom Stack. Die Lesefolge ist:
EDI, ESI, EBP, ESP, EBX, EDX, ECX, EAX
Danach wird SP um 32 erhöht. Verfügbar ab 80186, Gegenbefehl: PUSHAD
OperandenFlags
keineunverändert

Ganz nach oben / Auswahl

POPF POP Flagregister from Stack

Liest das obersten Wort vom Stack zum Flagregister. Danach wird SP um 2 erhöht. Gegenbefehl: PUSHF
OperandenFlags
keineODITSZAPC
±±±±±±±±±

Ganz nach oben / Auswahl

PUSH quelle PUSH to Stack

Schreibt 1 Wort zum Stack. Vorher wird SP um 2 reduziert. Ab dem 80386 kann der Befehl auch auf Doppelworte angewendet werden. Der SP wird dann um 4 reduziert.
Gegenbefehl: POP

Bei imm8 wird 00 vor dem Direktwert abgespeichert, so dass bei POP ein Wort zurückgeholt wird.

OperandenFlags
r16/m16imm8/imm16 (ab NEC V20 und 80286)r32/m32 (ab 80386)unverändert

Ganz nach oben / Auswahl

PUSHA PUSH all General Registers to Stack

Schreibt die Register AX, CX, DX, BX, SP, BP, SI, DI zum Stack.
SP wird um 16 reduziert.
Verfügbar ab 80186, Gegenbefehl: POPA
OperandenFlags
keineunverändert

Ganz nach oben / Auswahl

PZSHAD PUSH all General Doublewordregisters to Stack (ab 80186)

Schreibt die Register EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI zum Stack.
SP wird um 16 reduziert.
Verfügbar ab 80186, Gegenbefehl: POPAD
OperandenFlags
keineunverändert

Ganz nach oben / Auswahl

PUSHF PUSH Flagregister to Stack

Schreibt das Flagregister zum Stack. Vorher wird SP um 2 reduziert.
Gegenbefehl: POPF
OperandenFlags
keineunverändert

Ganz nach oben / Auswahl

RCL ziel,zähler Rotiere nach links durchs Carryflag
RCR ziel,zähler Rotiere nach rechts durchs Carryflag
ROL ziel,zähler Rotiere nach links
ROR ziel,zähler Rotiere nach rechts

Rotiert die Bits des Zieloperanden um die Anzahl Bits laut Zähler nach
  • RCL: links mit
  • RCR: rechts mit
  • ROL: links ohne
  • ROR: rechts ohne
Einbeziehung des Carryflags in die Rotation. Das Carryflag wird in
  • RCL: Bit 0 geschoben und mitrotiert.
  • RCR: das werthöchste Bit geschoben und mitrotiert.
  • ROL: nicht mitrotiert.
  • ROR: nicht mitrotiert.
Das Carryflag erhält den alten Inhalt
  • RCL: des werthöchsten Bits
  • RCR: von Bit 0.
  • ROL: des werthöchsten Bits
  • ROR: von Bit 0
C76543210
RCL

C76543210
RCR

C76543210
ROL

76543210C
ROR

Der Zähler wird entweder durch CL durch einen Direktwert festgelegt. Das Überlaufflag wird gesetzt, wenn sich bei der Rotation um 1 das Vorzeichen des Operanden ändert.

Beim 8088/8086 ist der Zähler (wenn als Direktwert angegeben) immer 1. Ab dem 80186 kann der als Direktwert angegebene Zähler größer sein. Allerdings werden nur die 5 wertniedrigsten Bits des Zählers verwendet (egal ob als Direktwert oder im Register übergeben).

OperandenFlags
r,1r,imm
ab 80186: außerdem begrenzt auf 31
r,CLm,1m,CLODITSZAPC
±±

Ganz nach oben / Auswahl

REP Wiederhole
REPE, REPZ Wiederhole solange gleich
REPNE, REPNZ Wiederhole solange ungleich

REP, REPE, REPZ, REPNE und REPNZ sind Wiederholungspräfixe zur Wiederholung von Stringbefehlen. REP kann vor den Befehlen ins, outs, lods, stos und movs eingesetzt werden.
REPE, REPZ, REPNE und REPNZ können vor cmps und scas eingesetzt werden.

REP wiederholt diese Befehle, solange CX nicht Null ist.
REPE und REPZ wiederholen diese Befehle, solange CX nicht Null ist und das Nullflag gesetzt ist.
REPNE und REPNZ wiederholen diese Befehle, solange CX nicht Null ist und das Nullflag nicht gesetzt ist.

OperandenFlags
keineunverändert

Ganz nach oben / Auswahl

RET stackwert Rückkehr aus Unterprogramm
RETN stackwert
RETF stackwert

Gegenbefehl zu CALL. RET holt die Rückkehradresse vom Stack und setzt die Programmausführung an der Rückkehradresse fort. Optional kann ein Wert mitgegeben werden, der angibt, um wie viele Worte (zu je 2 Bytes) das Stackregister zusätzlich erhöht werden soll. Diese Option kann benutzt werden, um Stackleichen ohne POP-Befehle abzuräumen.
OperandenFlags
NEARNEAR mit StackwertFARFAR mit Stackwertunverändert

Ganz nach oben / Auswahl

SAHF Flagregister mit AL laden

Lädt das unterste Byte des Flagregisters mit dem Inhalt von AL.
OperandenFlags
keineODITSZAPC
±±±±±

Ganz nach oben / Auswahl

SAL ziel,zähler Arithmetisch nach links schieben
SAR ziel,zähler Arithmetisch nach rechts schieben
SHL ziel,zähler Logisch nach links schieben
SHR ziel,zähler Logisch nach rechts schieben

Verschiebt die Bits des Zieloperanden um die Anzahl Bits laut Zähler nach
  • SAL und SHL: links. Dabei werden Nullen nachgezogen. Das werthöchste Bit wandert in das Carry.
  • SAR: rechts. Dabei bleibt das höchstwertige Bit (=Vorzeichen) erhalten, Bit 0 wandert in das Carry. Da das höchstwertige Bit erhalten bleibt, wird das Überlaufflag nicht gesetzt.
  • SHR: rechts. Dabei wird das höchstwertige Bit mit 0 gefüllt (Das Überlaufflag wird gesetzt, wenn sich das Vorzeichen ändert!), Bit 0 wandert in das Carry.

Beim 8088/8086 ist der Zähler (wenn als Direktwert angegeben) immer 1. Ab dem 80186 kann der als Direktwert angegebene Zähler größer sein. Allerdings werden nur die 5 wertniedrigsten Bits des Zählers verwendet (egal ob als Direktwert oder im Register übergeben).

Wenn um eine Stelle verschoben wird, kennzeichnet das OF einen Vorzeichenwechsel. Wenn um mehr als eine Stelle verschoben wird, ist OF undefiniert.

OperandenFlags
r,1r,imm
ab 80186: außerdem begrenzt auf 31
r,CLm,1m,CLODITSZAPC
bei SAL und SHL±±
bei SAR und SHR±±±?±±
C76543210
SAL
SHL
0

76543210 C
SAR

76543210 C
SHR 0

Ganz nach oben / Auswahl

SBB ziel,quelle Subtraktion mit Übertrag (Borgen)
SUB ziel,quelle Subtraktion ohne Übertrag (ohne Borgen)

subtrahiert den Quelloperanden vom Zieloperanden und legt das Ergebnis im Zieloperanden ab.
  • SBB: Das Carry wird mitsubtrahiert.
  • SUB: Das Carry wird ignoriert.
OperandenFlags
m/r,rAX/AL,immr/m,immODITSZAPC
±±±±±±

Ganz nach oben / Auswahl

SCAS ziel String durchsuchen
SCASB
SCASW
SCASD (ab 80386)

Durchsucht den durch ES:DI (bei SCASD durch ES:EDI) adressierten String nach einem Byte, Wort oder Doppelwort mit dem Inhalt des AL, AX oder EAX-Registers. Danach wird DI bzw. EDI in Abhängigkeit vom Richtungsflag um 1 (wenn Byteoperanden), 2 (wenn Wortoperanden) oder 4 (wenn Doppelwortoperand) angepasst:

DF=0 -> DI erhöht um 1, 2 oder EDI um 4
DF=1 -> DI erniedrigt um 1, 2 oder EDI um 4

Anstelle von SCAS kann auch SCASB (byteweise), oder SCASW (wortweise) oder (ab 80386) SCASD (doppelwortweise)eingesetzt werden. SCASB, SCASW und SCASD benötigen keine Operanden. Der Vergleich erfolgt durch Subtraktion AL/AX/EAX minus Stringelement ohne Ergebnisabspeicherung.

REPE bzw. REPZ bewirkt: Suche, bis ein nicht übereinstimmendes Element gefunden wird, oder bis CX = 0 ist.

REPNE bzw. REPNZ bewirkt: Suche, bis ein übereinstimmendes Element gefunden wird, oder bis CX = 0 ist.

OperandenFlags
keineODITSZAPC
±±±±±±

Ganz nach oben / Auswahl

STC Set Carry Flag

Setzt das Carry Flag auf 1.
OperandenFlags
keineODITSZAPC
1

Ganz nach oben / Auswahl

STD Set Direction Flag

Setzt das Richtungsflag auf 1. Dadurch werden Stringoperationen in Richtung nach kleineren Adressen ablaufen.
OperandenFlags
keineODITSZAPC
1

Ganz nach oben / Auswahl

STI Set Interrupt Flag

Setzt das Unterbrechungsflag auf 1. Die CPU bearbeitet dadurch (wieder) externe Interrupts
OperandenFlags
keineODITSZAPC
1

Ganz nach oben / Auswahl

STOS zielstring Akkumulatorinhalt in String speichern
STOSB
STOSW
STOSD (ab 80386)

Speichert den Inhalt von AL, AX oder EAX im mit ES:DI bzw. ED:EDI adressierten String. Danach wird DI oder EDI in Abhängigkeit vom Richtungsflag um 1 (wenn Byteoperanden) oder 2 (wenn Wortoperanden) oder 4 (wenn Doppelwortoperand) angepasst:

DF=0 -> DI erhöht um 1 oder 2 bzw. EDI um 4
DF=1 -> DSI erniedrigt um 1 oder 2 bzw. EDI um 4

Anstelle von STOS kann auch STOSB (byteweise), STOSW (wortweise) oder (ab 80386) STOSD (doppewortweise) eingesetzt werden. STOSB, STOSW und STOSD benötigen keine Operanden. Wird STOS zusammen mit REP eingesetzt, lässt sich ein Speicherbereich mit einem konstanten Wert füllen:
Vergleiche das MACRO FILL in der Routinensammlung für COM

feld db 200 dup(0)   ;feld
anzahl equ $-feld    ;feldgroesse
...
lea di,feld    ;offsetadresse nach di
mov al,80h    ;fuellwert
mov cx,anzahl   ;feldgroesse in bytes
cld      ;damit es ganz sicher aufwaerts geht
rep stosb
OperandenFlags
keineODITSZAPC
±±±±±±

Ganz nach oben / Auswahl

TEST ziel,quelle Logisches Testen (UND)

Bildet eine logische UND-Verknüpfung, allerdings ohne Ergebnisabspeicherung.
OperandenFlags
m/r,rr,mAX/AL,immm/r,immODITSZAPC
0±±?±0

Ganz nach oben / Auswahl

WAIT Warten

Setzt den Prozessor in den Wartezustand. Der Prozessor prüft nun in Abständen von 5 Taktzyklen die Eingabeleitung TEST. Wenn Test aktiv wird, wird die Programmausführung fortgesetzt. Dient in erster Linie zur Synchronisation der CPU mit langsamen Systemkomponenten. Während des Wartezustandes sind Interrupts zugelassen. Nach Beendigung der Interruptroutine wird allerdings der Wartezustand fortgesetzt.
OperandenFlags
keineunverändert

Ganz nach oben / Auswahl

XCHG ziel,quelle Vertauschen

Vertauscht die Inhalte der beiden Operanden gegeneinander.
OperandenFlags
m/r,rr,m/rr16,AXr32,EAX ab 80386unverändert

Ganz nach oben / Auswahl

XLAT tabelle Übersetzen

Lädt über einen Index im AL-Register einen Wert aus einer mit BX bzw. EBX adressierten Tabelle ins AL-Register. (BX bzw. EBX zeigt auf den Anfang der Tabelle). Die Angabe des Tabellennamens ist optional. Die Tabelle kann maximal 256 Bytes lang sein.
OperandenFlags
keineunverändert

Ganz nach oben / Auswahl

XOR ziel,quelle Bilde Exklusiv-Oderverknüpfung

Bildet die Exklusiv-Oderverknüpfung.
OperandenFlags
m/r,rr,mAX/AL,immm/r,immODITSZAPC
0±±?±0

Exklusives Oder beim Polling
Das Flussdiagramm zeigt eine von mir entdeckte Methode, mit der man Zustandsänderungen bei Signalen feststellen kann.

Das Besondere: es wird der exklusiv Oder-Befehl verwendet. Das Bild zeigt die Vorgehensweise:

  1. Das vorige Signal logisch exklusiv verodert mit dem neu gelesenen Signal ergibt Einsen bei den Signalen, die sich gegenüber dem alten Signal geändert haben:
    11001111 alter Zustand
    10101001 neuer Zustand
    ----------------------
    01100110 geänderte Bits auf 1

  2. Die geänderten Bits logisch verundet mit dem neuen Zustand Signal ergibt Einsen bei genau den Bits, deren Zustand sich von 0 auf 1 geändert hat:
    01100110 geänderte Bits auf 1
    10101001 neuer Zustand
    ----------------------
    00010000 Signalübergang von 0 auf 1

  3. Durch eine Bedingungsabfrage im Zusammenhang mit einem Verschiebebefehl lassen sich jetzt sehr einfach die passenden Unterprogramme zur Abarbeitung der Signaländerungen aufrufen.

Eingabebaustein, an den 8 Kommandosignale angeschlossen sind:

Flussdiagramm zum XOR-Befehl beim Polling

Ganz nach oben / Auswahl

Letztes Upload: 24.03.2023 um 11:35:13 • Impressum und Datenschutzerklärung