8086 INSTRUCTION SET
DATA TRANSFER INSTRUCTIONS
MOV – MOV Destination, Source
The MOV instruction copies a word or byte of data from a specified source to a specified destination. The
destination can be a register or a memory location. The source can be a register, a memory location or an
immediate number. The source and destination cannot both be memory locations. They must both be of
the same type (bytes or words). MOV instruction does not affect any flag.
MOV CX, 037AH Put immediate number 037AH to CX
MOV BL, [437AH] Copy byte in DS at offset 437AH to BL
MOV AX, BX Copy content of register BX to AX
MOV DL, [BX] Copy byte from memory at [BX] to DL
MOV DS, BX Copy word from BX to DS register
MOV RESULT [BP], AX Copy AX to two memory locations;
AL to the first location, AH to the second;
EA of the first memory location is sum of the displacement
represented by RESULTS and content of BP.
Physical address = EA + SS.
MOV ES: RESULTS [BP], AX Same as the above instruction, but physical address = EA + ES,
because of the segment override prefix ES
XCHG – XCHG Destination, Source
The XCHG instruction exchanges the content of a register with the content of another register or with the
content of memory location(s). It cannot directly exchange the content of two memory locations. The
source and destination must both be of the same type (bytes or words). The segment registers cannot be
used in this instruction. This instruction does not affect any flag.
XCHG AX, DX Exchange word in AX with word in DX
XCHG BL, CH Exchange byte in BL with byte in CH
XCHG AL, PRICES [BX] Exchange byte in AL with byte in memory at
EA = PRICE [BX] in DS.
LEA – LEA Register, Source
This instruction determines the offset of the variable or memory location named as the source and puts
this offset in the indicated 16-bit register. LEA does not affect any flag.
LEA BX, PRICES Load BX with offset of PRICE in DS
LEA BP, SS: STACK_TOP Load BP with offset of STACK_TOP in SS
LEA CX, [BX][DI] Load CX with EA = [BX] + [DI]
LDS – LDS Register, Memory address of the first word
This instruction loads new values into the specified register and into the DS register from four successive
memory locations. The word from two memory locations is copied into the specified register and the
word from the next two memory locations is copied into the DS registers. LDS does not affect any flag.
LDS BX, [4326] Copy content of memory at displacement 4326H in DS to BL,
content of 4327H to BH. Copy content at displacement of
4328H and 4329H in DS to DS register.
LDS SI, SPTR Copy content of memory at displacement SPTR and SPTR + 1
, in DS to SI register. Copy content of memory at displacements
SPTR + 2 and SPTR + 3 in DS to DS register. DS: SI now points
at start of the desired string.
LES – LES Register, Memory address of the first word
This instruction loads new values into the specified register and into the ES register from four successive
memory locations. The word from the first two memory locations is copied into the specified register, and
the word from the next two memory locations is copied into the ES register. LES does not affect any flag.
LES BX, [789AH] Copy content of memory at displacement 789AH in DS to BL,
content of 789BH to BH, content of memory at displacement
789CH and 789DH in DS is copied to ES register.
LES DI, [BX] Copy content of memory at offset [BX] and offset [BX] + 1 in
DS to DI register. Copy content of memory at offset [BX] + 2
and [BX] + 3 to ES register.
ARITHMETIC INSTRUCTIONS
ADD – ADD Destination, Source
ADC – ADC Destination, Source
These instructions add a number from some source to a number in some destination and put the result in
the specified destination. The ADC also adds the status of the carry flag to the result. The source may be
an immediate number, a register, or a memory location. The destination may be a register or a memory
location. The source and the destination in an instruction cannot both be memory locations. The source
and the destination must be of the same type (bytes or words). If you want to add a byte to a word, you
must copy the byte to a word location and fill the upper byte of the word with 0’s before adding. Flags
affected: AF, CF, OF, SF, ZF.
ADD AL, 74H Add immediate number 74H to content of AL. Result in AL
ADC CL, BL Add content of BL plus carry status to content of CL
ADD DX, BX Add content of BX to content of DX
ADD DX, [SI] Add word from memory at offset [SI] in DS to content of DX
ADC AL, PRICES [BX] Add byte from effective address PRICES [BX]
plus carry status to content of AL
ADD AL, PRICES [BX] Add content of memory at effective address PRICES [BX]
to AL
SUB – SUB Destination, Source
SBB – SBB Destination, Source
These instructions subtract the number in some source from the number in some destination and put the
result in the destination. The SBB instruction also subtracts the content of carry flag from the destination.
The source may be an immediate number, a register or memory location. The destination can also be a
register or a memory location. However, the source and the destination cannot both be memory location.
The source and the destination must both be of the same type (bytes or words). If you want to subtract a
byte from a word, you must first move the byte to a word location such as a 16-bit register and fill the
upper byte of the word with 0’s. Flags affected: AF, CF, OF, PF, SF, ZF.
SUB CX, BX CX – BX; Result in CX
SBB CH, AL Subtract content of AL and content of CF from content of CH.
Result in CH
SUB AX, 3427H Subtract immediate number 3427H from AX
SBB BX, [3427H] Subtract word at displacement 3427H in DS and content of CF
, from BX
SUB PRICES [BX], 04H Subtract 04 from byte at effective address PRICES [BX],
if PRICES is declared with DB; Subtract 04 from word at
effective address PRICES [BX], if it is declared with DW.
SBB CX, TABLE [BX] Subtract word from effective address TABLE [BX]
and status of CF from CX.
SBB TABLE [BX], CX Subtract CX and status of CF from word in memory at
effective address TABLE[BX].
MUL – MUL Source
This instruction multiplies an unsigned byte in some source with an unsigned byte in AL register or an
unsigned word in some source with an unsigned word in AX register. The source can be a register or a
memory location. When a byte is multiplied by the content of AL, the result (product) is put in AX. When
a word is multiplied by the content of AX, the result is put in DX and AX registers. If the most significant
byte of a 16-bit result or the most significant word of a 32-bit result is 0, CF and OF will both be 0’s. AF,
PF, SF and ZF are undefined after a MUL instruction.
If you want to multiply a byte with a word, you must first move the byte to a word location such as an
extended register and fill the upper byte of the word with all 0’s. You cannot use the CBW instruction for
this, because the CBW instruction fills the upper byte with copies of the most significant bit of the lower
byte.
MUL BH Multiply AL with BH; result in AX
MUL CX Multiply AX with CX; result high word in DX, low word in AX
MUL BYTE PTR [BX] Multiply AL with byte in DS pointed to by [BX]
MUL FACTOR [BX] Multiply AL with byte at effective address FACTOR [BX], if it
is declared as type byte with DB. Multiply AX with word at
effective address FACTOR [BX], if it is declared as type word
with DW.
MOV AX, MCAND_16 Load 16-bit multiplicand into AX
MOV CL, MPLIER_8 Load 8-bit multiplier into CL
MOV CH, 00H Set upper byte of CX to all 0’s
MUL CX AX times CX; 32-bit result in DX and AX
IMUL – IMUL Source
This instruction multiplies a signed byte from source with a signed byte in AL or a signed word from
some source with a signed word in AX. The source can be a register or a memory location. When a byte
from source is multiplied with content of AL, the signed result (product) will be put in AX. When a word
from source is multiplied by AX, the result is put in DX and AX. If the magnitude of the product does not
require all the bits of the destination, the unused byte / word will be filled with copies of the sign bit. If
the upper byte of a 16-bit result or the upper word of a 32-bit result contains only copies of the sign bit
(all 0’s or all 1’s), then CF and the OF will both be 0; If it contains a part of the product, CF and OF will
both be 1. AF, PF, SF and ZF are undefined after IMUL.
If you want to multiply a signed byte with a signed word, you must first move the byte into a word
location and fill the upper byte of the word with copies of the sign bit. If you move the byte into AL, you
can use the CBW instruction to do this.
IMUL BH Multiply signed byte in AL with signed byte in BH;
result in AX.
IMUL AX Multiply AX times AX; result in DX and AX
MOV CX, MULTIPLIER Load signed word in CX
MOV AL, MULTIPLICAND Load signed byte in AL
CBW Extend sign of AL into AH
IMUL CX Multiply CX with AX; Result in DX and AX
DATA TRANSFER INSTRUCTIONS
MOV – MOV Destination, Source
The MOV instruction copies a word or byte of data from a specified source to a specified destination. The
destination can be a register or a memory location. The source can be a register, a memory location or an
immediate number. The source and destination cannot both be memory locations. They must both be of
the same type (bytes or words). MOV instruction does not affect any flag.
MOV CX, 037AH Put immediate number 037AH to CX
MOV BL, [437AH] Copy byte in DS at offset 437AH to BL
MOV AX, BX Copy content of register BX to AX
MOV DL, [BX] Copy byte from memory at [BX] to DL
MOV DS, BX Copy word from BX to DS register
MOV RESULT [BP], AX Copy AX to two memory locations;
AL to the first location, AH to the second;
EA of the first memory location is sum of the displacement
represented by RESULTS and content of BP.
Physical address = EA + SS.
MOV ES: RESULTS [BP], AX Same as the above instruction, but physical address = EA + ES,
because of the segment override prefix ES
XCHG – XCHG Destination, Source
The XCHG instruction exchanges the content of a register with the content of another register or with the
content of memory location(s). It cannot directly exchange the content of two memory locations. The
source and destination must both be of the same type (bytes or words). The segment registers cannot be
used in this instruction. This instruction does not affect any flag.
XCHG AX, DX Exchange word in AX with word in DX
XCHG BL, CH Exchange byte in BL with byte in CH
XCHG AL, PRICES [BX] Exchange byte in AL with byte in memory at
EA = PRICE [BX] in DS.
LEA – LEA Register, Source
This instruction determines the offset of the variable or memory location named as the source and puts
this offset in the indicated 16-bit register. LEA does not affect any flag.
LEA BX, PRICES Load BX with offset of PRICE in DS
LEA BP, SS: STACK_TOP Load BP with offset of STACK_TOP in SS
LEA CX, [BX][DI] Load CX with EA = [BX] + [DI]
LDS – LDS Register, Memory address of the first word
This instruction loads new values into the specified register and into the DS register from four successive
memory locations. The word from two memory locations is copied into the specified register and the
word from the next two memory locations is copied into the DS registers. LDS does not affect any flag.
LDS BX, [4326] Copy content of memory at displacement 4326H in DS to BL,
content of 4327H to BH. Copy content at displacement of
4328H and 4329H in DS to DS register.
LDS SI, SPTR Copy content of memory at displacement SPTR and SPTR + 1
, in DS to SI register. Copy content of memory at displacements
SPTR + 2 and SPTR + 3 in DS to DS register. DS: SI now points
at start of the desired string.
LES – LES Register, Memory address of the first word
This instruction loads new values into the specified register and into the ES register from four successive
memory locations. The word from the first two memory locations is copied into the specified register, and
the word from the next two memory locations is copied into the ES register. LES does not affect any flag.
LES BX, [789AH] Copy content of memory at displacement 789AH in DS to BL,
content of 789BH to BH, content of memory at displacement
789CH and 789DH in DS is copied to ES register.
LES DI, [BX] Copy content of memory at offset [BX] and offset [BX] + 1 in
DS to DI register. Copy content of memory at offset [BX] + 2
and [BX] + 3 to ES register.
ARITHMETIC INSTRUCTIONS
ADD – ADD Destination, Source
ADC – ADC Destination, Source
These instructions add a number from some source to a number in some destination and put the result in
the specified destination. The ADC also adds the status of the carry flag to the result. The source may be
an immediate number, a register, or a memory location. The destination may be a register or a memory
location. The source and the destination in an instruction cannot both be memory locations. The source
and the destination must be of the same type (bytes or words). If you want to add a byte to a word, you
must copy the byte to a word location and fill the upper byte of the word with 0’s before adding. Flags
affected: AF, CF, OF, SF, ZF.
ADD AL, 74H Add immediate number 74H to content of AL. Result in AL
ADC CL, BL Add content of BL plus carry status to content of CL
ADD DX, BX Add content of BX to content of DX
ADD DX, [SI] Add word from memory at offset [SI] in DS to content of DX
ADC AL, PRICES [BX] Add byte from effective address PRICES [BX]
plus carry status to content of AL
ADD AL, PRICES [BX] Add content of memory at effective address PRICES [BX]
to AL
SUB – SUB Destination, Source
SBB – SBB Destination, Source
These instructions subtract the number in some source from the number in some destination and put the
result in the destination. The SBB instruction also subtracts the content of carry flag from the destination.
The source may be an immediate number, a register or memory location. The destination can also be a
register or a memory location. However, the source and the destination cannot both be memory location.
The source and the destination must both be of the same type (bytes or words). If you want to subtract a
byte from a word, you must first move the byte to a word location such as a 16-bit register and fill the
upper byte of the word with 0’s. Flags affected: AF, CF, OF, PF, SF, ZF.
SUB CX, BX CX – BX; Result in CX
SBB CH, AL Subtract content of AL and content of CF from content of CH.
Result in CH
SUB AX, 3427H Subtract immediate number 3427H from AX
SBB BX, [3427H] Subtract word at displacement 3427H in DS and content of CF
, from BX
SUB PRICES [BX], 04H Subtract 04 from byte at effective address PRICES [BX],
if PRICES is declared with DB; Subtract 04 from word at
effective address PRICES [BX], if it is declared with DW.
SBB CX, TABLE [BX] Subtract word from effective address TABLE [BX]
and status of CF from CX.
SBB TABLE [BX], CX Subtract CX and status of CF from word in memory at
effective address TABLE[BX].
MUL – MUL Source
This instruction multiplies an unsigned byte in some source with an unsigned byte in AL register or an
unsigned word in some source with an unsigned word in AX register. The source can be a register or a
memory location. When a byte is multiplied by the content of AL, the result (product) is put in AX. When
a word is multiplied by the content of AX, the result is put in DX and AX registers. If the most significant
byte of a 16-bit result or the most significant word of a 32-bit result is 0, CF and OF will both be 0’s. AF,
PF, SF and ZF are undefined after a MUL instruction.
If you want to multiply a byte with a word, you must first move the byte to a word location such as an
extended register and fill the upper byte of the word with all 0’s. You cannot use the CBW instruction for
this, because the CBW instruction fills the upper byte with copies of the most significant bit of the lower
byte.
MUL BH Multiply AL with BH; result in AX
MUL CX Multiply AX with CX; result high word in DX, low word in AX
MUL BYTE PTR [BX] Multiply AL with byte in DS pointed to by [BX]
MUL FACTOR [BX] Multiply AL with byte at effective address FACTOR [BX], if it
is declared as type byte with DB. Multiply AX with word at
effective address FACTOR [BX], if it is declared as type word
with DW.
MOV AX, MCAND_16 Load 16-bit multiplicand into AX
MOV CL, MPLIER_8 Load 8-bit multiplier into CL
MOV CH, 00H Set upper byte of CX to all 0’s
MUL CX AX times CX; 32-bit result in DX and AX
IMUL – IMUL Source
This instruction multiplies a signed byte from source with a signed byte in AL or a signed word from
some source with a signed word in AX. The source can be a register or a memory location. When a byte
from source is multiplied with content of AL, the signed result (product) will be put in AX. When a word
from source is multiplied by AX, the result is put in DX and AX. If the magnitude of the product does not
require all the bits of the destination, the unused byte / word will be filled with copies of the sign bit. If
the upper byte of a 16-bit result or the upper word of a 32-bit result contains only copies of the sign bit
(all 0’s or all 1’s), then CF and the OF will both be 0; If it contains a part of the product, CF and OF will
both be 1. AF, PF, SF and ZF are undefined after IMUL.
If you want to multiply a signed byte with a signed word, you must first move the byte into a word
location and fill the upper byte of the word with copies of the sign bit. If you move the byte into AL, you
can use the CBW instruction to do this.
IMUL BH Multiply signed byte in AL with signed byte in BH;
result in AX.
IMUL AX Multiply AX times AX; result in DX and AX
MOV CX, MULTIPLIER Load signed word in CX
MOV AL, MULTIPLICAND Load signed byte in AL
CBW Extend sign of AL into AH
IMUL CX Multiply CX with AX; Result in DX and AX