You are on page 1of 49

Chapter 6 - 8086 instruction description and

assembler directives
from Microprocessors and Interfacing by Douglas Hall
Outline
• Instruction Description
• Assembler Directives
Instruction Description(contd.)
AAA – ASCII Adjust for Addition
• 8086 allows you to add ASCII codes for two decimal digits without masking
of the “3” in upper nibble of each.
• After the addition, the AAA instruction is used to make sure that the result
is the correct unpacked BCD.
• The AAA instruction works only on AL register.
AAD – BCD to binary convert before Division
• Converts two unpacked BCD digits in AH and AL to the equivalent binary
number in AL.
• After the Division the AL will contain the unpacked BCD quotient and AH
will contain the unpacked BCD remainder.
Instruction Description(contd.)
AAM – BCD Adjust for Multiply
• After the two BCD digits are multiplied the AAM instruction is used to
adjust the product to two unpacked BCD digits in AX.
• Works only on an operand in AL.
• Updates PF, SF and ZF.
AAS – ASCII Adjust for Subtraction
• 8086 allows you to subtract ASCII codes for two decimal digits without
masking of the “3” in upper nibble of each.
• After the subtraction, the AAA instruction is used to make sure that the
result is the correct unpacked BCD.
• The AAS instruction leaves the correct unpacked BCD result in the low
nibble of AL.
Instruction Description(contd.)
ADC – Add with Carry, ADD – Addition
• ADC source, destination: adds the number from source to the number in
destination and then stores the result in destination and the carry in CF.
• ADD source, destination: Does similar things as the ADC but do not store
the carry in CF. Rather it discards the carry.
AND
• AND destination, source: ANDs each bit in the source byte or word with
each bit in the destination byte or word.
• The result is put into specified destination register/location, the contents of
the source does not change.
Instruction Description(contd.)
CALL – Call a procedure
• Used to transfer the execution to another subprogram or procedure. There
are two basic types:
• NEAR: a call to a procedure which is in the same code segment as the CALL
instruction.
• FAR: a call to a procedure which is in different segment then the CALL
instruction.
CBW – Convert signed Byte to signed Word
• Copies the sign of a byte in AL to all the bits in the AH.
• AH is then said to be the sign extension of the AL.
• The CBW must be done before a signed byte in AL can be divided by
another signed byte with the IDIV instruction.
Instruction Description(contd.)
CLC, CLD, CLI, CMC
• CLC: Instruction resets the carry flag to 0.
• CLD: resets the direction flag to 0.
• CLI: resets the interrupt flag to 0.
• CMC: complement the carry flag i.e. from 01 and from 10.
CMP – Compare byte or word
• CMP destination, source: this instruction compares the byte from the
source to the byte in the destination or a word from the specified source to
the word from the specified destination.
• Flags AF, OF, SF, ZF, PF and CF flags are updated to show the result of the
comparison.
Instruction Description(contd.)
CMPS/CMPSB/CMPSW – Compare String Bytes or String Words
• Used to compare a byte in one string with the byte in another string or a word in one
string with the word in another string.
• SI is used to hold offset of source string and DI is used for the destination string.
CWD – Convert signed Word to signed Double Word
• Copies the sign bit of a word in AX to all the bits in the DX register.
• It must be done before the signed word in AX is divisible by another signed word with
the IDIV instruction.
• It affects no flags.
DAA, DAS
• DAA: used to make sure the result of adding two BCD number is a BCD number.
• DAS: used after subtracting two BCD numbers to make sure the result is correct packed
BCD.
Instruction Description(contd.)
DEC – Decrement Destination register or memory
• DEC destination: subtracts one from the destination word or byte.
• AF, OF, PF, SF and ZF flags are updated.
DIV – Unsigned Divide
• Used to divide unsigned word by a byte or to divide an unsigned
double word by a word.
• The word must be present in AX register and divisor must be in
register or memory location.
• After division AL contains the 8-bit result (quotient) and AH will
contain the 8-bit remainder.
Instruction Description(contd.)
ESC – Escape
• Used to pass instructions to the coprocessor such as 8087 math processor shares
the address and data bus with an 8086.
HLT – Halt processing
• It causes 8086 to stop fetching and executing instructions.
• Processor will be in the halt state. The only way it can be resume is by generating
interrupt at the INTR pin.
IDIV – Divide by signed byte or word
• IDIV source: the instruction is used to divide a signed word by a signed byte, or to
divide signed double word by a word.
• The operand must be in AX the divisor may be in register or memory location.
• The final quotient is stored in AL and remainder will be stored in AH.
Instruction Description(contd.)
IMUL – Multiply signed numbers
• IMUL source: multiplies a signed byte from some source times a signed byte in AL
or a signed word from some source times a signed word in AX.
• CF and OF flags are updated.
IN – copy data from a port
• IN Accumulator, port: copy data from a port to the AL or AX register.
• If 8-bit port is read then the data will be read into AL else if 16-bit port is read the
data will go into AX.
INC – Increment
• INC Destination: it adds one to the source word or byte specified in the
destination.
• AF, OF, PF, SF and ZF are affected.
Instruction Description(contd.)
• INT – Interrupt program execution
• INT Type: type refers to any number between 0 to 255.
• When 8086 executes the INT instruction it does following:
• Decrement the stack pointer by 2 and PUSH the flags onto the stack.
• Decrement the stack pointer by 2 and PUSH the contents of CS onto the stack.
• Decrement the stack pointer by 2 and PUSH the offset of the next instruction after
INT into the stack.
• Get a new value for IP from an absolute memory address of 4 times the type
specified in the instruction.
• Get a new value for CS from an absolute memory address of 4 times the type
specified in the instruction plus 2.
• Reset both IF and TF.
Instruction Description(contd.)
INTO – Interrupt on overflow
• Decrement the stack pointer by 2 and PUSH the flags onto the stack.
• Decrement the stack pointer by 2 and PUSH the contents of CS onto the
stack.
• Decrement the stack pointer by 2 and PUSH the offset of the next
instruction after INTO onto the stack.
• Reset TF and IF.
IRET – Interrupt Return
• Use at the end of the interrupt service procedure to return execution to
the interrupted program.
• It reloads the contents of the stack and changes the IP value.
Instruction Description(contd.)
JA/JNBE – Jump if Above/Jump in Not Below or Equal
• After compare or some other instruction the instruction will cause the execution
to jump to a label given in the instruction.
• No flags are affected.
JAE/JNB/JNC – Jump if Above or Equal/Jump if Not Below/Jump in No Carry
• If after a compare or some other instruction the CF is 0 this instruction will cause
the execution to jump on the specified label.
• If CF is 1 the instruction will have no effect.
JB/JC/JNAE – Jump if Below/Jump if Carry/Jump if Not Above or Equal
• If after a compare or some other instruction the CF is 1 this instruction will cause
the execution to jump on the specified label.
• If CF is 0 the instruction will have no effect.
Instruction Description(contd.)
JBE/JNA – Jump if Below or Equal/Jump if Not Above
• If after a compare or some other instruction the CF is 1 this instruction will cause the
execution to jump on the specified label.
• If CF and ZF both are 0 the instruction will have no effect.
JCXZ – Jump if the CX register is 0
JE/JZ – Jump if Equal/Jump if Zero
JG/JNLE – Jump if Greater/Jump if Not Less than or Equal
• After compare the instruction will cause a jump if ZF is 0 and CF is same as the OF.
• The destination must be in the range of -128 bytes to +127 bytes.
JL/JNGE – Jump if Less than/Jump if Not Greater than or Equal
• After compare instruction it will cause the jump if SF is not equal to OF.
• The destination must be in the range of -128 bytes to +127 bytes.
Instruction Description(contd.)
JLE/JNG – Jump if Less than or Equal/Jump if Not Greater
• After compare instruction it will cause the jump if ZF is set or SF is not
equal to OF.
• The destination must be in the range of -128 bytes to +127 bytes.
JMP – Unconditional Jump to the Specified Location
• It will always force the 8086 to jump to the specified location.
• The more similar instructions are JNE – Jump if Not equal, JNZ – Jump
if Not Zero, JNO – Jump if No Overflow, JNP – Jump if No Parity, JPO –
Jump if Odd Parity, JNS – Jump if Not Signed, JO – Jump if Overflow,
JP – Jump if Parity, JPE – Jump if Parity Even, JS – Jump if Signed etc.
Instruction Description(contd.)
LAHF – Copy low byte of Flag register to AH
• Lower byte of the 8086 is same as the flag bytes of the 8085.
• Thus it copies the flag bytes of the 8085 to the AH register.
LDS – Load register and DS with the word from memory
• LDS – Register, memory address of first word: it copies the word from two
memory locations into the register specified in the instruction.
• It then copies the word from the next two memory location into DS
register.
LEA – Load Effective Address
• LEA register, source: determines offset of the variable or memory location
named source and puts it into 16-bit register.
Instruction Description(contd.)
LES – Load register and ES with the word from memory
• This instruction loads new values into the specified register and ES
register from four successive memory locations.
• The word from the first two memory location will be copied to the
specified register and the word from the next two locations will be
copied in to the ES register.
LOCK – Assert Bus lock Signal
• Allows microprocessors to ensure that the other processor can’t take
control of the system bus while it is in critical instruction which uses
the system bus.
Instruction Description(contd.)
LODS/LODSB/LODSW – Load String word or byte into AL
• Copies the byte from a string location pointed to by SI to AL or a word to AX.
LOOP – Jump to specified Label if CX! =0 After Auto decrement
• Used to repeat a series of instruction a number of times.
• The number of time the sequence is repeated is stored in CX register
• Variants are LOOPE, LOOPZ, LOOPNE and LOOPNZ.
MOV – Copy a word or byte
• MOV destination, source: copies a word or byte from the source byte to the
destination byte.
• The variants are MOVS/MOVSB/MOVSW – move string, byte or move string
word.
Instruction Description(contd.)
MUL – Multiply unsigned bytes or words
• MUL source: multiplies the unsigned byte from source times an unsigned byte in the AL
register or word in the AX register.
NEG – Forms 2’s complement
• NEG Destination: replaces the number in destination with the 2’s complement of that
number
NOP – NO Operation
• It simply uses the 3 clock cycles and increments the instruction pointer to point to the
next instruction.
OR – Logically OR
• OR Destination, Source: ORs each bit in source byte or word with the bit in destination
byte or word.
• The result is put in the specified destination.
Instruction Description(contd.)
OUT – Output a Byte or word to a port
• OUT Port, Accumulator: the Out instruction copies a byte from AL or a word from
AX to the specified port.
• Two types of ports: Fixed and Variable port
POP
• POP destination: copies the word from the stack top location to the destination
specified.
• The stack pointer is automatically incremented by 2.
PUSH
• PUSH Source: decrements the stack pointer by 2 and copies the word specified in
the source to the location pointed by the stack pointer.
• PUSHF: push the flag register onto the stack.
Instruction Description(contd.)
RCL – Rotate operand around to the left through CL
• Rotates all the bits in the specified byte or word to some bits in left.
• It is circular because the MSB of the operand is stored in to the CF and then CF is stored in to the
LSB of the operand.
• Similarly RCR: rotates the operand through right using CF.
REP/REPE/REPNE/REPZ/REPNZ – Repeat String Instruction until specified condition exists
• REP is the prefix which will cause the CX register to be decremented and the string to be repeated
until CX=0.
• REPE is repeat is equal, REPZ is repeat if zero causes the string to be repeated as long as the
words are equal and ZF=1 respectively.
RET – Return Execution from the procedure call
• Return execution from the procedure to the next instruction after the CALL instruction.
• It do this by restoring the stack contents to the registers and setting IP to point to the next
instruction after the CALL instruction.
Instruction Description(contd.)
ROL – rotate Left, ROR – Rotate Right
• ROL Destination, count: rotate the bits specified in destination to count no of bit
positions.
• Similarly ROR do the same thin but it rotates towards right.
SAHF- Copy AH register to low byte of Flag register
• The lower byte of the 8086 flag register exactly corresponds to the 8085 flag
register.
• This instruction replaces this 8085 flag register with the byte from AH register.
SAL/SHL – Shift operand bit in left, put zero in LSBs, SAR – shift right
• SAL/SHL Destination, count: shifts each bits in the specified destination to some
number of bits specified by the count value towards left.
• SAR destination, count: shifts in right.
Instruction Description(contd.)
SBB – Subtract with Borrow, SUB - subtract
• SUB Destination, source: subtracts the number in source from the number in destination and the
final result is stored in destination. It ignores borrow.
• SBB: it does the same thing but do not ignore borrow.
SCAS/SCASB/SCASW – Scans a String or Byte or Word
• Compares a byte in AL or a word in AH with a byte or word pointed to by DI in ES.
• Therefore the string to be compared must be in extra segment and the DI must contain the offset
of the byte or word.
STC/STD/STI – set carry flag, set direction flag, set interrupt flag to 1.
STOS/STOSB/STOSW – Stores byte or word in string
• Copies a byte from AL or a word from AX to the memory location in extra segment pointed by DI.
• After copy DI is automatically incremented or decremented to point to the next string element in
memory.
Instruction Description(contd.)
TEST – AND operands to Update
• ANDs the contents of the source byte with the contents of the destination
byte. Flags are updated but neither operand is changed.
WAIT – Wait for test signal or interrupt signal
• 8086 enters in idle condition and does no processing. It will stay in the idle
position until 8086 TEST input pin is made low or interrupt signal is
received on INTR or NMI pins.
XCHG
• XCHG destination, source: changes the contents of destination with
contents of source and vice versa.
• Destination and Source both must be either byte or word. It can be register
or memory location.
Instruction Description
XLAT/XLATB – Translate a byte in AL
• Used to translate a byte from one code to another code.
• Replaces the byte in AL register with the byte pointed to by BX in a
lookup table in the memory. The lookup table must be in the memory
before execution of XLAT.
XOR – eXclusive OR
• XOR Destination, Source: instruction exclusive ORs each bit in the
source byte or word with the bit in the destination byte or word.
• The result will follow the truth table of XOR. The answer will be stored
in the destination.
Assembler Directives
• An assembler directive is a statement to give direction to the
assembler to perform task of the assembly process.

• It control the organization of the program and provide


necessary information to the assembler to understand the
assembly language programs to generate necessary machine
codes. They indicate how an operand or a section of the
program is to be processed by the assembler.
• An assembler supports directives to define data, to organise
segments to control procedure, to define macros.

• The instructions are translated to the machine code by the


assembler whereas directives are not translated to the
machine codes.
Assembler Directives(contd.)
Assume
• Used to tell the assembler the name of the logical segment it should use
for a specified segment.
• You must tell the assembler that what to assume for any segment you use
in the program.
• Example, ASSUME: CODE tells the assembler that the instructions for the
program are in segment named CODE.
DB – Defined Byte
• Used to declare a byte type variable or to set aside one or more locations
of type byte in memory.
• Example, PRICES DB 49H, 98H, 29H: Declare array of 3 bytes named PRICES
and initialize 3 bytes as shown.
Assembler Directives(contd.)
DD – Define Double Word
• Used to declare a variable of type doubleword or to reserve a memory
location which can be accessed as doubleword.
DQ – Define Quadword
• Used to tell the assembler to declare the variable as 4 words of storage in
memory.
DT – Define Ten bytes
• Used to tell the assembler to declare the variable which is 10 bytes in
length or reserve 10 bytes of storage in memory.
DW – Define Word
• Used to tell the assembler to define a variable type as word or reserve
word in memory.
Assembler Directives(contd.)
END – End the program
• To tell the assembler to stop fetching the instruction and end the program
execution.
• ENDP – it is used to end the procedure.
• ENDS – used to end the segment.
EQU – Equate
• Used to give name to some value or symbol.
EVEN – Align on Even memory address
• Tells the assembler to increment the location counter to the next even
address if it is not already at an even address.
Assembler Directives(contd.)
EXTRN
• Used to tell the assembler that the name or labels following the directive
are in some other assembly module.
GLOBAL – Declares symbols as PUBLIC or EXTRN
• Used to make the symbol available to other modules.
• It can be used in place of EXTRN or PUBLIC keyword.
GROUP – Group related segment
• Used to tell the assembler to group the logical segments named after the
directive into one logical segment.
• This allows the content of all the segments to be accessed from the same
group.
Assembler Directives(contd.)
INCLUDE – include source code from file
• Used to tell the assembler to insert a block of source code from the named
file into the current source module. This shortens the source code.
LABEL
• Used to give the name to the current value in the location counter.
• The LABEL directive must be followed by a term which specifies the type
you want associated with that name.
LENGTH
• Used to determine the number of items in some data such as string or
array.
Assembler Directives(contd.)
NAME
• Used to give a specific name to a module when the programs consisting of several
modules.
OFFSET
• It is an operator which tells the assembler to determine the offset or displacement of
named data item or procedure from the start of the segment which contains it.
ORG – Originate
• Tells the assembler to set the location counter value.
• Example, ORG 7000H sets the location counter value to point to 7000H location in
memory.
• $ is often used to symbolically represent the value of the location counter. It is used with
ORG to tell the assembler to change the location according to the current value in the
location counter. E.g. ORG $+100.
Assembler Directives(contd.)
PROC – Procedure
• Used to identify the start of the procedure.
PTR – Pointer
• Used to assign a specific type to a variable or a label.
• It is necessary to do this in any instruction where the type of the operand is
not clear.
Public
• It is used to tell the assembler that the specified label or variable is
accessible by other modules.
• This is useful in large programs which are generally written in modules.
Assembler Directives
SEGMENT
• Used to indicate that the start of a logical segment.
• Preceding the segment directive is the name you want to give to the segment.
SHORT
• Used to tell the assembler that only a 1-byte displacement is needed to code a jump
instruction.
• If the jump destination is after the jump instruction in the program, the assembler will
automatically reserve 2 bytes for the displacement.
TYPE
• Tells the assembler to determine the type of a specified variable.
• The TYPE operator can be used in instruction such as ADD BX, TYPE WORD_ARRAY, where
we want to increment BX to point to the next word in an array of words.
Writing and using Procedures
• To avoid writing the sequence of instructions in the program each
time you need them, you can write the sequence as a separate
subprogram called a procedure

• You use the CALL instruction to send the 8086 to the starting address
of the procedure in memory

37
Contd..
• A RET instruction at the end of the procedure returns execution to
the next instruction in the main line

• Procedures can even be nested

38
The CALL Instruction Overview
• The 8086 CALL instruction performs 2 operations when it executes

• First, it stores the address of the instruction after the CALL instruction
on the stack

• This address is called the return address because it is the address that
execution will return to after the procedure executes

39
Contd..
• If the CALL is to a procedure in the same code
segment, then the call is near, and only the
instruction pointer contents will be saved on the stack

• If the CALL is to a procedure in another code


segment, the call is far ; In this case both the
instruction pointer and the code segment register
contents will be saved on the stack

40
Contd..

• Second operation of the CALL instruction is to change the contents of


the instruction pointer and, in some cases, the contents of the code
segment register to contain the starting address of the procedure

41
The 8086 RET Instruction
• A return at the end of the procedure copies this value from the stack
back to the instruction pointer to return execution to the calling
program

• When the 8086 does a far call, it saves the contents of both the
instruction pointer and the code segment register on the stack

42
MAINLINE OR CALLING
PROGRAM
PROCEDURE
INSTRUCTIONS

CALL

NEXT MAINLINE
INSTRUCTIONS

RET

Fig. Single Procedure Call

43
Main Line Instructions

Lower level
Procedure Procedure

CALL CALL
Next Main Line
Instructions
RET
RET

Fig. Nested Procedures Call

44
REENTRANT PROCEDURES
MAIN LINE MULTIPLY PROCEDURE
INTERRUPT PROCEDURE

CALL MULTIPLY Interrupt


CALL MULTIPLY
Occurs here
Return to Interrupted
Next Main Line
Instruction after call Program

Return to Calling
Program

45
Recursive Procedures

• A recursive procedure is a procedure which calls itself

• Recursive procedures are often used to work with


complex data structures.

46
Contd..

Procedure Procedure Procedure


MAIN LINE
FACTO FACTO FACTO

CALL CALL

CALL FACTO

Next Main Line


RET
Instruction
RET WITH 1 !
RET WITH 2 !
WITH 3 !

47
MACROS
• A macro is the group of instruction we bracket and give a name to at
the start of the program.
• Using macro avoids the overhead time involved in calling and
returning from a procedures.
• Disadvantage is that this will make the program take up more
memory than using a procedure.

You might also like