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:
- AL = AL + 6
- AH = AH + 1
- AF = 1
- CF = 1
else
in both cases:
clear the high nibble of AL.
Example:
MOV AX, 15 ; AH = 00, AL = 0Fh
AAA ; AH = 01, AL = 05
RET
|
AAD
|
No operands |
ASCII Adjust before Division.
Prepares two BCD values for division.
Algorithm:
- AL = (AH * 10) + AL
- AH = 0
Example:
MOV AX, 0105h ; AH = 01, AL = 05
AAD ; AH = 00, AL = 0Fh (15)
RET
|
AAM
|
No operands |
ASCII Adjust after Multiplication.
Corrects the result of multiplication of two BCD values.
Algorithm:
- AH = AL / 10
- AL = remainder
Example:
MOV AL, 15 ; AL = 0Fh
AAM ; AH = 01, AL = 05
RET
|
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:
- AL = AL - 6
- AH = AH - 1
- AF = 1
- CF = 1
else
in both cases:
clear the high nibble of AL.
Example:
MOV AX, 02FFh ; AH = 02, AL = 0FFh
AAS ; AH = 01, AL = 09
RET
|
ADC
|
REG, memory
memory, REG
REG, REG
memory, immediate
REG, immediate
|
Add with Carry.
Algorithm:
operand1 = operand1 + operand2 + CF
Example:
STC ; set CF = 1
MOV AL, 5 ; AL = 5
ADC AL, 1 ; AL = 7
RET
|
ADD
|
REG, memory
memory, REG
REG, REG
memory, immediate
REG, immediate
|
Add.
Algorithm:
operand1 = operand1 + operand2
Example:
MOV AL, 5 ; AL = 5
ADD AL, -3 ; AL = 2
RET
|
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:
MOV AL, 'a' ; AL = 01100001b
AND AL, 11011111b ; AL = 01000001b ('A')
RET
|
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:
#make_COM#
ORG 100h ; for COM file.
CALL p1
ADD AX, 1
RET ; return to OS.
p1 PROC ; procedure declaration.
MOV AX, 1234h
RET ; return to caller.
p1 ENDP
|
CBW
|
No operands |
Convert byte into word.
Algorithm:
if high bit of AL = 1 then:
else
Example:
MOV AX, 0 ; AH = 0, AL = 0
MOV AL, -5 ; AX = 000FBh (251)
CBW ; AX = 0FFFBh (-5)
RET
|
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:
MOV AL, 5
MOV BL, 5
CMP AL, BL ; AL = 5, ZF = 1 (so equal!)
RET
|
CMPSB
|
No operands |
Compare bytes: ES:[DI] from DS:[SI].
Algorithm:
- DS:[SI] - ES:[DI]
- set flags according to result:
OF, SF, ZF, AF, PF, CF
- if DF = 0 then
else
|
CMPSW
|
No operands |
Compare words: ES:[DI] from DS:[SI].
Algorithm:
- DS:[SI] - ES:[DI]
- set flags according to result:
OF, SF, ZF, AF, PF, CF
- if DF = 0 then
else
|
CWD
|
No operands |
Convert Word to Double word.
Algorithm:
if high bit of AX = 1 then:
else
Example:
MOV DX, 0 ; DX = 0
MOV AX, 0 ; AX = 0
MOV AX, -5 ; DX AX = 00000h:0FFFBh
CWD ; DX AX = 0FFFFh:0FFFBh
RET
|
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:
if AL > 9Fh or CF = 1 then:
Example:
MOV AL, 0Fh ; AL = 0Fh (15)
DAA ; AL = 15h
RET
|
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:
if AL > 9Fh or CF = 1 then:
Example:
MOV AL, 0FFh ; AL = 0FFh (-1)
DAS ; AL = 99h, CF = 1
RET
|
DEC
|
REG
memory
|
Decrement.
Algorithm:
operand = operand - 1
Example:
MOV AL, 255 ; AL = 0FFh (255 or -1)
DEC AL ; AL = 0FEh (254 or -2)
RET
CF - unchanged!
|
DIV
|
REG
memory
|
Unsigned divide.
Algorithm:
when operand is a byte:
AL = AX / operand
AH = remainder (modulus)
when operand is a word:
AX = (DX AX) / operand
DX = remainder (modulus)
Example:
MOV AX, 203 ; AX = 00CBh
MOV BL, 4
DIV BL ; AL = 50 (32h), AH = 3
RET
|
HLT
|
No operands |
Halt the System.
Example:
MOV AX, 5
HLT
|
IDIV
|
REG
memory
|
Signed divide.
Algorithm:
when operand is a byte:
AL = AX / operand
AH = remainder (modulus)
when operand is a word:
AX = (DX AX) / operand
DX = remainder (modulus)
Example:
MOV AX, -203 ; AX = 0FF35h
MOV BL, 4
IDIV BL ; AL = -50 (0CEh), AH = -3 (0FDh)
RET
|
IMUL
|
REG
memory
|
Signed multiply.
Algorithm:
when operand is a byte:
AX = AL * operand.
when operand is a word:
(DX AX) = AX * operand.
Example:
MOV AL, -2
MOV BL, -4
IMUL BL ; AX = 8
RET
CF=OF=0 when result fits into operand of IMUL.
|
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:
IN AX, 4 ; get status of traffic lights.
IN AL, 7 ; get status of stepper-motor.
|
INC
|
REG
memory
|
Increment.
Algorithm:
operand = operand + 1
Example:
MOV AL, 4
INC AL ; AL = 5
RET
CF - unchanged!
|
INT
|
immediate byte
|
Interrupt numbered by immediate byte (0..255).
Algorithm:
Push to stack:
- IF = 0
- Transfer control to interrupt procedure
Example:
MOV AH, 0Eh ; teletype.
MOV AL, 'A'
INT 10h ; BIOS interrupt.
RET
C | Z | S | O | P | A | I |
unchanged | 0 |
|
INTO
|
No operands |
Interrupt 4 if Overflow flag is 1.
Algorithm:
if OF = 1 then INT 4
Example:
; -5 - 127 = -132 (not in -128..127)
; the result of SUB is wrong (124),
; so OF = 1 is set:
MOV AL, -5
SUB AL, 127 ; AL = 7Ch (124)
INTO ; process error.
RET
|
IRET
|
No operands |
Interrupt Return.
Algorithm:
|
JA
|
label
|
Short Jump if first operand is Above second operand (as set by CMP instruction).
Unsigned.
Algorithm:
if (CF = 0) and (ZF = 0) then jump
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 250
CMP AL, 5
JA label1
PRINT 'AL is not above 5'
JMP exit
label1:
PRINT 'AL is above 5'
exit:
RET
|
JAE
|
label
|
Short Jump if first operand is Above or Equal to second operand (as set by CMP instruction).
Unsigned.
Algorithm:
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 5
CMP AL, 5
JAE label1
PRINT 'AL is not above or equal to 5'
JMP exit
label1:
PRINT 'AL is above or equal to 5'
exit:
RET
|
JB
|
label
|
Short Jump if first operand is Below second operand (as set by CMP instruction).
Unsigned.
Algorithm:
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 1
CMP AL, 5
JB label1
PRINT 'AL is not below 5'
JMP exit
label1:
PRINT 'AL is below 5'
exit:
RET
|
JBE
|
label
|
Short Jump if first operand is Below or Equal to second operand (as set by CMP instruction).
Unsigned.
Algorithm:
if CF = 1 or ZF = 1 then jump
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 5
CMP AL, 5
JBE label1
PRINT 'AL is not below or equal to 5'
JMP exit
label1:
PRINT 'AL is below or equal to 5'
exit:
RET
|
JC
|
label
|
Short Jump if Carry flag is set to 1.
Algorithm:
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 255
ADD AL, 1
JC label1
PRINT 'no carry.'
JMP exit
label1:
PRINT 'has carry.'
exit:
RET
|
JCXZ
|
label
|
Short Jump if CX register is 0.
Algorithm:
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV CX, 0
JCXZ label1
PRINT 'CX is not zero.'
JMP exit
label1:
PRINT 'CX is zero.'
exit:
RET
|
JE
|
label
|
Short Jump if first operand is Equal to second operand (as set by CMP instruction).
Signed/Unsigned.
Algorithm:
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 5
CMP AL, 5
JE label1
PRINT 'AL is not equal to 5.'
JMP exit
label1:
PRINT 'AL is equal to 5.'
exit:
RET
|
JG
|
label
|
Short Jump if first operand is Greater then second operand (as set by CMP instruction).
Signed.
Algorithm:
if (ZF = 0) and (SF = OF) then jump
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 5
CMP AL, -5
JG label1
PRINT 'AL is not greater -5.'
JMP exit
label1:
PRINT 'AL is greater -5.'
exit:
RET
|
JGE
|
label
|
Short Jump if first operand is Greater or Equal to second operand (as set by CMP instruction).
Signed.
Algorithm:
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 2
CMP AL, -5
JGE label1
PRINT 'AL < -5'
JMP exit
label1:
PRINT 'AL >= -5'
exit:
RET
|
JL
|
label
|
Short Jump if first operand is Less then second operand (as set by CMP instruction).
Signed.
Algorithm:
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, -2
CMP AL, 5
JL label1
PRINT 'AL >= 5.'
JMP exit
label1:
PRINT 'AL < 5.'
exit:
RET
|
JLE
|
label
|
Short Jump if first operand is Less or Equal to second operand (as set by CMP instruction).
Signed.
Algorithm:
if SF <> OF or ZF = 1 then jump
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, -2
CMP AL, 5
JLE label1
PRINT 'AL > 5.'
JMP exit
label1:
PRINT 'AL <= 5.'
exit:
RET
|
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:
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 5
JMP label1 ; jump over 2 lines!
PRINT 'Not Jumped!'
MOV AL, 0
label1:
PRINT 'Got Here!'
RET
|
JNA
|
label
|
Short Jump if first operand is Not Above second operand (as set by CMP instruction).
Unsigned.
Algorithm:
if CF = 1 or ZF = 1 then jump
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 2
CMP AL, 5
JNA label1
PRINT 'AL is above 5.'
JMP exit
label1:
PRINT 'AL is not above 5.'
exit:
RET
|
JNAE
|
label
|
Short Jump if first operand is Not Above and Not Equal to second operand (as set by CMP instruction).
Unsigned.
Algorithm:
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 2
CMP AL, 5
JNAE label1
PRINT 'AL >= 5.'
JMP exit
label1:
PRINT 'AL < 5.'
exit:
RET
|
JNB
|
label
|
Short Jump if first operand is Not Below second operand (as set by CMP instruction).
Unsigned.
Algorithm:
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 7
CMP AL, 5
JNB label1
PRINT 'AL < 5.'
JMP exit
label1:
PRINT 'AL >= 5.'
exit:
RET
|
JNBE
|
label
|
Short Jump if first operand is Not Below and Not Equal to second operand (as set by CMP instruction).
Unsigned.
Algorithm:
if (CF = 0) and (ZF = 0) then jump
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 7
CMP AL, 5
JNBE label1
PRINT 'AL <= 5.'
JMP exit
label1:
PRINT 'AL > 5.'
exit:
RET
|
JNC
|
label
|
Short Jump if Carry flag is set to 0.
Algorithm:
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 2
ADD AL, 3
JNC label1
PRINT 'has carry.'
JMP exit
label1:
PRINT 'no carry.'
exit:
RET
|
JNE
|
label
|
Short Jump if first operand is Not Equal to second operand (as set by CMP instruction).
Signed/Unsigned.
Algorithm:
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 2
CMP AL, 3
JNE label1
PRINT 'AL = 3.'
JMP exit
label1:
PRINT 'Al <> 3.'
exit:
RET
|
JNG
|
label
|
Short Jump if first operand is Not Greater then second operand (as set by CMP instruction).
Signed.
Algorithm:
if (ZF = 1) and (SF <> OF) then jump
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 2
CMP AL, 3
JNG label1
PRINT 'AL > 3.'
JMP exit
label1:
PRINT 'Al <= 3.'
exit:
RET
|
JNGE
|
label
|
Short Jump if first operand is Not Greater and Not Equal to second operand (as set by CMP instruction).
Signed.
Algorithm:
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 2
CMP AL, 3
JNGE label1
PRINT 'AL >= 3.'
JMP exit
label1:
PRINT 'Al < 3.'
exit:
RET
|
JNL
|
label
|
Short Jump if first operand is Not Less then second operand (as set by CMP instruction).
Signed.
Algorithm:
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 2
CMP AL, -3
JNL label1
PRINT 'AL < -3.'
JMP exit
label1:
PRINT 'Al >= -3.'
exit:
RET
|
JNLE
|
label
|
Short Jump if first operand is Not Less and Not Equal to second operand (as set by CMP instruction).
Signed.
Algorithm:
if (SF = OF) and (ZF = 0) then jump
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 2
CMP AL, -3
JNLE label1
PRINT 'AL <= -3.'
JMP exit
label1:
PRINT 'Al > -3.'
exit:
RET
|
JNO
|
label
|
Short Jump if Not Overflow.
Algorithm:
Example:
; -5 - 2 = -7 (inside -128..127)
; the result of SUB is correct,
; so OF = 0:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, -5
SUB AL, 2 ; AL = 0F9h (-7)
JNO label1
PRINT 'overflow!'
JMP exit
label1:
PRINT 'no overflow.'
exit:
RET
|
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:
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 00000111b ; AL = 7
OR AL, 0 ; just set flags.
JNP label1
PRINT 'parity even.'
JMP exit
label1:
PRINT 'parity odd.'
exit:
RET
|
JNS
|
label
|
Short Jump if Not Signed (if positive).
Set by CMP, SUB, ADD, TEST, AND, OR, XOR instructions.
Algorithm:
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 00000111b ; AL = 7
OR AL, 0 ; just set flags.
JNS label1
PRINT 'signed.'
JMP exit
label1:
PRINT 'not signed.'
exit:
RET
|
JNZ
|
label
|
Short Jump if Not Zero (not equal).
Set by CMP, SUB, ADD, TEST, AND, OR, XOR instructions.
Algorithm:
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 00000111b ; AL = 7
OR AL, 0 ; just set flags.
JNZ label1
PRINT 'zero.'
JMP exit
label1:
PRINT 'not zero.'
exit:
RET
|
JO
|
label
|
Short Jump if Overflow.
Algorithm:
Example:
; -5 - 127 = -132 (not in -128..127)
; the result of SUB is wrong (124),
; so OF = 1 is set:
include 'emu8086.inc'
#make_COM#
org 100h
MOV AL, -5
SUB AL, 127 ; AL = 7Ch (124)
JO label1
PRINT 'no overflow.'
JMP exit
label1:
PRINT 'overflow!'
exit:
RET
|
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:
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 00000101b ; AL = 5
OR AL, 0 ; just set flags.
JP label1
PRINT 'parity odd.'
JMP exit
label1:
PRINT 'parity even.'
exit:
RET
|
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:
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 00000101b ; AL = 5
OR AL, 0 ; just set flags.
JPE label1
PRINT 'parity odd.'
JMP exit
label1:
PRINT 'parity even.'
exit:
RET
|
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:
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 00000111b ; AL = 7
OR AL, 0 ; just set flags.
JPO label1
PRINT 'parity even.'
JMP exit
label1:
PRINT 'parity odd.'
exit:
RET
|
JS
|
label
|
Short Jump if Signed (if negative).
Set by CMP, SUB, ADD, TEST, AND, OR, XOR instructions.
Algorithm:
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 10000000b ; AL = -128
OR AL, 0 ; just set flags.
JS label1
PRINT 'not signed.'
JMP exit
label1:
PRINT 'signed.'
exit:
RET
|
JZ
|
label
|
Short Jump if Zero (equal).
Set by CMP, SUB, ADD, TEST, AND, OR, XOR instructions.
Algorithm:
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 5
CMP AL, 5
JZ label1
PRINT 'AL is not equal to 5.'
JMP exit
label1:
PRINT 'AL is equal to 5.'
exit:
RET
|
LAHF
|
No operands |
Load AH from 8 low bits of Flags register.
Algorithm:
AH bit: 7 6 5 4 3 2 1 0
[SF] [ZF] [0] [AF] [0] [PF] [1] [CF]
bits 1, 3, 5 are reserved.
|
LDS
|
REG, memory
|
Load memory double word into word register and DS.
Algorithm:
- REG = first word
- DS = second word
Example:
#make_COM#
ORG 100h
LDS AX, m
RET
m DW 1234h
DW 5678h
END
AX is set to 1234h, DS is set to 5678h.
|
LEA
|
REG, memory
|
Load Effective Address.
Algorithm:
- REG = address of memory (offset)
Generally this instruction is replaced by MOV when assembling when possible.
Example:
#make_COM#
ORG 100h
LEA AX, m
RET
m DW 1234h
END
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:
- REG = first word
- ES = second word
Example:
#make_COM#
ORG 100h
LES AX, m
RET
m DW 1234h
DW 5678h
END
AX is set to 1234h, ES is set to 5678h.
|
LODSB
|
No operands |
Load byte at DS:[SI] into AL. Update SI.
Algorithm:
- AL = DS:[SI]
- if DF = 0 then
else
Example:
#make_COM#
ORG 100h
LEA SI, a1
MOV CX, 5
MOV AH, 0Eh
m: LODSB
INT 10h
LOOP m
RET
a1 DB 'H', 'e', 'l', 'l', 'o'
|
LODSW
|
No operands |
Load word at DS:[SI] into AX. Update SI.
Algorithm:
- AX = DS:[SI]
- if DF = 0 then
else
Example:
#make_COM#
ORG 100h
LEA SI, a1
MOV CX, 5
REP LODSW ; finally there will be 555h in AX.
RET
a1 dw 111h, 222h, 333h, 444h, 555h
|
LOOP
|
label
|
Decrease CX, jump to label if CX not zero.
Algorithm:
- CX = CX - 1
- if CX <> 0 then
else
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV CX, 5
label1:
PRINTN 'loop!'
LOOP label1
RET
|
LOOPE
|
label
|
Decrease CX, jump to label if CX not zero and Equal (ZF = 1).
Algorithm:
- CX = CX - 1
- if (CX <> 0) and (ZF = 1) then
else
Example:
; Loop until result fits into AL alone,
; or 5 times. The result will be over 255
; on third loop (100+100+100),
; so loop will exit.
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AX, 0
MOV CX, 5
label1:
PUTC '*'
ADD AX, 100
CMP AH, 0
LOOPE label1
RET
|
LOOPNE
|
label
|
Decrease CX, jump to label if CX not zero and Not Equal (ZF = 0).
Algorithm:
- CX = CX - 1
- if (CX <> 0) and (ZF = 0) then
else
Example:
; Loop until '7' is found,
; or 5 times.
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV SI, 0
MOV CX, 5
label1:
PUTC '*'
MOV AL, v1[SI]
INC SI ; next byte (SI=SI+1).
CMP AL, 7
LOOPNE label1
RET
v1 db 9, 8, 7, 6, 5
|
LOOPNZ
|
label
|
Decrease CX, jump to label if CX not zero and ZF = 0.
Algorithm:
- CX = CX - 1
- if (CX <> 0) and (ZF = 0) then
else
Example:
; Loop until '7' is found,
; or 5 times.
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV SI, 0
MOV CX, 5
label1:
PUTC '*'
MOV AL, v1[SI]
INC SI ; next byte (SI=SI+1).
CMP AL, 7
LOOPNZ label1
RET
v1 db 9, 8, 7, 6, 5
|
LOOPZ
|
label
|
Decrease CX, jump to label if CX not zero and ZF = 1.
Algorithm:
- CX = CX - 1
- if (CX <> 0) and (ZF = 1) then
else
Example:
; Loop until result fits into AL alone,
; or 5 times. The result will be over 255
; on third loop (100+100+100),
; so loop will exit.
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AX, 0
MOV CX, 5
label1:
PUTC '*'
ADD AX, 100
CMP AH, 0
LOOPZ label1
RET
|
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:
- set the value of the CS and IP registers.
- copy value of one segment register to another segment register (should copy to general register first).
- copy immediate value to segment register (should copy to general register first).
Algorithm:
operand1 = operand2
Example:
#make_COM#
ORG 100h
MOV AX, 0B800h ; set AX = B800h (VGA memory).
MOV DS, AX ; copy value of AX to DS.
MOV CL, 'A' ; CL = 41h (ASCII code).
MOV CH, 01011111b ; CL = color attribute.
MOV BX, 15Eh ; BX = position on screen.
MOV [BX], CX ; w.[0B800h:015Eh] = CX.
RET ; returns to operating system.
|
MOVSB
|
No operands |
Copy byte at DS:[SI] to ES:[DI].
Update SI and DI.
Algorithm:
- ES:[DI] = DS:[SI]
- if DF = 0 then
else
Example:
#make_COM#
ORG 100h
LEA SI, a1
LEA DI, a2
MOV CX, 5
REP MOVSB
RET
a1 DB 1,2,3,4,5
a2 DB 5 DUP(0)
|
MOVSW
|
No operands |
Copy word at DS:[SI] to ES:[DI].
Update SI and DI.
Algorithm:
- ES:[DI] = DS:[SI]
- if DF = 0 then
else
Example:
#make_COM#
ORG 100h
LEA SI, a1
LEA DI, a2
MOV CX, 5
REP MOVSW
RET
a1 DW 1,2,3,4,5
a2 DW 5 DUP(0)
|
MUL
|
REG
memory
|
Unsigned multiply.
Algorithm:
when operand is a byte:
AX = AL * operand.
when operand is a word:
(DX AX) = AX * operand.
Example:
MOV AL, 200 ; AL = 0C8h
MOV BL, 4
MUL BL ; AX = 0320h (800)
RET
CF=OF=0 when high section of the result is zero.
|
NEG
|
REG
memory
|
Negate. Makes operand negative (two's complement).
Algorithm:
- Invert all bits of the operand
- Add 1 to inverted operand
Example:
MOV AL, 5 ; AL = 05h
NEG AL ; AL = 0FBh (-5)
NEG AL ; AL = 05h (5)
RET
|
NOP
|
No operands |
No Operation.
Algorithm:
Example:
; do nothing, 3 times:
NOP
NOP
NOP
RET
|
NOT
|
REG
memory
|
Invert each bit of the operand.
Algorithm:
- if bit is 1 turn it to 0.
- if bit is 0 turn it to 1.
Example:
MOV AL, 00011011b
NOT AL ; AL = 11100100b
RET
|
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:
MOV AL, 'A' ; AL = 01000001b
OR AL, 00100000b ; AL = 01100001b ('a')
RET
|
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:
MOV AX, 0FFFh ; Turn on all
OUT 4, AX ; traffic lights.
MOV AL, 100b ; Turn on the third
OUT 7, AL ; magnet of the stepper-motor.
|
POP
|
REG
SREG
memory
|
Get 16 bit value from the stack.
Algorithm:
- operand = SS:[SP] (top of the stack)
- SP = SP + 2
Example:
MOV AX, 1234h
PUSH AX
POP DX ; DX = 1234h
RET
|
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:
- POP DI
- POP SI
- POP BP
- POP xx (SP value ignored)
- POP BX
- POP DX
- POP CX
- POP AX
|
POPF
|
No operands |
Get flags register from the stack.
Algorithm:
- flags = SS:[SP] (top of the stack)
- SP = SP + 2
|
PUSH
|
REG
SREG
memory
immediate
|
Store 16 bit value in the stack.
Note: PUSH immediate works only on 80186 CPU and later!
Algorithm:
- SP = SP - 2
- SS:[SP] (top of the stack) = operand
Example:
MOV AX, 1234h
PUSH AX
POP DX ; DX = 1234h
RET
|
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:
- PUSH AX
- PUSH CX
- PUSH DX
- PUSH BX
- PUSH SP
- PUSH BP
- PUSH SI
- PUSH DI
|
PUSHF
|
No operands |
Store flags register in the stack.
Algorithm:
- SP = SP - 2
- SS:[SP] (top of the stack) = flags
|
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:
shift all bits left, the bit that goes off is set to
CF and previous value of CF is inserted to the right-most position.
Example:
STC ; set carry (CF=1).
MOV AL, 1Ch ; AL = 00011100b
RCL AL, 1 ; AL = 00111001b, CF=0.
RET
OF=0 if first operand keeps original sign.
|
RCR
|
memory, immediate
REG, immediate
memory, CL
REG, CL
|
Rotate operand1 right through Carry Flag. The number of rotates is set by operand2.
Algorithm:
shift all bits right, the bit that goes off is set to
CF and previous value of CF is inserted to the left-most position.
Example:
STC ; set carry (CF=1).
MOV AL, 1Ch ; AL = 00011100b
RCR AL, 1 ; AL = 10001110b, CF=0.
RET
OF=0 if first operand keeps original sign.
|
REP
|
chain instruction
|
Repeat following MOVSB, MOVSW, LODSB, LODSW, STOSB, STOSW instructions
CX times.
Algorithm:
check_cx:
if CX <> 0 then
- do following chain instruction
- CX = CX - 1
- go back to check_cx
else
|
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
- do following chain instruction
- CX = CX - 1
- if ZF = 1 then:
else
else
|
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
- do following chain instruction
- CX = CX - 1
- if ZF = 0 then:
else
else
|
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
- do following chain instruction
- CX = CX - 1
- if ZF = 0 then:
else
else
|
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
- do following chain instruction
- CX = CX - 1
- if ZF = 1 then:
else
else
|
RET
|
No operands
or even immediate |
Return from near procedure.
Algorithm:
-
Pop from stack:
-
if immediate operand is present:
SP = SP + operand
Example:
#make_COM#
ORG 100h ; for COM file.
CALL p1
ADD AX, 1
RET ; return to OS.
p1 PROC ; procedure declaration.
MOV AX, 1234h
RET ; return to caller.
p1 ENDP
|
RETF
|
No operands
or even immediate |
Return from Far procedure.
Algorithm:
-
Pop from stack:
-
if immediate operand is present:
SP = SP + operand
|
ROL
|
memory, immediate
REG, immediate
memory, CL
REG, CL
|
Rotate operand1 left. The number of rotates is set by operand2.
Algorithm:
shift all bits left, the bit that goes off is set to
CF and the same bit is inserted to the right-most position.
Example:
MOV AL, 1Ch ; AL = 00011100b
ROL AL, 1 ; AL = 00111000b, CF=0.
RET
OF=0 if first operand keeps original sign.
|
ROR
|
memory, immediate
REG, immediate
memory, CL
REG, CL
|
Rotate operand1 right. The number of rotates is set by operand2.
Algorithm:
shift all bits right, the bit that goes off is set to
CF and the same bit is inserted to the left-most position.
Example:
MOV AL, 1Ch ; AL = 00011100b
ROR AL, 1 ; AL = 00001110b, CF=0.
RET
OF=0 if first operand keeps original sign.
|
SAHF
|
No operands |
Store AH register into low 8 bits of Flags register.
Algorithm:
AH bit: 7 6 5 4 3 2 1 0
[SF] [ZF] [0] [AF] [0] [PF] [1] [CF]
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:
- Shift all bits left, the bit that goes off is set to CF.
- Zero bit is inserted to the right-most position.
Example:
MOV AL, 0E0h ; AL = 11100000b
SAL AL, 1 ; AL = 11000000b, CF=1.
RET
OF=0 if first operand keeps original sign.
|
SAR
|
memory, immediate
REG, immediate
memory, CL
REG, CL
|
Shift Arithmetic operand1 Right. The number of shifts is set by operand2.
Algorithm:
- Shift all bits right, the bit that goes off is set to CF.
- The sign bit that is inserted to the left-most position has
the same value as before shift.
Example:
MOV AL, 0E0h ; AL = 11100000b
SAR AL, 1 ; AL = 11110000b, CF=0.
MOV BL, 4Ch ; BL = 01001100b
SAR BL, 1 ; BL = 00100110b, CF=0.
RET
OF=0 if first operand keeps original sign.
|
SBB
|
REG, memory
memory, REG
REG, REG
memory, immediate
REG, immediate
|
Subtract with Borrow.
Algorithm:
operand1 = operand1 - operand2 - CF
Example:
STC
MOV AL, 5
SBB AL, 3 ; AL = 5 - 3 - 1 = 1
RET
|
SCASB
|
No operands |
Compare bytes: AL from ES:[DI].
Algorithm:
- ES:[DI] - AL
- set flags according to result:
OF, SF, ZF, AF, PF, CF
- if DF = 0 then
else
|
SCASW
|
No operands |
Compare words: AX from ES:[DI].
Algorithm:
- ES:[DI] - AX
- set flags according to result:
OF, SF, ZF, AF, PF, CF
- if DF = 0 then
else
|
SHL
|
memory, immediate
REG, immediate
memory, CL
REG, CL
|
Shift operand1 Left. The number of shifts is set by operand2.
Algorithm:
- Shift all bits left, the bit that goes off is set to CF.
- Zero bit is inserted to the right-most position.
Example:
MOV AL, 11100000b
SHL AL, 1 ; AL = 11000000b, CF=1.
RET
OF=0 if first operand keeps original sign.
|
SHR
|
memory, immediate
REG, immediate
memory, CL
REG, CL
|
Shift operand1 Right. The number of shifts is set by operand2.
Algorithm:
- Shift all bits right, the bit that goes off is set to CF.
- Zero bit is inserted to the left-most position.
Example:
MOV AL, 00000111b
SHR AL, 1 ; AL = 00000011b, CF=1.
RET
OF=0 if first operand keeps original sign.
|
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:
- ES:[DI] = AL
- if DF = 0 then
else
Example:
#make_COM#
ORG 100h
LEA DI, a1
MOV AL, 12h
MOV CX, 5
REP STOSB
RET
a1 DB 5 dup(0)
|
STOSW
|
No operands |
Store word in AX into ES:[DI]. Update SI.
Algorithm:
- ES:[DI] = AX
- if DF = 0 then
else
Example:
#make_COM#
ORG 100h
LEA DI, a1
MOV AX, 1234h
MOV CX, 5
REP STOSW
RET
a1 DW 5 dup(0)
|
SUB
|
REG, memory
memory, REG
REG, REG
memory, immediate
REG, immediate
|
Subtract.
Algorithm:
operand1 = operand1 - operand2
Example:
MOV AL, 5
SUB AL, 1 ; AL = 4
RET
|
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:
MOV AL, 00000101b
TEST AL, 1 ; ZF = 0.
TEST AL, 10b ; ZF = 1.
RET
|
XCHG
|
REG, memory
memory, REG
REG, REG
|
Exchange values of two operands.
Algorithm:
operand1 < - > operand2
Example:
MOV AL, 5
MOV AH, 2
XCHG AL, AH ; AL = 2, AH = 5
XCHG AL, AH ; AL = 5, AH = 2
RET
|
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:
#make_COM#
ORG 100h
LEA BX, dat
MOV AL, 2
XLATB ; AL = 33h
RET
dat DB 11h, 22h, 33h, 44h, 55h
|
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:
MOV AL, 00000111b
XOR AL, 00000010b ; AL = 00000101b
RET
|