AAA AAD AAM AAS ADC ADD AND CALL CBW CLC CLD CLI CMC CMP |
CMPSB CMPSW CWD DAA DAS DEC DIV HLT IDIV IMUL IN INC INT INTO IRET JA |
JAE JB JBE JC JCXZ JE JG JGE JL JLE JMP JNA JNAE JNB |
JNBE JNC JNE JNG JNGE JNL JNLE JNO JNP JNS JNZ JO JP JPE |
JPO JS JZ LAHF LDS LEA LES LODSB LODSW LOOP LOOPE LOOPNE LOOPNZ LOOPZ |
MOV MOVSB MOVSW MUL NEG NOP NOT OR OUT POP POPA POPF PUSH PUSHA PUSHF RCL |
RCR REP REPE REPNE REPNZ REPZ RET RETF ROL ROR SAHF SAL SAR SBB |
SCASB SCASW SHL SHR STC STD STI STOSB STOSW SUB TEST XCHG XLATB XOR |
Operand types:
操作数类型:
REG: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.
SREG: DS, ES, SS, and only as second operand: CS.
memory: [BX], [BX+SI+7], variable, etc...(see Memory Access).
immediate: 5, -24, 3Fh, 10001101b, etc...
Instruction 指令 |
Operands 操作数 |
Description 描述 |
||||||||||||||
AAA | No operands | ASCII Adjust after Addition. Corrects result in AH and AL after addition when working with BCD values. It works according to the following Algorithm: if low nibble of AL > 9 or AF = 1 then:
clear the high nibble of AL. Example:
|
||||||||||||||
AAD | No operands | ASCII Adjust before Division. Prepares two BCD values for division. Algorithm:
Example:
|
||||||||||||||
AAM | No operands | ASCII Adjust after Multiplication. Corrects the result of multiplication of two BCD values. Algorithm:
Example:
|
||||||||||||||
AAS | No operands | ASCII Adjust after Subtraction. Corrects result in AH and AL after subtraction when working with BCD values. Algorithm: if low nibble of AL > 9 or AF = 1 then:
clear the high nibble of AL. Example:
|
||||||||||||||
ADC | REG, memory memory, REG REG, REG memory, immediate REG, immediate |
Add with Carry. Algorithm: operand1 = operand1 + operand2 + CF Example:
|
||||||||||||||
ADD | REG, memory memory, REG REG, REG memory, immediate REG, immediate |
Add. Algorithm: operand1 = operand1 + operand2 Example:
|
||||||||||||||
AND | REG, memory memory, REG REG, REG memory, immediate REG, immediate |
Logical AND between all bits of two operands. Result is stored in operand1. These rules apply: 1 AND 1 = 1 1 AND 0 = 0 0 AND 1 = 0 0 AND 0 = 0 Example:
|
||||||||||||||
CALL | procedure name label 4-byte address |
Transfers control to procedure, return address is (IP) is pushed to stack. 4-byte address may be entered in this form: 1234h:5678h, first value is a segment second value is an offset (this is a far call, so CS is also pushed to stack). Example:
|
||||||||||||||
CBW | No operands | Convert byte into word. Algorithm: if high bit of AL = 1 then:
else
Example:
|
||||||||||||||
CLC | No operands | Clear Carry flag. Algorithm: CF = 0
|
||||||||||||||
CLD | No operands | Clear Direction flag. SI and DI will be incremented by chain instructions: CMPSB, CMPSW, LODSB, LODSW, MOVSB, MOVSW, STOSB, STOSW. Algorithm: DF = 0
|
||||||||||||||
CLI | No operands | Clear Interrupt enable flag. This disables hardware interrupts. Algorithm: IF = 0
|
||||||||||||||
CMC | No operands | Complement Carry flag. Inverts value of CF. Algorithm: if CF = 1 then CF = 0 if CF = 0 then CF = 1
|
||||||||||||||
CMP | REG, memory memory, REG REG, REG memory, immediate REG, immediate |
Compare. Algorithm: operand1 - operand2 result is not stored anywhere, flags are set (OF, SF, ZF, AF, PF, CF) according to result. Example:
|
||||||||||||||
CMPSB | No operands | Compare bytes: ES:[DI] from DS:[SI]. Algorithm:
see cmpsb.asm in Samples.
|
||||||||||||||
CMPSW | No operands | Compare words: ES:[DI] from DS:[SI]. Algorithm:
see cmpsw.asm in Samples.
|
||||||||||||||
CWD | No operands | Convert Word to Double word. Algorithm: if high bit of AX = 1 then:
else
Example:
|
||||||||||||||
DAA | No operands | Decimal adjust After Addition. Corrects the result of addition of two packed BCD values. Algorithm: if low nibble of AL > 9 or AF = 1 then:
Example:
|
||||||||||||||
DAS | No operands | Decimal adjust After Subtraction. Corrects the result of subtraction of two packed BCD values. Algorithm: if low nibble of AL > 9 or AF = 1 then:
Example:
|
||||||||||||||
DEC | REG memory |
Decrement. Algorithm: operand = operand - 1 Example:
|
||||||||||||||
DIV | REG memory |
Unsigned divide. Algorithm: when operand is a byte: when operand is a word:Example:
|
||||||||||||||
HLT | No operands | Halt the System. Example:
|
||||||||||||||
IDIV | REG memory |
Signed divide. Algorithm: when operand is a byte: when operand is a word:Example:
|
||||||||||||||
IMUL | REG memory |
Signed multiply. Algorithm: when operand is a byte: when operand is a word:Example:
|
||||||||||||||
IN | AL, im.byte AL, DX AX, im.byte AX, DX |
Input from port into AL or AX. Second operand is a port number. If required to access port number over 255 - DX register should be used. Example:
|
||||||||||||||
INC | REG memory |
Increment. Algorithm: operand = operand + 1 Example:
|
||||||||||||||
INT | immediate byte | Interrupt numbered by immediate byte (0..255). Algorithm:
Example:
|
||||||||||||||
INTO | No operands | Interrupt 4 if Overflow flag is 1. Algorithm: if OF = 1 then INT 4 Example: |
||||||||||||||
IRET | No operands | Interrupt Return. Algorithm:
|
||||||||||||||
JA | label | Short Jump if first operand is Above second operand (as set by CMP instruction). Unsigned. Algorithm:
|
||||||||||||||
JAE | label | Short Jump if first operand is Above or Equal to second operand (as set by CMP instruction). Unsigned. Algorithm:
|
||||||||||||||
JB | label | Short Jump if first operand is Below second operand (as set by CMP instruction). Unsigned. Algorithm:
|
||||||||||||||
JBE | label | Short Jump if first operand is Below or Equal to second operand (as set by CMP instruction). Unsigned. Algorithm:
|
||||||||||||||
JC | label | Short Jump if Carry flag is set to 1. Algorithm:
|
||||||||||||||
JCXZ | label | Short Jump if CX register is 0. Algorithm:
|
||||||||||||||
JE | label | Short Jump if first operand is Equal to second operand (as set by CMP instruction). Signed/Unsigned. Algorithm:
|
||||||||||||||
JG | label | Short Jump if first operand is Greater then second operand (as set by CMP instruction). Signed. Algorithm:
|
||||||||||||||
JGE | label | Short Jump if first operand is Greater or Equal to second operand (as set by CMP instruction). Signed. Algorithm:
|
||||||||||||||
JL | label | Short Jump if first operand is Less then second operand (as set by CMP instruction). Signed. Algorithm:
|
||||||||||||||
JLE | label | Short Jump if first operand is Less or Equal to second operand (as set by CMP instruction). Signed. Algorithm:
|
||||||||||||||
JMP | label 4-byte address |
Unconditional Jump. Transfers control to another part of the program. 4-byte address may be entered in this form: 1234h:5678h, first value is a segment second value is an offset. Algorithm:
|
||||||||||||||
JNA | label | Short Jump if first operand is Not Above second operand (as set by CMP instruction). Unsigned. Algorithm:
|
||||||||||||||
JNAE | label | Short Jump if first operand is Not Above and Not Equal to second operand (as set by CMP instruction). Unsigned. Algorithm:
|
||||||||||||||
JNB | label | Short Jump if first operand is Not Below second operand (as set by CMP instruction). Unsigned. Algorithm:
|
||||||||||||||
JNBE | label | Short Jump if first operand is Not Below and Not Equal to second operand (as set by CMP instruction). Unsigned. Algorithm:
|
||||||||||||||
JNC | label | Short Jump if Carry flag is set to 0. Algorithm:
|
||||||||||||||
JNE | label | Short Jump if first operand is Not Equal to second operand (as set by CMP instruction). Signed/Unsigned. Algorithm:
|
||||||||||||||
JNG | label | Short Jump if first operand is Not Greater then second operand (as set by CMP instruction). Signed. Algorithm:
|
||||||||||||||
JNGE | label | Short Jump if first operand is Not Greater and Not Equal to second operand (as set by CMP instruction). Signed. Algorithm:
|
||||||||||||||
JNL | label | Short Jump if first operand is Not Less then second operand (as set by CMP instruction). Signed. Algorithm:
|
||||||||||||||
JNLE | label | Short Jump if first operand is Not Less and Not Equal to second operand (as set by CMP instruction). Signed. Algorithm:
|
||||||||||||||
JNO | label | Short Jump if Not Overflow. Algorithm:
|
||||||||||||||
JNP | label | Short Jump if No Parity (odd). Only 8 low bits of result are checked. Set by CMP, SUB, ADD, TEST, AND, OR, XOR instructions. Algorithm:
|
||||||||||||||
JNS | label | Short Jump if Not Signed (if positive). Set by CMP, SUB, ADD, TEST, AND, OR, XOR instructions. Algorithm:
|
||||||||||||||
JNZ | label | Short Jump if Not Zero (not equal). Set by CMP, SUB, ADD, TEST, AND, OR, XOR instructions. Algorithm:
|
||||||||||||||
JO | label | Short Jump if Overflow. Algorithm:
|
||||||||||||||
JP | label | Short Jump if Parity (even). Only 8 low bits of result are checked. Set by CMP, SUB, ADD, TEST, AND, OR, XOR instructions. Algorithm:
|
||||||||||||||
JPE | label | Short Jump if Parity Even. Only 8 low bits of result are checked. Set by CMP, SUB, ADD, TEST, AND, OR, XOR instructions. Algorithm:
|
||||||||||||||
JPO | label | Short Jump if Parity Odd. Only 8 low bits of result are checked. Set by CMP, SUB, ADD, TEST, AND, OR, XOR instructions. Algorithm:
|
||||||||||||||
JS | label | Short Jump if Signed (if negative). Set by CMP, SUB, ADD, TEST, AND, OR, XOR instructions. Algorithm:
|
||||||||||||||
JZ | label | Short Jump if Zero (equal). Set by CMP, SUB, ADD, TEST, AND, OR, XOR instructions. Algorithm:
|
||||||||||||||
LAHF | No operands | Load AH from 8 low bits of Flags register. Algorithm:
bits 1, 3, 5 are reserved.
|
||||||||||||||
LDS | REG, memory | Load memory double word into word register and DS. Algorithm:
Example: AX is set to 1234h, DS is set to 5678h.
|
||||||||||||||
LEA | REG, memory | Load Effective Address. Algorithm:
Generally this instruction is replaced by MOV when assembling when possible. Example: AX is set to: 0104h. LEA instruction takes 3 bytes, RET takes 1 byte, we start at 100h, so the address of 'm' is 104h.
|
||||||||||||||
LES | REG, memory | Load memory double word into word register and ES. Algorithm:
Example: AX is set to 1234h, ES is set to 5678h.
|
||||||||||||||
LODSB | No operands | Load byte at DS:[SI] into AL. Update SI. Algorithm:
|
||||||||||||||
LODSW | No operands | Load word at DS:[SI] into AX. Update SI. Algorithm:
|
||||||||||||||
LOOP | label | Decrease CX, jump to label if CX not zero. Algorithm:
|
||||||||||||||
LOOPE | label | Decrease CX, jump to label if CX not zero and Equal (ZF = 1). Algorithm:
|
||||||||||||||
LOOPNE | label | Decrease CX, jump to label if CX not zero and Not Equal (ZF = 0). Algorithm:
|
||||||||||||||
LOOPNZ | label | Decrease CX, jump to label if CX not zero and ZF = 0. Algorithm:
|
||||||||||||||
LOOPZ | label | Decrease CX, jump to label if CX not zero and ZF = 1. Algorithm:
|
||||||||||||||
MOV | REG, memory memory, REG REG, REG memory, immediate REG, immediate SREG, memory memory, SREG REG, SREG SREG, REG |
Copy operand2 to operand1. The MOV instruction cannot:
Algorithm: operand1 = operand2Example:
|
||||||||||||||
MOVSB | No operands | Copy byte at DS:[SI] to ES:[DI]. Update SI and DI. Algorithm:
|
||||||||||||||
MOVSW | No operands | Copy word at DS:[SI] to ES:[DI]. Update SI and DI. Algorithm:
|
||||||||||||||
MUL | REG memory |
Unsigned multiply. Algorithm: when operand is a byte: when operand is a word:Example:
|
||||||||||||||
NEG | REG memory |
Negate. Makes operand negative (two's complement). Algorithm:
|
||||||||||||||
NOP | No operands | No Operation. Algorithm:
|
||||||||||||||
NOT | REG memory |
Invert each bit of the operand. Algorithm:
|
||||||||||||||
OR | REG, memory memory, REG REG, REG memory, immediate REG, immediate |
Logical OR between all bits of two operands. Result is stored in first operand. These rules apply: 1 OR 1 = 1 1 OR 0 = 1 0 OR 1 = 1 0 OR 0 = 0 Example:
|
||||||||||||||
OUT | im.byte, AL im.byte, AX DX, AL DX, AX |
Output from AL or AX to port. First operand is a port number. If required to access port number over 255 - DX register should be used. Example:
|
||||||||||||||
POP | REG SREG memory |
Get 16 bit value from the stack. Algorithm:
Example:
|
||||||||||||||
POPA | No operands | Pop all general purpose registers DI, SI, BP, SP, BX, DX, CX, AX from the stack. SP value is ignored, it is Popped but not set to SP register). Note: this instruction works only on 80186 CPU and later! Algorithm:
|
||||||||||||||
POPF | No operands | Get flags register from the stack. Algorithm:
|
||||||||||||||
PUSH | REG SREG memory immediate |
Store 16 bit value in the stack. Note: PUSH immediate works only on 80186 CPU and later! Algorithm:
Example:
|
||||||||||||||
PUSHA | No operands | Push all general purpose registers AX, CX, DX, BX, SP, BP, SI, DI in the stack. Original value of SP register (before PUSHA) is used. Note: this instruction works only on 80186 CPU and later! Algorithm:
|
||||||||||||||
PUSHF | No operands | Store flags register in the stack. Algorithm:
|
||||||||||||||
RCL | memory, immediate REG, immediate memory, CL REG, CL |
Rotate operand1 left through Carry Flag. The number of rotates is set by operand2. When immediate is greater then 1, assembler generates several RCL xx, 1 instructions because 8086 has machine code only for this instruction (the same principle works for all other shift/rotate instructions). Algorithm:
Example:
|
||||||||||||||
RCR | memory, immediate REG, immediate memory, CL REG, CL |
Rotate operand1 right through Carry Flag. The number of rotates is set by operand2. Algorithm:
Example:
|
||||||||||||||
REP | chain instruction |
Repeat following MOVSB, MOVSW, LODSB, LODSW, STOSB, STOSW instructions CX times. Algorithm: check_cx: if CX <> 0 then
|
||||||||||||||
REPE | chain instruction |
Repeat following CMPSB, CMPSW, SCASB, SCASW instructions while ZF = 1 (result is Equal), maximum CX times. Algorithm: check_cx: if CX <> 0 then
see cmpsb.asm in Samples.
|
||||||||||||||
REPNE | chain instruction |
Repeat following CMPSB, CMPSW, SCASB, SCASW instructions while ZF = 0 (result is Not Equal), maximum CX times. Algorithm: check_cx: if CX <> 0 then
|
||||||||||||||
REPNZ | chain instruction |
Repeat following CMPSB, CMPSW, SCASB, SCASW instructions while ZF = 0 (result is Not Zero), maximum CX times. Algorithm: check_cx: if CX <> 0 then
|
||||||||||||||
REPZ | chain instruction |
Repeat following CMPSB, CMPSW, SCASB, SCASW instructions while ZF = 1 (result is Zero), maximum CX times. Algorithm: check_cx: if CX <> 0 then
|
||||||||||||||
RET | No operands or even immediate |
Return from near procedure. Algorithm:
|
||||||||||||||
RETF | No operands or even immediate |
Return from Far procedure. Algorithm:
|
||||||||||||||
ROL | memory, immediate REG, immediate memory, CL REG, CL |
Rotate operand1 left. The number of rotates is set by operand2. Algorithm:
|
||||||||||||||
ROR | memory, immediate REG, immediate memory, CL REG, CL |
Rotate operand1 right. The number of rotates is set by operand2. Algorithm:
|
||||||||||||||
SAHF | No operands | Store AH register into low 8 bits of Flags register. Algorithm:
bits 1, 3, 5 are reserved.
|
||||||||||||||
SAL | memory, immediate REG, immediate memory, CL REG, CL |
Shift Arithmetic operand1 Left. The number of shifts is set by operand2. Algorithm:
|
||||||||||||||
SAR | memory, immediate REG, immediate memory, CL REG, CL |
Shift Arithmetic operand1 Right. The number of shifts is set by operand2. Algorithm:
|
||||||||||||||
SBB | REG, memory memory, REG REG, REG memory, immediate REG, immediate |
Subtract with Borrow. Algorithm: operand1 = operand1 - operand2 - CF Example:
|
||||||||||||||
SCASB | No operands | Compare bytes: AL from ES:[DI]. Algorithm:
|
||||||||||||||
SCASW | No operands | Compare words: AX from ES:[DI]. Algorithm:
|
||||||||||||||
SHL | memory, immediate REG, immediate memory, CL REG, CL |
Shift operand1 Left. The number of shifts is set by operand2. Algorithm:
|
||||||||||||||
SHR | memory, immediate REG, immediate memory, CL REG, CL |
Shift operand1 Right. The number of shifts is set by operand2. Algorithm:
|
||||||||||||||
STC | No operands | Set Carry flag. Algorithm: CF = 1
|
||||||||||||||
STD | No operands | Set Direction flag. SI and DI will be decremented by chain instructions: CMPSB, CMPSW, LODSB, LODSW, MOVSB, MOVSW, STOSB, STOSW. Algorithm: DF = 1
|
||||||||||||||
STI | No operands | Set Interrupt enable flag. This enables hardware interrupts. Algorithm: IF = 1
|
||||||||||||||
STOSB | No operands | Store byte in AL into ES:[DI]. Update SI. Algorithm:
|
||||||||||||||
STOSW | No operands | Store word in AX into ES:[DI]. Update SI. Algorithm:
|
||||||||||||||
SUB | REG, memory memory, REG REG, REG memory, immediate REG, immediate |
Subtract. Algorithm: operand1 = operand1 - operand2 Example:
|
||||||||||||||
TEST | REG, memory memory, REG REG, REG memory, immediate REG, immediate |
Logical AND between all bits of two operands for flags only. These flags are effected: ZF, SF, PF. Result is not stored anywhere. These rules apply: 1 AND 1 = 1 1 AND 0 = 0 0 AND 1 = 0 0 AND 0 = 0 Example:
|
||||||||||||||
XCHG | REG, memory memory, REG REG, REG |
Exchange values of two operands. Algorithm: operand1 < - > operand2 Example:
|
||||||||||||||
XLATB | No operands | Translate byte from table. Copy value of memory byte at DS:[BX + unsigned AL] to AL register. Algorithm: AL = DS:[BX + unsigned AL] Example:
|
||||||||||||||
XOR | REG, memory memory, REG REG, REG memory, immediate REG, immediate |
Logical XOR (Exclusive OR) between all bits of two operands. Result is stored in first operand. These rules apply: 1 XOR 1 = 0 1 XOR 0 = 1 0 XOR 1 = 1 0 XOR 0 = 0 Example:
|