Module 2
Module 2
Module 2
By
B N KIRAN
Assistant Professor
Department of Information Science and Engineering
NIE, Mysuru – 570 008
8086 Instructions
• Based on functionality it has been classified into 8
groups
– Data Transfer Instructions
– Arithmetic Instructions
– Bit Manipulation Instructions
– String Instructions
– Program Execution Transfer Instructions (Branch &
Loop Instructions)
– Processor Control Instructions
– Iteration Control Instructions
– Interrupt Instructions
Data Transfer Instructions
• MOV − Used to copy the byte or word from the
provided source to the provided destination.
• PUSH − Used to put a word at the top of the stack.
• POP − Used to get a word from the top of the stack to
the provided location.
• PUSHA − Used to put all the registers into the stack.
• POPA − Used to get words from the stack to all
registers.
• XCHG − Used to exchange the data from two locations.
• XLAT − Used to translate a byte in AL using a table in
the memory.
• Instructions for input and output port transfer
– IN − Used to read a byte or word from the provided port to the
accumulator.
– OUT − Used to send out a byte or word from the accumulator to
the provided port.
• Instructions to transfer the address
– LEA − Used to load the address of operand into the provided
register.
– LDS − Used to load DS register and other provided register from
the memory
– LES − Used to load ES register and other provided register from
the memory.
• Instructions to transfer flag registers
– LAHF − Used to load AH with the low byte of the flag register.
– SAHF − Used to store AH register to low byte of the flag register.
– PUSHF − Used to copy the flag register at the top of the stack.
– POPF − Used to copy a word at the top of the stack to the flag
register.
MOV Instruction
• 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
PUSH INSTRUCTION
• PUSH: Push to Stack
• This instruction pushes the contents of the
specified register/memory location on to the
stack. The stack pointer is decremented by 2,
after each execution of the instruction.
• E.g. PUSH AX
• PUSH DS
• PUSHA
• PUSH [5000H]
POP : Pop from Sack
• 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
Division instruction
• DIV − Used to divide the unsigned word by byte
or unsigned double word by word.
• IDIV − Used to divide the signed word by byte or
signed double word by word.
• AAD − Used to adjust ASCII codes a er division.
• CBW − Used to fill the upper byte of the word
with the copies of sign bit of the lower byte.
• CWD − Used to fill the upper word of the double
word with the sign bit of the lower word.
• DIV Src:
– It is an unsigned division instruction.
– It divides word by byte or double word by word.
– The operand is stored in AX, divisor is Src and the
result is stored as: AH = remainder AL = quotient
• IDIV Src:
– It is a signed division instruction.
• CBW (Convert Byte to Word):
– This instruction converts byte in AL to word in AX.
– The conversion is done by extending the sign bit of
AL throughout AH.
• CWD (Convert Word to Double Word):
– This instruction converts word in AX to double
word in DX : AX.
– The conversion is done by extending the sign bit of
AX throughout DX.
Bit Manipulation Instructions
• These instructions are used at the bit level.
– These instructions can be used for:
– Testing a zero bit
– Set or reset a bit
– Shift bits across registers
Bit Manipulation Instructions
• NOT − Used to invert each bit of a byte or word.
• AND − Used for adding each bit in a byte/word
with the corresponding bit in another byte/word.
• OR − Used to mul ply each bit in a byte/word
with the corresponding bit in another byte/word.
• XOR − Used to perform Exclusive-OR operation
over each bit in a byte/word with the
corresponding bit in another byte/word.
• TEST − Used to add operands to update flags,
without affecting operands.
• NOT Src:
– It complements each bit of Src to produce 1’s
complement of the specified operand.
– The operand can be a register or memory location.
• AND Des, Src:
– It performs AND operation of Des and Src.
– Src can be immediate number, register or memory
location.
– DES can be register or memory location. (Both
operands cannot be memory locations at the same
time.)
– CF and OF become zero after the operation.
– PF, SF and ZF are updated.
• OR Des, Src:
– It performs OR operation of Des and Src.
– Src can be immediate number, register or memory
location.
– Des can be register or memory location. (Both
operands cannot be memory locations at the
same time.)
– CF and OF become zero after the operation.
– PF, SF and ZF are updated.
• XOR Des, Src:
– It performs XOR operation of Des and Src.
– Src can be immediate number, register or memory
location.
– Des can be register or memory location. (Both
operands cannot be memory locations at the
same time.)
– CF and OF become zero after the operation.
– PF, SF and ZF are updated.
Shift operations instructions
• SHL/SAL − Used to shift bits of a byte/word
towards left and put zero(S) in LSBs.
• SHR − Used to shift bits of a byte/word
towards the right and put zero(S) in MSBs.
• SAR − Used to shift bits of a byte/word
towards the right and copy the old MSB into
the new MSB.
• SHL Des, Count:
– It shift bits of byte or word left, by count.
– It puts zero(s) in LSBs.
– MSB is shifted into carry flag.
– If the number of bits desired to be shifted is 1,
then the immediate number 1 can be written in
Count.
– However, if the number of bits to be shifted is
more than 1, then the count is put in CL register.
• SHR Des, Count:
– It shift bits of byte or word right, by count.
– It puts zero(s) in MSBs.
– LSB is shifted into carry flag.
– If the number of bits desired to be shifted is 1,
then the immediate number 1 can be written in
Count.
– However, if the number of bits to be shifted is
more than 1, then the count is put in CL register.
Rotate instructions
• ROL − Used to rotate bits of byte/word towards
the left, i.e. MSB to LSB and to Carry Flag [CF].
• ROR − Used to rotate bits of byte/word towards
the right, i.e. LSB to MSB and to Carry Flag [CF].
• RCR − Used to rotate bits of byte/word towards
the right, i.e. LSB to CF and CF to MSB.
• RCL − Used to rotate bits of byte/word towards
the left, i.e. MSB to CF and CF to LSB.
• ROL Des, Count:
• It rotates bits of byte or word left, by count.
• MSB is transferred to LSB and also to CF.
• If the number of bits desired to be shifted is 1,
then the immediate number 1 can be written
in Count.
• However, if the number of bits to be shifted is
more than 1, then the count is put in CL
register.
• ROR Des, Count:
• It rotates bits of byte or word right, by count.
• LSB is transferred to MSB and also to CF.
• If the number of bits desired to be shifted is 1,
then the immediate number 1 can be written
in Count.
• However, if the number of bits to be shifted is
more than 1, then the count is put in CL
register.
String Instructions
• String in assembly language is just a
sequentially stored bytes or words.
• There are very strong set of string instructions
in 8086.
• By using these string instructions, the size of
the program is considerably reduced.
String Instructions
• REP − Used to repeat the given instruc on ll CX ≠ 0.
• REPE/REPZ − Used to repeat the given instruc on un l CX = 0 or
zero flag ZF = 1.
• REPNE/REPNZ − Used to repeat the given instruc on un l CX = 0 or
zero flag ZF = 1.
• MOVS/MOVSB/MOVSW − Used to move the byte/word from one
string to another.
• COMS/COMPSB/COMPSW − Used to compare two string
bytes/words.
• INS/INSB/INSW − Used as an input string/byte/word from the I/O
port to the provided memory location.
• OUTS/OUTSB/OUTSW − Used as an output string/byte/word from
the provided memory location to the I/O port.
• SCAS/SCASB/SCASW − Used to scan a string and compare its byte
with a byte in AL or string word with a word in AX.
• LODS/LODSB/LODSW − Used to store the string byte into AL or
string word into AX.
• CMPS Des, Src:
– It compares the string bytes or words.
• SCAS/SCASB/SCASW String:
– It scans a string.
– It compares the String with byte in AL or with word in
AX.
• LODS/LODSB/LODSW
– It loads a string.
– It compares the String with byte in AL or with word in
AX.
• MOVS / MOVSB / MOVSW:
• It causes moving of byte or word from one
string to another.
• In this instruction, the source string is in Data
Segment and destination string is in Extra
Segment.
• SI and DI store the offset values for source and
• destination index.
• REP (Repeat):
• This is an instruction prefix.
• It causes the repetition of the instruction until
CX becomes zero.
– E.g.: REP MOVSB STR1, STR2
– It copies byte by byte contents.
– REP repeats the operation MOVSB until CX
becomes zero.
Program Execution Transfer Instructions
(Branch and Loop Instructions)
• These instructions cause change in the sequence of the
execution of instruction.
• This change can be through a condition or sometimes
unconditional.
• The conditions are represented by flags.
• Unconditional transfer
• CALL − Used to call a procedure and save their return
address to the stack.
• RET − Used to return from the procedure to the main
program.
• JMP − Used to jump to the provided address to proceed to
the next instruction.
• CALL Des:
– This instruction is used to call a subroutine or
function or procedure.
– The address of next instruction after CALL is saved
onto stack.
• RET:
– It returns the control from procedure to calling
program.
– Every CALL instruction should have a RET.
• JMP Des:
• This instruction is used for unconditional jump
from one place to another.
• Jxx Des (Conditional Jump):
– All the conditional jumps follow some conditional
statements or any instruction that affects the flag.
Conditional transfer
• JA/JNBE − Used to jump if above/not below/equal instruc on sa sfies.
• JAE/JNB − Used to jump if above/not below instruc on sa sfies.
• JBE/JNA − Used to jump if below/equal/ not above instruc on sa sfies.
• JC − Used to jump if carry flag CF = 1
• JE/JZ − Used to jump if equal/zero flag ZF = 1
• JG/JNLE − Used to jump if greater/not less than/equal instruc on sa sfies.
• JGE/JNL − Used to jump if greater than/equal/not less than instruc on sa sfies.
• JL/JNGE − Used to jump if less than/not greater than/equal instruc on sa sfies.
• JLE/JNG − Used to jump if less than/equal/if not greater than instruc on sa sfies.
• JNC − Used to jump if no carry flag (CF = 0)
• JNE/JNZ − Used to jump if not equal/zero flag ZF = 0
• JNO − Used to jump if no overflow flag OF = 0
• JNP/JPO − Used to jump if not parity/parity odd PF = 0
• JNS − Used to jump if not sign SF = 0
• JO − Used to jump if overflow flag OF = 1
• JP/JPE − Used to jump if parity/parity even PF = 1
• JS − Used to jump if sign flag SF = 1
• Loop Des:
• This is a looping instruction.
• The number of times looping is required is
placed in the CX register.
• With each iteration, the contents of CX are
decremented.
• ZF is checked whether to loop again or not.
Processor Control Instructions
• These instructions control the processor itself.
• 8086 allows to control certain control flags
that:
– Causes the processing in a certain direction
processor synchronization
– If more than one microprocessor attached.
Processor Control Instructions
• STC − Used to set carry flag CF to 1
• CLC − Used to clear/reset carry flag CF to 0
• CMC − Used to put complement at the state of carry
flag CF.
• STD − Used to set the direc on flag DF to 1
• CLD − Used to clear/reset the direc on flag DF to 0
• STI − Used to set the interrupt enable flag to 1, i.e.,
enable INTR input.
• CLI − Used to clear the interrupt enable flag to 0, i.e.,
disable INTR input.
• STC:
– It sets the carry flag to 1.
• CLC:
– It clears the carry flag to 0.
• CMC:
– It complements the carry flag.
• STD:
– It sets the direction flag to 1.
– If it is set, string bytes are accessed from higher
memory address to lower memory address.
• CLD:
– It clears the direction flag to 0.
– If it is reset, the string bytes are accessed from lower
memory address to higher memory address.
Iteration Control Instructions
• LOOP − Used to loop a group of instruc ons
until the condition satisfies, i.e., CX = 0
• LOOPE/LOOPZ − Used to loop a group of
instructions till it satisfies ZF = 1 & CX = 0
• LOOPNE/LOOPNZ − Used to loop a group of
instructions till it satisfies ZF = 0 & CX = 0
• JCXZ − Used to jump to the provided address if
CX = 0
Interrupt Instructions
• INT − Used to interrupt the program during
execution and calling service specified.
• INTO − Used to interrupt the program during
execution if OF = 1
• IRET − Used to return from interrupt service to
the main program
Executing 8086 programs
• Masm file_name.asm;
• Link file_name.obj;
• Afdebug file_name.exe
• Or
• File_name at the command prompt
datas SEGMENT
– Hello DB “Hello world $”
datas ENDS
staks SEGMENT
– DB 100 dup()
staks ENDS
codes SEGMENT
ASSUME CS: codes, DS: datas, SS: staks
Start:
– MOV AX, SEG datas
– MOV DS, AX
– MOV CX, SEG staks
– MOV SS, CX
– MOV AH, 09h
– MOV DX, OFFSET Hello
– INT 21h
– MOV AX, 4C00h
– INT 21h
codes ENDS
END START
Add two numbers 05h and 04h and
display it on monitor
• #include <stdio.h>
• void main()
• {
• char aa = 05, bb = 04, sum ;
• sum = aa + bb ;
• printf(”%d”, sum );
• }
datas SEGMENT
aa DB 05h
bb DB 04h
sum DB ?
datas ENDS
• stacks SEGMENT
• DB 100 DUP(0)
• stacks ENDS
codes SEGMENT
ASSUME CS: codes, DS: datas,
SS: stacks
start: ;; beginning address of program ({)
MOV ax, SEG datas
MOV ds, ax
MOV cx, SEG stacks
MOV ss, cx
; data processing
MOV al, aa
MOV cl, bb
ADD al, cl
MOV sum, al
ADD al, 30h
MOV dl, al
MOV ah, 02h
INT 21h
;; terminate program
MOV ax, 4C00h
INT 21h
codes ENDS
END start ; (})