Quick reference:
CMPSB MOV
AAA CMPSW JAE JNBE JPO MOVSB RCR S
AAD CWD JB JNC JS MOVSW REP S
AAM DAA JBE JNE JZ MUL REPE S
AAS DAS JC JNG LAHF NEG REPNE S
ADC DEC JCXZ JNGE LDS NOP REPNZ S
ADD DIV JE JNL LEA NOT REPZ S
AND HLT JG JNLE LES OR RET S
CALL IDIV JGE JNO LODSB OUT RETF S
CBW IMUL JL JNP LODSW POP ROL S
CLC IN JLE JNS LOOP POPA ROR S
CLD INC JMP JNZ LOOPE POPF SAHF T
CLI INT JNA JO LOOPNE PUSH SAL X
CMC INTO JNAE JP LOOPNZ PUSHA SAR X
CMP IRET JNB JPE LOOPZ PUSHF SBB X
JA RCL
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...
Notes:
AL, DL
DX, AX
m1 DB ?
AL, m1
m2 DW ?
AX, m2
memory, immediate
REG, immediate
memory, REG
REG, SREG
Some examples contain macros, so it is advisable to
use Shift + F8 hot key to Step Over (to make macro
code execute at maximum speed set step delay to
zero), otherwise emulator will step through each
instruction of a macro. Here is an example that uses
PRINTN macro:
#make_COM#
include 'emu8086.inc'
ORG 100h
MOV AL, 1
MOV BL, 2
MOV CL, 3
RET
These marks are used to show the state of the flags:
AL = AL + 6
AH = AH + 1
AF = 1
CF = 1
else
No AF = 0
AAA
operands
CF = 0
in both cases:
clear the high nibble of AL.
Example:
AAA ; AH = 01, AL = 05
RET
CZSOPA
R????R
ASCII Adjust before Division.
Prepares two BCD values for division.
Algorithm:
AL = (AH * 10) + AL
AH = 0
Example:
No
AAD MOV AX, 0105h ; AH = 01, AL = 05
operands
AAD ; AH = 00, AL = 0Fh (15)
RET
CZSOPA
?rr?r?
ASCII Adjust after Multiplication.
Corrects the result of multiplication of two BC
Algorithm:
AH = AL / 10
AL = remainder
Example:
No
AAM
operands MOV AL, 15 ; AL = 0Fh
AAM ; AH = 01, AL = 05
RET
CZSOPA
?rr?r?
ASCII Adjust after Subtraction.
Corrects result in AH and AL after subtraction
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
No AF = 0
AAS
operands
CF = 0
in both cases:
clear the high nibble of AL.
Example:
AAS ; AH = 01, AL = 09
RET
CZSOPA
R????R
Add with Carry.
Algorithm:
operand1 = operand1 + operand2 + CF
Example:
REG,
memory STC ; set CF = 1
memory,
REG MOV AL, 5 ; AL = 5
ADC REG, REG
memory, ADC AL, 1 ; AL = 7
immediate RET
REG,
immediate CZSOPA
RrrrrR
Add.
Algorithm:
operand1 = operand1 + operand2
REG, Example:
memory
memory, MOV AL, 5 ; AL = 5
REG
ADD REG, REG ADD AL, -3 ; AL = 2
memory,
RET
immediate
REG, CZSOPA
immediate
RrrrrR
Logical AND between all bits of two operands.
is stored in operand1.
These rules apply:
1 AND 1 = 1
1 AND 0 = 0
REG, 0 AND 1 = 0
memory 0 AND 0 = 0
memory, Example:
REG
AND REG, REG MOV AL, 'a' ; AL = 01100001b
memory,
immediate AND AL, 11011111b ; AL = 01000001b ('A')
REG,
RET
immediate
CZSOP
0rr0r
Transfers control to procedure, return address
pushed to stack. 4-byte address may be enter
this form: 1234h:5678h, first value is a segme
second value is an offset (this is a far call, so
also pushed to stack).
Example:
#make_COM#
procedure CALL p1
name ADD AX, 1
label
CALL
4-byte RET ; return to OS.
address
p1 PROC ; procedure declaration.
p1 ENDP
CZSOPA
Unchanged
Convert byte into word.
Algorithm:
if high bit of AL = 1 then:
AH = 255 (0FFh)
else
AH = 0
Example:
No
CBW MOV AX, 0 ; AH = 0, AL = 0
operands
MOV AL, -5 ; AX = 000FBh (251)
RET
CZSOPA
unchanged
R
Compare.
Algorithm:
operand1 - operand2
result is not stored anywhere, flags are set (O
REG, ZF, AF, PF, CF) according to result.
memory Example:
memory,
MOV AL, 5
REG
CMP REG, REG MOV BL, 5
memory,
immediate CMP AL, BL ; AL = 5, ZF = 1 (so equal!)
REG,
immediate RET
CZSOPA
rrrrrr
Compare bytes: ES:[DI] from DS:[SI].
Algorithm:
DS:[SI] - ES:[DI]
if DF = 0 then
SI = SI + 1
DI = DI + 1
No
CMPSB
operands else
SI = SI - 1
DI = DI - 1
Example:
see cmpsb.asm in Samples.
CZSOPA
rrrrrr
Compare words: ES:[DI] from DS:[SI].
Algorithm:
DS:[SI] - ES:[DI]
if DF = 0 then
SI = SI + 2
DI = DI + 2
No
CMPSW
operands else
SI = SI - 2
DI = DI - 2
Example:
see cmpsw.asm in Samples.
CZSOPA
rrrrrr
Convert Word to Double word.
Algorithm:
if high bit of AX = 1 then:
DX = 65535 (0FFFFh)
else
DX = 0
Example:
No
CWD MOV DX, 0 ; DX = 0
operands
MOV AX, 0 ; AX = 0
CWD ; DX AX = 0FFFFh:0FFFBh
RET
CZSOPA
unchanged
Decimal adjust After Addition.
Corrects the result of addition of two packed B
values.
Algorithm:
if low nibble of AL > 9 or AF = 1 then:
AL = AL + 6
AF = 1
AL = AL + 60h
No
DAA CF = 1
operands
Example:
DAA ; AL = 15h
RET
CZSOPA
rrrrrr
Decimal adjust After Subtraction.
Corrects the result of subtraction of two packe
values.
Algorithm:
if low nibble of AL > 9 or AF = 1 then:
AL = AL - 6
AF = 1
AL = AL - 60h
No
DAS CF = 1
operands
Example:
DAS ; AL = 99h, CF = 1
RET
CZSOPA
rrrrrr
Decrement.
Algorithm:
operand = operand - 1
Example:
RET
ZSOPA
rrrrr
CF - unchanged!
Unsigned divide.
Algorithm:
REG Example:
DIV memory
MOV AX, 203 ; AX = 00CBh
MOV BL, 4
DIV BL ; AL = 50 (32h), AH = 3
RET
CZSOPA
??????
Halt the System.
Example:
MOV AX, 5
No
HLT HLT
operands
CZSOPA
unchanged
Signed divide.
Algorithm:
MOV BL, 4
RET
CZSOPA
??????
Signed multiply.
Algorithm:
Example:
REG
IMUL memory MOV AL, -2
MOV BL, -4
IMUL BL ; AX = 8
RET
CZSOPA
r??r??
unchanged
Increment.
Algorithm:
operand = operand + 1
Example:
REG MOV AL, 4
INC memory
INC AL ; AL = 5
RET
ZSOPA
rrrrr
CF - unchanged!
Interrupt numbered by immediate byte (0..25
Algorithm:
Push to stack:
flags register
CS
IP
IF = 0
RET
CZSOPAI
unchanged0
Interrupt 4 if Overflow flag is 1.
Algorithm:
if OF = 1 then INT 4
Example:
MOV AL, -5
RET
Interrupt Return.
Algorithm:
IP
No
IRET CS
operands
flags register
CZSOPA
popped
Short Jump if first operand is Above second op
(as set by CMP instruction). Unsigned.
Algorithm:
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
CMP AL, 5
JA label
JA label1
JMP exit
label1:
exit:
RET
CZSOPA
unchanged
Short Jump if first operand is Above or Equal t
operand (as set by CMP instruction). Unsigned
Algorithm:
if CF = 0 then jump
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 5
CMP AL, 5
JAE label
JAE label1
JMP exit
label1:
exit:
RET
CZSOPA
unchanged
Short Jump if first operand is Below second op
(as set by CMP instruction). Unsigned.
Algorithm:
if CF = 1 then jump
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 1
CMP AL, 5
JB label
JB label1
JMP exit
label1:
exit:
RET
CZSOPA
unchanged
Short Jump if first operand is Below or Equal t
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 label
JBE label1
JMP exit
label1:
exit:
RET
CZSOPA
unchanged
Short Jump if Carry flag is set to 1.
Algorithm:
if CF = 1 then jump
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
ADD AL, 1
JC label JC label1
JMP exit
label1:
exit:
RET
CZSOPA
unchanged
Short Jump if CX register is 0.
Algorithm:
if CX = 0 then jump
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV CX, 0
JCXZ label1
JCXZ label
PRINT 'CX is not zero.'
JMP exit
label1:
exit:
RET
CZSOPA
unchanged
Short Jump if first operand is Equal to second
(as set by CMP instruction). Signed/Unsigned.
Algorithm:
if ZF = 1 then jump
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 5
CMP AL, 5
JE label
JE label1
JMP exit
label1:
exit:
RET
CZSOPA
unchanged
Short Jump if first operand is Greater then sec
operand (as set by CMP instruction). Signed.
Algorithm:
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 5
CMP AL, -5
JG label
JG label1
JMP exit
label1:
exit:
RET
CZSOPA
unchanged
Short Jump if first operand is Greater or Equal
second operand (as set by CMP instruction). S
Algorithm:
if SF = OF then jump
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 2
CMP AL, -5
JGE label
JGE label1
JMP exit
label1:
exit:
RET
CZSOPA
unchanged
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 label
JL label1
JMP exit
label1:
exit:
RET
CZSOPA
unchanged
Short Jump if first operand is Less or Equal to
operand (as set by CMP instruction). Signed.
Algorithm:
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, -2
CMP AL, 5
JLE label
JLE label1
JMP exit
label1:
exit:
RET
CZSOPA
unchanged
Unconditional Jump. Transfers control to anoth
of the program. 4-byte address may be entere
form: 1234h:5678h, first value is a segment s
value is an offset.
Algorithm:
always jump
Example:
include 'emu8086.inc'
#make_COM#
MOV AL, 0
label1:
RET
CZSOPA
unchanged
Short Jump if first operand is Not Above secon
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 label
JNA label1
JMP exit
label1:
exit:
RET
CZSOPA
unchanged
Short Jump if first operand is Not Above and N
to second operand (as set by CMP instruction)
Unsigned.
Algorithm:
if CF = 1 then jump
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 2
CMP AL, 5
JNAE label
JNAE label1
JMP exit
label1:
exit:
RET
CZSOPA
unchanged
Short Jump if first operand is Not Below secon
operand (as set by CMP instruction). Unsigned
Algorithm:
if CF = 0 then jump
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 7
CMP AL, 5
JNB label
JNB label1
JMP exit
label1:
exit:
RET
CZSOPA
unchanged
Short Jump if first operand is Not Below and N
to second operand (as set by CMP instruction)
Unsigned.
Algorithm:
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 7
CMP AL, 5
JNBE label
JNBE label1
JMP exit
label1:
exit:
RET
CZSOPA
unchanged
Short Jump if Carry flag is set to 0.
Algorithm:
if CF = 0 then jump
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 2
ADD AL, 3
JNC label JNC label1
JMP exit
label1:
exit:
RET
CZSOPA
unchanged
Short Jump if first operand is Not Equal to sec
operand (as set by CMP instruction). Signed/U
Algorithm:
if ZF = 0 then jump
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 2
CMP AL, 3
JNE label
JNE label1
JMP exit
label1:
exit:
RET
CZSOPA
unchanged
Short Jump if first operand is Not Greater then
operand (as set by CMP instruction). Signed.
Algorithm:
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 2
CMP AL, 3
JNG label
JNG label1
JMP exit
label1:
exit:
RET
CZSOPA
unchanged
Short Jump if first operand is Not Greater and
Equal to second operand (as set by CMP instru
Signed.
Algorithm:
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 2
CMP AL, 3
JNGE label
JNGE label1
JMP exit
label1:
exit:
RET
CZSOPA
unchanged
Short Jump if first operand is Not Less then se
operand (as set by CMP instruction). Signed.
Algorithm:
if SF = OF then jump
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 2
CMP AL, -3
JNL label
JNL label1
JMP exit
label1:
exit:
RET
CZSOPA
unchanged
Short Jump if first operand is Not Less and No
to second operand (as set by CMP instruction)
Algorithm:
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 2
CMP AL, -3
JNLE label
JNLE label1
JMP exit
label1:
exit:
RET
CZSOPA
unchanged
Short Jump if Not Overflow.
Algorithm:
if OF = 0 then jump
Example:
; -5 - 2 = -7 (inside -128..127)
; so OF = 0:
include 'emu8086.inc'
#make_COM#
ORG 100h
JNO label MOV AL, -5
JNO label1
PRINT 'overflow!'
JMP exit
label1:
exit:
RET
Short Jump if No Parity (odd). Only 8 low bits o
are checked. Set by CMP, SUB, ADD, TEST, AN
XOR instructions.
Algorithm:
if PF = 0 then jump
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
JMP exit
label1:
exit:
RET
CZSOPA
unchanged
Short Jump if Not Signed (if positive). Set by C
SUB, ADD, TEST, AND, OR, XOR instructions.
Algorithm:
if SF = 0 then jump
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
PRINT 'signed.'
JMP exit
label1:
exit:
RET
CZSOPA
unchanged
Short Jump if Not Zero (not equal). Set by CMP
ADD, TEST, AND, OR, XOR instructions.
Algorithm:
if ZF = 0 then jump
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
PRINT 'zero.'
JMP exit
label1:
exit:
RET
CZSOPA
unchanged
Short Jump if Overflow.
Algorithm:
if OF = 1 then jump
Example:
; so OF = 1 is set:
include 'emu8086.inc'
#make_COM#
org 100h
JO label MOV AL, -5
JO label1
JMP exit
label1:
PRINT 'overflow!'
exit:
RET
Short Jump if Parity (even). Only 8 low bits of
are checked. Set by CMP, SUB, ADD, TEST, AN
XOR instructions.
Algorithm:
if PF = 1 then jump
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
JMP exit
label1:
exit:
RET
CZSOPA
unchanged
Short Jump if Parity Even. Only 8 low bits of re
checked. Set by CMP, SUB, ADD, TEST, AND, O
instructions.
Algorithm:
if PF = 1 then jump
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
JMP exit
label1:
exit:
RET
CZSOPA
unchanged
Short Jump if Parity Odd. Only 8 low bits of res
checked. Set by CMP, SUB, ADD, TEST, AND, O
instructions.
Algorithm:
if PF = 0 then jump
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
JMP exit
label1:
exit:
RET
CZSOPA
unchanged
Short Jump if Signed (if negative). Set by CMP
ADD, TEST, AND, OR, XOR instructions.
Algorithm:
if SF = 1 then jump
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
JMP exit
label1:
PRINT 'signed.'
exit:
RET
CZSOPA
unchanged
Short Jump if Zero (equal). Set by CMP, SUB, A
TEST, AND, OR, XOR instructions.
Algorithm:
if ZF = 1 then jump
Example:
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AL, 5
CMP AL, 5
JZ label
JZ label1
JMP exit
label1:
exit:
RET
CZSOPA
unchanged
Load AH from 8 low bits of Flags register.
Algorithm:
AH = flags register
No AH bit: 7 6 5 4 3 2 1 0
LAHF
operands
[SF] [ZF] [0] [AF] [0] [PF] [1] [CF]
CZSOPA
unchanged
Load memory double word into word register
Algorithm:
DS = second word
Example:
#make_COM#
ORG 100h
LDS AX, m
REG,
LDS
memory
RET
m DW 1234h
DW 5678h
END
Algorithm:
Example:
#make_COM#
ORG 100h
LEA AX, m
REG,
LEA
memory
RET
m DW 1234h
END
Algorithm:
ES = second word
Example:
#make_COM#
ORG 100h
LES AX, m
REG,
LES
memory
RET
m DW 1234h
DW 5678h
END
Algorithm:
AL = DS:[SI]
if DF = 0 then
SI = SI + 1
else
SI = SI - 1
Example:
#make_COM#
ORG 100h
LEA SI, a1
No
LODSB MOV CX, 5
operands
MOV AH, 0Eh
m: LODSB
INT 10h
LOOP m
RET
Load word at DS:[SI] into AX. Update SI.
Algorithm:
AX = DS:[SI]
if DF = 0 then
SI = SI + 2
else
SI = SI - 2
Example:
#make_COM#
ORG 100h
No
LODSW
operands
LEA SI, a1
MOV CX, 5
RET
CZSOPA
Decrease CX, jump to label if CX not zero.
Algorithm:
CX = CX - 1
if CX <> 0 then
jump
else
no jump, continue
Example:
include 'emu8086.inc'
LOOP label #make_COM#
ORG 100h
MOV CX, 5
label1:
PRINTN 'loop!'
LOOP label1
RET
CZSOPA
unchanged
Decrease CX, jump to label if CX not zero and
(ZF = 1).
Algorithm:
CX = CX - 1
jump
else
no jump, continue
Example:
LOOPE label
include 'emu8086.inc'
#make_COM#
ORG 100h
MOV AX, 0
MOV CX, 5
label1:
Decrease CX, jump to label if CX not zero and
Equal (ZF = 0).
Algorithm:
CX = CX - 1
jump
else
no jump, continue
Example:
; or 5 times.
include 'emu8086.inc'
#make_COM#
LOOPNE label
ORG 100h
MOV SI, 0
MOV CX, 5
label1:
PUTC '*'
Algorithm:
CX = CX - 1
jump
else
no jump, continue
Example:
; or 5 times.
include 'emu8086.inc'
#make_COM#
LOOPNZ label ORG 100h
MOV SI, 0
MOV CX, 5
label1:
PUTC '*'
Algorithm:
CX = CX - 1
jump
else
no jump, continue
Example:
#make_COM#
ORG 100h
MOV AX, 0
MOV CX, 5
label1:
PUTC '*'
Copy operand2 to operand1.
CZSOPA
Copy byte at DS:[SI] to ES:[DI]. Update SI and
Algorithm:
ES:[DI] = DS:[SI]
if DF = 0 then
SI = SI + 1
DI = DI + 1
else
SI = SI - 1
DI = DI - 1
Example:
#make_COM#
ORG 100h
No
MOVSB
operands
LEA SI, a1
LEA DI, a2
MOV CX, 5
REP MOVSB
RET
Copy word at DS:[SI] to ES:[DI]. Update SI and
Algorithm:
ES:[DI] = DS:[SI]
if DF = 0 then
SI = SI + 2
DI = DI + 2
else
SI = SI - 2
DI = DI - 2
Example:
#make_COM#
ORG 100h
No
MOVSW
operands
LEA SI, a1
LEA DI, a2
MOV CX, 5
REP MOVSW
RET
Unsigned multiply.
Algorithm:
Example:
REG
MUL memory MOV AL, 200 ; AL = 0C8h
MOV BL, 4
RET
CZSOPA
r??r??
Algorithm:
Example:
REG
NEG memory MOV AL, 5 ; AL = 05h
RET
CZSOPA
rrrrrr
No Operation.
Algorithm:
Do nothing
Example:
; do nothing, 3 times:
No NOP
NOP
operands
NOP
NOP
RET
CZSOPA
unchanged
Invert each bit of the operand.
Algorithm:
if bit is 1 turn it to 0.
if bit is 0 turn it to 1.
Example:
REG
NOT memory MOV AL, 00011011b
NOT AL ; AL = 11100100b
RET
CZSOPA
unchanged
Logical OR between all bits of two operands. R
stored in first operand.
1 OR 1 = 1
1 OR 0 = 1
REG, 0 OR 1 = 1
memory 0 OR 0 = 0
memory,
REG
OR REG, REG Example:
memory,
immediate MOV AL, 'A' ; AL = 01000001b
REG,
immediate OR AL, 00100000b ; AL = 01100001b ('a')
RET
CZSOPA
0rr0r?
Output from AL or AX to port.
First operand is a port number. If required to a
port number over 255 - DX register should be
Example:
CZSOPA
unchanged
Get 16 bit value from the stack.
Algorithm:
SP = SP + 2
Example:
REG
POP SREG MOV AX, 1234h
memory
PUSH AX
POP DX ; DX = 1234h
RET
CZSOPA
unchanged
Pop all general purpose registers DI, SI, BP, SP
DX, CX, AX from the stack.
SP value is ignored, it is Popped but not set to
register).
Algorithm:
POP DI
POP SI
No POP BP
POPA
operands
POP xx (SP value ignored)
POP BX
POP DX
POP CX
POP AX
CZSOPA
unchanged
Get flags register from the stack.
Algorithm:
popped
Store 16 bit value in the stack.
Algorithm:
SP = SP - 2
REG
SREG Example:
PUSH
memory
immediate MOV AX, 1234h
PUSH AX
POP DX ; DX = 1234h
RET
CZSOPA
unchanged
Push all general purpose registers AX, CX, DX
BP, SI, DI in the stack.
Original value of SP register (before PUSHA) is
Algorithm:
PUSH AX
PUSH CX
PUSH DX
No
PUSHA
operands PUSH BX
PUSH SP
PUSH BP
PUSH SI
PUSH DI
CZSOPA
unchanged
Store flags register in the stack.
Algorithm:
SP = SP - 2
No
PUSHF SS:[SP] (top of the stack) = flags
operands
CZSOPA
unchanged
Rotate operand1 left through Carry Flag. The
of rotates is set by operand2.
When immediate is greater then 1, assembler
generates several RCL xx, 1 instructions beca
8086 has machine code only for this instructio
same principle works for all other shift/rotate
instructions).
Algorithm:
shift all bits left, the bit that goes off is set to
memory, previous value of CF is inserted to the right-m
immediate position.
REG,
RCL immediate
Example:
memory, CL
REG, CL STC ; set carry (CF=1).
RET
CO
rr
Algorithm:
shift all bits right, the bit that goes off is set to
previous value of CF is inserted to the left-mo
position.
memory,
immediate
Example:
REG,
RCR immediate STC ; set carry (CF=1).
memory, CL MOV AL, 1Ch ; AL = 00011100b
REG, CL
RCR AL, 1 ; AL = 10001110b, CF=0.
RET
CO
rr
Algorithm:
check_cx:
if CX <> 0 then
else
r
Repeat following CMPSB, CMPSW, SCASB, SCA
instructions while ZF = 1 (result is Equal), ma
CX times.
Algorithm:
check_cx:
if CX <> 0 then
CX = CX - 1
if ZF = 1 then:
chain go back to check_cx
REPE
instruction
else
else
Example:
see cmpsb.asm in Samples.
r
Repeat following CMPSB, CMPSW, SCASB, SCA
instructions while ZF = 0 (result is Not Equal),
maximum CX times.
Algorithm:
check_cx:
if CX <> 0 then
CX = CX - 1
chain if ZF = 0 then:
REPNE
instruction
go back to check_cx
else
else
r
Repeat following CMPSB, CMPSW, SCASB, SCA
instructions while ZF = 0 (result is Not Zero),
maximum CX times.
Algorithm:
check_cx:
if CX <> 0 then
CX = CX - 1
chain if ZF = 0 then:
REPNZ
instruction
go back to check_cx
else
else
r
Repeat following CMPSB, CMPSW, SCASB, SCA
instructions while ZF = 1 (result is Zero), max
CX times.
Algorithm:
check_cx:
if CX <> 0 then
CX = CX - 1
chain if ZF = 1 then:
REPZ
instruction
go back to check_cx
else
else
r
Return from near procedure.
Algorithm:
IP
Example:
#make_COM#
CALL p1
No
operands
RET
or even
ADD AX, 1
immediate
p1 ENDP
CZSOPA
Return from Far procedure.
Algorithm:
No IP
operands
RETF CS
or even
immediate if immediate operand is present: SP = SP + op
CZSOPA
unchanged
Rotate operand1 left. The number of rotates i
operand2.
Algorithm:
shift all bits left, the bit that goes off is set to
memory, the same bit is inserted to the right-most posi
immediate Example:
REG,
ROL immediate MOV AL, 1Ch ; AL = 00011100b
CO
rr
Algorithm:
shift all bits right, the bit that goes off is set to
memory, the same bit is inserted to the left-most positi
immediate Example:
REG,
ROR immediate MOV AL, 1Ch ; AL = 00011100b
CO
rr
Algorithm:
flags register = AH
No AH bit: 7 6 5 4 3 2 1 0
SAHF
operands
[SF] [ZF] [0] [AF] [0] [PF] [1] [CF]
CZSOPA
rrrrrr
Shift Arithmetic operand1 Left. The number of
set by operand2.
Algorithm:
Shift all bits left, the bit that goes off is set to
CO
rr
Algorithm:
Shift all bits right, the bit that goes off is set t
Example:
memory,
MOV AL, 0E0h ; AL = 11100000b
immediate
REG, SAR AL, 1 ; AL = 11110000b, CF=0.
SAR immediate
memory, CL
REG, CL MOV BL, 4Ch ; BL = 01001100b
RET
CO
rr
Algorithm:
REG, Example:
memory
memory, STC
REG MOV AL, 5
SBB REG, REG
memory, SBB AL, 3 ; AL = 5 - 3 - 1 = 1
immediate
REG,
immediate
RET
CZSOPA
rrrrrr
Compare bytes: AL from ES:[DI].
Algorithm:
ES:[DI] - AL
if DF = 0 then
No
SCASB
operands DI = DI + 1
else
DI = DI - 1
CZSOPA
rrrrrr
Compare words: AX from ES:[DI].
Algorithm:
ES:[DI] - AX
if DF = 0 then
No
SCASW
operands DI = DI + 2
else
DI = DI - 2
CZSOPA
rrrrrr
Shift operand1 Left. The number of shifts is se
operand2.
Algorithm:
Shift all bits left, the bit that goes off is set to
RET
CO
rr
Algorithm:
Shift all bits right, the bit that goes off is set t
RET
CO
rr
Algorithm:
No CF = 1
STC
operands
C
1
Set Direction flag. SI and DI will be decrement
chain instructions: CMPSB, CMPSW, LODSB, LO
MOVSB, MOVSW, STOSB, STOSW.
Algorithm:
No
STD DF = 1
operands
D
Algorithm:
No IF = 1
STI
operands
I
1
Store byte in AL into ES:[DI]. Update SI.
Algorithm:
ES:[DI] = AL
if DF = 0 then
DI = DI + 1
else
DI = DI - 1
Example:
#make_COM#
ORG 100h
No
STOSB LEA DI, a1
operands
MOV AL, 12h
MOV CX, 5
REP STOSB
RET
a1 DB 5 dup(0)
Store word in AX into ES:[DI]. Update SI.
Algorithm:
ES:[DI] = AX
if DF = 0 then
DI = DI + 2
else
DI = DI - 2
Example:
#make_COM#
ORG 100h
No
STOSW LEA DI, a1
operands
MOV AX, 1234h
MOV CX, 5
REP STOSW
RET
a1 DW 5 dup(0)
Subtract.
Algorithm:
CZSOPA
rrrrrr
Logical AND between all bits of two operands
only. These flags are effected: ZF, SF, PF. Resu
stored anywhere.
1 AND 1 = 1
1 AND 0 = 0
REG, 0 AND 1 = 0
memory 0 AND 0 = 0
memory,
REG
TEST REG, REG Example:
memory,
MOV AL, 00000101b
immediate
REG, TEST AL, 1 ; ZF = 0.
immediate
TEST AL, 10b ; ZF = 1.
RET
CZSOP
0rr0r
Exchange values of two operands.
Algorithm:
Example:
RET
CZSOPA
unchanged
Translate byte from table.
Copy value of memory byte at DS:[BX + unsig
to AL register.
Algorithm:
Example:
#make_COM#
ORG 100h
RET
CZSOPA
unchanged
Logical XOR (Exclusive OR) between all bits of
operands. Result is stored in first operand.
1 XOR 1 = 0
1 XOR 0 = 1
REG, 0 XOR 1 = 1
memory 0 XOR 0 = 0
memory,
REG
XOR REG, REG Example:
memory,
immediate MOV AL, 00000111b
REG,
immediate XOR AL, 00000010b ; AL = 00000101b
RET
CZSOPA
0rr0r?