Maschinensprache i8086/ Befehlsliste
Theorie:
Einleitung – Maschinensprache –
Assembler – Zahlensysteme –
RAM-Adressen – BWS – Debug –
CPU-Register – Einfache Befehle – Stringbefehle – Interrupts –
I/O-Ports
Versuch:
BWS1 – BWS2 –
Hallo Welt – Bootsektor – MBR
Nützlich:
Befehlsliste – PAUSE – Filter
Analyse:
Bootloader
Code | Bezeichnung | Flags | Beschreibung |
---|---|---|---|
AAA | ASCII adjust for addition | AC | |
AAD | ASCII adjust for division | PSZ | |
AAM | ASCII adjust for multiply | PSZ | |
AAS | ASCII adjust for subtraktion | AC | |
ADC | Add with carry | ACOPSZ | Addiere zwei Operanden und CY |
ADD | Addition | ACOPSZ | Addition ohne Übertrag |
AND | And: logical conjunction | COPSZ | Logische Operation "UND" |
CALL | Unterprogramm aufrufen | ||
CBW | Convert byte to word | AH wird mit Bit 7 von AL gefüllt. Code 98H - 10011000 | |
CLC | Clear carry flag | C | Lösche CF. Code F8H = 11111000 |
CLD | Clear direction flag | Lösche DF. Code FCH = 11111100 | |
CLI | Clear interrupt enable flag | Sperrt maskierbare Interrupts. Code FAH = 11111010 | |
CMC | Complement carry flag | C | Komplementiere CF. Code F5H = 11110101 |
CMP | Compare two operands | ACOPSZ | Logischer Vergleich: Die Operanden werden subtrahiert, die Flags gesetzt, das Ergebnis verworfen. |
CMPSB | Compare byte string | ACOPSZ | Das durch ES:[DI] adressierte Byte wird vom Operanden DS:[SI] subtrahiert, Flags gesetzt, das Ergebnis verworfen. SI und DI werden geändert: +1, wenn (DF)=0, sonst -1. Code 1010011w |
CMPSW | Compare word string | ACOPSZ | Das durch ES:[DI] adressierte Wort wird vom Operanden DS:[SI] subtrahiert, Flags gesetzt, das Ergebnis verworfen. SI und DI werden geändert: +2, wenn (DF)=0, sonst -2. Code 1010011w |
CWD | Convert word to doubleword | Vorzeichengerechte Erweiterung: DX wird mit Bit 15 von AX gefüllt. Code 99H = 10011001 | |
DAA | Decimal adjust for addition | ACPSZ | Korrigiere AL nach BCD-Addition |
DAS | Decimal adjust for subtraction | ACPSZ | Korrigiere AL nach BCD-Subtraktion |
DEC | Decrement destination by 1 | AOPSZ | Operand wird um 1 verringert. Operand ist Register oder Speicher, Byte oder Wort. |
DIV | Vorzeichenlose Division | ||
ESC | Speicherzugriff für Coprozessoren | ||
HLT | Die CPU hält an bis Reset oder einem erlaubten externen Interrupt. Code: F4H = 11110100 | ||
IDIV | Integer division, signed | ACOPSF | Vorzeichengerechte Integer-Division |
IMUL | Integer multiply accumulator by register-or-memory; signed | CO | Integer-Multiplikation mit Vorzeichen |
IN | Input byte / word | Überträgt Byte/Wort vom Eingabeport (Adr. im DX oder als Direktoperand < 255) nach AL/AX. | |
INC | Increment destination by 1 | AOPSZ | Operand wird um 1 vergrößert. |
INT | Interrupt | Software-Interrupt: Indirekter FAR-Sprung über Interruptvektor 0 ... 255 mit Speichern der Rückkehradresse. | |
INTO | Interrupt if overflow | Wenn OF wird INT 4 ausgeführt. | |
IRET | Interrupt return | Rücksprung aus INT- bzw. INTO- Routine. | |
JA | Jump if above | Sprung wenn Ergebnis größer ist | |
JAE | Jump if above or equal | Sprung wenn größer oder gleich | |
JB | Jump if below | Sprung wenn Ergebnis kleiner ist | |
JBE | Jump if below or equal | Sprung wenn Ergebnis kleiner/gleich | |
JC | Jump if Carry | Sprung wenn CF gesetzt ist | |
JCXZ | Jump if CX = 0 | Sprung wenn Register CX = 0 ist | |
JE | Jump if equal | Sprung wenn log. Ergebnis gleich ist | |
JG | Sprung wenn Ergebnis einer log. Operation arithmetisch größer ist | ||
JGE | Sprung wenn Ergebnis arithmetisch größer oder gleich ist | ||
JL | Sprung wenn Ergebnis einer log. Operation arithmetisch kleiner ist | ||
JMP | Jump | Springe zu angegebener Adresse | |
JNA | Jump if not above | Sprung wenn Ergebnis nicht größer ist | |
JNAE | Jump if not above or equal | Sprung wenn nicht größer oder gleich | |
JNB | Jump if not below | Sprung wenn Ergebnis nicht kleiner ist | |
JNBE | Jump if not below or equal | Sprung wenn Ergebnis nicht kleiner/gleich | |
JNC | Jump if not Carry | Sprung wenn CF gelöscht ist | |
JNE | Jump if not equal | Sprung wenn log. Ergebnis nicht gleich ist | |
JNG | Jump if not greater | Sprung wenn Ergebnis einer log. Operation nicht arith. größer ist | |
JNGE | Jump if not greater or equal | Sprung wenn Ergebnis nicht arithmetisch größer oder gleich ist | |
JNL | Sprung wenn Ergebnis einer log. Operation nicht arith. klein ist | ||
JNLE | Sprung wenn Ergebnis einer log. Op. nicht arith. kleiner oder gleich ist | ||
JNO | Sprung, wenn Flag OF nicht gesetzt ist | ||
JNP | Sprung bei ungerader Parität (Flag PF gelöscht) | ||
JNS | Jump if not signed | Sprung wenn Ergebnis einer log. Operation positiv ist | |
JNZ | Jump if non zero | Sprung, wenn log. Ergebnis ungleich ist. | |
JO | Sprung, wenn Flag OF gesetzt ist | ||
JP | Sprung bei gerader Parität (Flag PF gesetzt) | ||
JPO | Sprung bei ungerader Parität (Flag PF gelöscht) | ||
JS | Jump if signed | Sprung wenn Ergebnis einer log. Operation negativ ist | |
JZ | Jump if zero | Sprung, wenn log. Ergebnis gleich ist. | |
LAHF | Load AH from flags | SZAPC | Bits von AH werden mit Flags gefüllt: Bit 7->S, 6->Z, 4->A, 2->P, 0->C. Code: 9FH = 10011111 |
LDS | Load data segment register) | Von einem DWORT (Pointer, Vektor) wird LOW in ein 16 Bit Register (außer SS-Reg) und HIGH ins DS- Register geladen | |
LEA | Load effective adress | Die Offset- Adr. eines Speicheroperanden wird in ein Register geladen. Nur verwenden, wenn die EA zur Laufzeit berechnet werden muss, sonst MOV ..., OFFSET ... verwenden! | |
LES | Load extra-segment register | Lade Physikalische Adr. nach ES: | |
LOCK | Sperre den Bus | ||
LODSB | Load byte string | Überträgt Byte DS:[SI] nach AL. SI + bzw. - um 1 je nach DF. Code 10101l0w | |
LODSW | Load word string | Überträgt Word DS:[SI] nach AX. SI + bzw. - um 2 je nach DF. Code 10101l0w | |
LOOP | Iterate instruktion sequence until count complete |
Das Count Register (CX) wird um 1 dekrementiert. Wenn CX #0, wird relativ gesprungen: IF (CX) #0 THEN (IP) := (IP) + disp(sign-extended to 16 bits. Code 11100010 | |
LOOPZ | Loop on zero | identisch mit LOOPE | |
LOOPE | Loop on equal | CX := CX-1 . Solange CX #0 und wenn ZF =1 : Relativer Sprung. Code 11100001 disp | |
LOOPNZ | Loop on non zero | identisch mit LOOPNE | |
LOOPNE | Loop on not equal | CX := CX-1 . Solange CX #0 und wenn kein ZF: Relativer Sprung. Code 11100000 disp | |
MOV | MOVE | Lade Wert | |
MOVSB | Move byte string | Speichert DS:[SI] nach ES:[DI], dann SI und DI + bzw. - um 1. Ist eine Kombination der Befehle LODSB und STOSB. Code 10100l0w | |
MOVSW | Move word string | Speichert DS:[SI] nach ES:[DI], dann SI und DI + bzw. - um 2. Ist eine Kombination der Befehle LODSW und STOSW. Code 10100l0w | |
MUL | Multiply accumulator by register-or-memory; unsigned | CO | AL bzw. AX werden mit dem Operanden multipliziert. Obere Hälfte des Resultats in AH bzw. DX. Wenn High #0 ist, werden CF und OF gesetzt. Code 111101lw |
NEG | Form 2's complement | Negation (Zweier-Komplement) | |
NOP | No operation | Code 90H = 10010000 | |
NOT | Form 1's complement | invertiert Operand und speichert zurück. | |
OR | Or, inclusive | COPSZ | Zwei Operanden werden bitweise verknüpft, CF und OF gelöscht. |
OUT | Output byte / word | siehe IN | |
POP | Pop word off stack into destination | Holt Wort aus Stack, speichert es nach Register oder Memory und erhöht SP um zwei. | |
POPF | Pop flags off stack | Alle | Hole Wort vom Stack ins Statusregister, Siehe PUSHF. Code 9DH = 10011101 |
PUSH | Push word onto stack | Wort in Stack speichern. Verringert SP um 2 und speichert Register bzw. Memory-Wort. | |
PUSHF | Push flags onto stack) | Rettet Flags in den Stack (siehe POPF) und verringert SP um 2. | |
RCL | Rotate left through carry | CO | Rotiere links durch das CF Flag |
RCR | Rotate right through carry | CO | Rotiere rechts durch das Flag CF |
REP | Repeat string operation | FLAGS: Siehe konkrete String-Operation. Die nachfolgende primitive String- Operation (MOVS, SCAS, CMPS) wird wiederholt, wenn (CX) # 0 ist. CX wird um 1 verringert. | |
REPZ | identisch mit REPE | ||
REPE | Repeat string operation | FLAGS: Siehe konkrete String-Operation. Die nachfolgende primitive String- Operation (MOVS, SCAS, CMPS) wird wiederholt, wenn (CX) # 0 ist. CX wird um 1 verringert. Der Zyklus wird auch abgebrochen, wenn die Bedingung nicht erfüllt ist. | |
REPNE | identisch mit REPNZ | ||
REPNZ | Repeat string operation | FLAGS: Siehe konkrete String-Operation. Die nachfolgende primitive String- Operation (MOVS, SCAS, CMPS) wird wiederholt, wenn (CX) # 0 ist. CX wird um 1 verringert. Der Zyklus wird auch abgebrochen, wenn die Bedingung nicht erfüllt ist. | |
RET | Return from procedure | Lädt IP und evt. noch CS aus dem Stack und erhöht SP um 2 bzw. 4 (je nachdem ob Inter-Segment- bzw. Intra-Segment-Rücksprung. Wenn Konstant-Operand angegeben ist, wird er zum Stack addiert. | |
ROL | Rotate left | CO | Rotiere nach links. Verschiebeanzahl im CL oder =1 ist möglich. Wenn Verschiebung nur einmalig, wird OF gesetzt, falls vor Verschiebung die 2 obersten Bits ungleich waren. |
ROR | Rotate right | CO | Rotiere nach rechts. Siehe ROL |
SAHF | Store AH to flags | Flags werden mit den Bits von AH geladen: Bit 7 6 5 4 3 2 1 0 Flag SF ZF xx AF xx PF xx CF (xx = undefin. Wert). Code: 9EH = 10011110 | |
SAL= SHL |
Shift arithmetic left and shift logical left | COPSZ | In untere Bits werden Nullen eingeschoben. Das oberste Bit wird nach CF geschoben. Verschiebeanzahl im CL oder =1. Wenn Verschiebung einmalig, wird OF gesetzt, falls vor Verschiebung die 2 obersten Bits ungleich waren. |
SAR | Shift arithmetic right | COPSZ | Das oberste Bit wird gleich nach dem alten obersten Bit eingeschoben. Das unterste Bit wird nach CF geschoben. Verschiebeanzahl im CL oder =1. Wenn Verschiebeanzahl=1, wird OF gesetzt, falls vor Verschiebung die beiden obersten Bits ungleich waren. |
SBB | Subtrakt with borrow | ACOPSZ | Vorzeichenlose Subtraktion inclusive CF |
SCASB | Scan byte string | ACOPSZ | Das Byte ES[DI] wird mit AL verglichen. Dann wird DI um 1 erhöht (wenn DF=0) bzw. erniedrigt. |
SCASW | Scan word string | ACOPSZ | Das Wort ES[DI] wird mit AX verglichen. Dann wird DI um 2 erhöht (wenn DF=0) bzw. erniedrigt. |
SHL | Shift logical left | siehe bei SAL | |
SHR | Shift logical right | COPSZ | Schiebe nach rechts. In obere Bits werden Nullen eingeschoben. Das unterste Bit wird nach CF geschoben. Verschiebeanzahl im CL oder =1. Wenn Verschiebeanzahl =1, wird OF gesetzt, falls vor Verschiebung die beiden obersten Bits ungleich waren. |
STC | Set carry flag | C | Setze das Carry Flag. Code: F9H = 11111001 |
STD | Set direction flag | D | Setze das Zählrichtungs-Flag DF. Code: FDH = 11111101 |
STI | Set interrupt enable flag | Erlaubt maskierbare externe Interrupts nach Ausführung des nächsten Befehls. Code: FBH = 11111011 | |
STOSB | Store byte string | AL wird nach ES:[DI] gespeichert. DI wird um 1 erhöht, wenn DF =0 ist, sonst dekrementiert. Code: 101010lw | |
STOSW | Store word string | AX wird nach ES:[DI] gespeichert. DI wird um 2 erhöht, wenn DF =0 ist, sonst dekrementiert. Code: 101010lw | |
SUB | Subtrakt | ACOPSZ | Vorzeichenlose Subtraktion |
TEST | Test, or logical compare | COPSZ | Operanden werden verglichen (AND). CF und OF werden gelöscht. |
WAIT | Warten, bis der BUSY-Eingang nicht aktiv ist | ||
XCHG | Exchange | Byte oder Wort wird zwischen Registern oder Reg. und Speicher ausgetauscht. Für Sreg nicht anwendbar. | |
XLAT | Translate | Übersetzen: AL := <DS:BX+AL> Lädt ein Byte aus einer Tabelle (im DS) nach AL. Das AL- Reg. wird als Index einer durch das BX- Register adressierten Tabelle verwendet. Der so adressierte Operand wird nach AL geladen. Code: D7H = 11010111. z.B. MOV BX, OFFSET TAB_NAME, XLAT BYTE PTR [BX] | |
XOR | Exclusive or | COPSZ | Operanden werden verglichen und Bits gesetzt, wo ungleich. CF und OF werden gelöscht. |
Beachte auch Assembler-Programmierung für x86-Prozessoren/ Befehlsreferenz, wo einige Befehle sehr detailliert beschrieben sind.
Theorie:
Einleitung – Maschinensprache –
Assembler – Zahlensysteme –
RAM-Adressen – BWS – Debug –
CPU-Register – Einfache Befehle – Stringbefehle – Interrupts –
I/O-Ports
Versuch:
BWS1 – BWS2 –
Hallo Welt – Bootsektor – MBR
Nützlich:
Befehlsliste – PAUSE – Filter
Analyse:
Bootloader