0% found this document useful (0 votes)
16 views

Microcomputer & Interfacing - Teaching

The document discusses register assignments, segment overrides, string instructions, repeat prefixes, logical instructions, shift and rotate instructions, and arithmetic instructions of the 8086 microprocessor. It provides examples and explanations of how to use these instructions, as well as the purpose and functionality of each instruction type.

Uploaded by

zem091415
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
16 views

Microcomputer & Interfacing - Teaching

The document discusses register assignments, segment overrides, string instructions, repeat prefixes, logical instructions, shift and rotate instructions, and arithmetic instructions of the 8086 microprocessor. It provides examples and explanations of how to use these instructions, as well as the purpose and functionality of each instruction type.

Uploaded by

zem091415
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 30

Table 3.

5 Default register assignments

A typical application for the segment override is to allow data to be stored in the code
segment.

Example 3.4

CODE SEGMENT
COUNT DB 0FFH
MOV AL, CS:COUNT
The variable COUNT is defined within the code segment, requiring the MOV instruction
to use the CS: override to access this memory location.
3.6 STRING INSTRUCTION

These instructions are used for moving large blocks of data or strings. For all these
instructions the memory source is DS:SI and the memory destination is ES:DI. Segment
override can applied only to the source address. The destination must be the extra
segment. The offset memory pointers, DI and SI, are automatically incremented or
decremented depending on the state of DF by 1 for bytes or by 2 for words.

STOS (store string byte or word) and LODS (load string byte or word) instructions
transfer a byte or word from the accumulator to memory or from the memory to the
accumulator

MOVS (move string byte or word) instruction combines these two operations,
transferring the byte or word from the memory source to the memory destination.

30
Table 3.6 segment override prefix

31
Table 3.7 string instruction

32
SCAS (scan string byte or word) and CMPS (compare string byte or word) instructions
allow the destination byte or word to be compared with the accumulator (SCAS) or the
memory source (CMPS). After execution the flags are set to reflect the relationship of the
destination to the source element. The conditional jump instructions can then be used to
make decision such as “jump if AL is greater than the memory byte” or “jump if the
destination memory word equals the source memory word.”

33
3.7 REPEAT PREFIX

Preceding the instructions STOS or MOVS with the REP (repeat) instruction causes these
instructions to be repeated a number of times equal to the contents of the CX register. By
loading CX with the number of words or bytes to be moved, a single string instruction
(and REP prefix) can move up to 65,536 bytes.

Table 3.8 repeat prefix

34
Example 3.5

Write the 8086 program required to fill the 1000D byte of memory in the extra segment
beginning at address BLOCK with the data byte 20H. Assumed that the DF is to be 0.

Solution

MOV AL, 20H ;AL holds the data byte


LEA DI, BLOCK ;DI holds the address of block
MOV CX, 03E7H ;load CX with 1000D
REP STOSB ;store AL at ES:DI, increment
;DI, and repeat 1000 times
REPE/REPZ (repeat while equal or zero) and REPNE/REPNZ (repeat while not equal
or not zero) forms of the REP prefix are intended for use with the SCAS and CMPS
string instructions. They allow the string operation to be repeated while equal
(REPE/REPZ) or while not equal (REPNE/REPNZ).
3.8 LOGICAL INSTRUCTIONS

The logical instructions refers to the Boolean logical functions, such as AND, OR, NOT,
exclusive OR, and to the rotate and shift instructions. These instructions are all performed
in the ALU and usually affect all the flags.

3.8.1 BOOLEAN FUNCTION


Each function is performed bit by bit between the source and destination operands. CF
and OF are reset.

Example 3.6

Determine the contents of register AL and the state of the flags after the following
instructions are executed.

MOV AL, 6DH


MOV BH, 40H
AND AL, BH
Solution
First write the register contents in binary:

01101101 (AL)
01000000 (BH)
01000000 =40H (AL)

The flags are affected as follows:


CF = 0 ;CF is reset by the AND instruction

35
PF = 0 ;40H has an odd number of logic 1’s
AF = x ;AF is undefined
ZF = 0 ;the result is not zero
SF = 0 ;bit is reset
OF = 0 ;OF is reset by the AND instruction

Table 3.9 logical instructions

36
The applications of AND
• The destination operand can be forced low by choosing those bits as 0 in the source
operand.
• To consider the source operand a mask for testing selected bits of the destination
operand.

In the above example all bits are masked except bit 6. If this bit is 0, the result is zero, if
it is 1, the result is non zero.

AND AL, BH
JZ START
Using the AND instruction results in a “destructive” bit test because the contents of the
destination operand is altered by the instruction.

Figure 3.2 shift and rotate instructions

37
TEST: this instruction performs the same function as AND instruction, but doesn’t alter
the source or destination operand. This is a particular handy instruction to use when
several bits must be tested.

OR instruction can be used to force selected bits high. Example OR AL, 80H will force
bit 7 of AL high without changing any of the other bits in this register.

Exclusive-OR can be used to complement selected bits. Example XOR AL, 80H will
complement bit 7 of register AL without changing any of the other bits.

Table 3.10 shifts and rotate instructions

38
3.9 SHIFT AND ROTATE INSTRUCTIONS

There are several shift and rotate instructions. The rotated quantity can be an 8-bit or a
16-bit CPU register or memory location. The main difference between a shift and a rotate
is that the shifted bits “fall off” the end of the register, where as the rotated bits “wrap
around.” Within the shift group of instructions there are both arithmetic (SAL and SAR)
and logical (SHL and SHR) shift instructions.

The arithmetic shifts operate so that the sign bit (bit 7 or bit 15) doesn’t change when the
shift occurs. The SAL instruction in effect multiplies the data by 2 (maintaining the
correct sign), and SAR divides the data by 2. The overflow flag (OF) will be set if the
shifted quantity exceeds the limits for an 8- or 16-bit register (+127 to -128 for bytes and
+32767 to -32768 for words). The shift and rotate instructions can be repeated up to 255
times by loading register CL with the desired count.

Example 3.7

MOV CL, 5
RCL DX, CL

Will rotate the contents of register DX left 5 times through the carry
3.10 ARITHMETIC INSTRUCTIONS

The 8086/88 can add and subtract 8- and 16- bit numbers in any of the general CPU
registers, and using certain dedicated registers, perform multiplication and division of
signed or unsigned numbers.

3.10.1 ADDITION AND SUBTRACTION INSTRUCTION


There are two forms of addition and subtraction instructions. One includes the carry and
the other doesn’t. Note that the destination and source operands can be register and
register, register and memory, memory and register, immediate data and register, or
immediate data and memory.

For example, suppose we wish to add the 32 bit number in register BX:AX to the 32-bit
number DX:CX.

BX AX
+DX CX
DX CX

Although there are no 32-bit addition instructions, the problem is easily solved by the
ADC (add with carry) instruction.

39
For Example ADD CX, AX ;CX CX + AX
ADC DX, BX ;DX DX + BX + CF

The first instruction does not include the carry, as there is no carry in at this point. If the
addition of AX and CX sets CF, the second addition will add this to the sum of the DX
and BX.
The SUB (subtract) and SBB (subtract with borrow) instructions work similarly, with CF
representing the borrow condition.

Table 3.11 addition and subtraction instructions

40
When adding or subtracting one from a memory pointer or counter variable, the INC
(increment) and DEC (decrement) instructions should be used.

The NEG (negate) instruction forms the 2’s complement of the destination operand,
effectively reversing its sign. This is done by subtracting the destination from 0.

Example 3.8

Determine the value of AL and the value of the flags following the instruction sequence

MOV AL, 5
NEG AL
Solution
AL = 00000000 - 00000101 = 11111011 = FBH = -5.

41
The flags are affected as follows:

CF = 1 ;NEG sets CF except when the operand is 0


PF = 0 ;FBH has an odd number of logic 1’s
AF = 1 ;there is a borrow out of bit 4
ZF = 0 ; the result is not 0
SF = 1 ;bit 7 is set
OF = 0 ;there is no overflow condition

The CMP (compare) instruction is useful for determining the relative size of two
operands. Normally it is followed by a conditional jump instruction such as “jump if
equal” or “jump if greater than or equal.”

3.10.2 MULTIPLICATION AND DIVISION


Multiplication and division can be performed on signed or unsigned numbers. The source
operand can be a memory location or a CPU register, but the destination operand must be
register AX (and register DX for 32-bit results). The register usage is shown in figure 3.3
for both byte and word operations. Note that the immediate operands are not allowed.

Example 3.9

Write a program to input two 8-bit unsigned numbers from input ports A0H and B0H and
output the product to 16-bit output port 7080H.

Solution

IN AL,0A0H
MOV BL, AL
IN AL, 0B0H
MUL BL
MOV DX, 7080H
OUT DX, AX
Division can be performed on the word in AX or the double word in DX:AX. The divisor
can be an 8-bit or a 16-bit memory location or CPU register. Note that the remainder is
returned in register AH or DX when the result does not come out even.
Example 3.10

Write a program to divide the unsigned word input at indirect I/O port 8000H by 500D.
Determine the result if the input data is 56,723.

42
Solution

MOV DX, 8000H


MOV BX, 01F4H
IN AX, DX
DIV BX

The result is
AX = INT (56,723/500) = 113=71H and

DX = MOD (56,723/500) = 223 = 00DFH

A special problem can occur when the divisor is so small as to cause the quotient to
overflow the register dedicated to the result. For example, dividing 65,000 by 2 leaves a
result too large to fit in register AL alone. When this occurs a special divide by zero
software interrupt is automatically generated by the 8086. This causes control to be
transferred to the address stored in locations 00000-00003H.

The integer multiplication (IMUL) and division (IDIV) instructions are similar to the
unsigned forms except that the most significant bit represents the sign of the number. For
integer byte division the quotient is limited to the range +127 to -128 and to the range
+32767 to -32768 for word division.

The register usage is shown

Figure 3.3 register usage for multiplication and division instructions


The multiplication and division instructions can be performed on 8-bit or 16-bit register
or memory source operands. Specific registers are dedicated to these functions as shown.

43
Table 3.12 multiplication and division instructions

44
3.11 TRANSFER OF CONTROL INSTRUCTION

All programs execute in a sequential manner (fetch instruction whose address is in IP,
increment IP, and execute the instruction). However, there are times when it is necessary
to transfer program control to an address that is not the next instruction in sequence.

Examples are:

• Group of instructions that must be executed repeatedly

• Groups of instructions that are shared throughout a program (subroutine)

• Conditional transfers based on the state of the flags, and

• Software interrupts.

3.11.1 UNCONDITIONAL JUMP INSTRUCTION


There are five forms of the jump instruction. Three of them are unconditional, (control is
transferred to the target address without regard for the state of flags)

When a program control is transferred to a new address relative to the value in IP, it is
called near or relative jump (direct form). When the target address is within -128 to +127
bytes of IP, it is called short jump. Using short jump one byte of object code can be
saved. Because one less byte is required, the short form is best. In fact, when assembling

45
your program, the assembler will automatically generate a short jump if it can determine
that the target address is located within -128 to +127 bytes.

The following group of instructions shows assembly language program demonstrating the
near jump instruction

ADDR HEX CODES LABELS OP-CODE OPERANDS


0000 B3 04 MOV BL, 04H
0002 E5 06 REPEAT: IN AX, 06H
0004 F6 F3 DIV BL
0006 E7 9A OUT 9AH, AX
0008 E9 F7 FF JMP REPEAT
000B
And the following program is rewritten using the JMP SHORT instruction; one byte of
code is saved.
ADDR HEX CODES LABELS OP-CODE OPERANDS
0000 B3 04 MOV BL, 04H
0002 E5 06 REPEAT: IN AX, 06H
0004 F6 F3 DIV BL
0006 E7 9A OUT 9AH, AX
0008 E9 F8 JMP SHORT REPEAT
000A
The memory indirect and register indirect forms of the jump instruction specify the actual
16-bit target address. These two forms are not thus relative.
Example JMP SHORT REPEAT instruction can be replaced with two instructions.

MOV BX, 00002

JMP BX

Note that using indirect jump, any address within the code segment can be specified.
However, an extra instruction is required to set the target address. The main advantage of
using relative jump is that the resulting program is relocatable anywhere within the code
segment.

When control is transferred to a target address in a new code segment, it is called a far
jump. Again direct and indirect forms are possible but neither form is relative. The direct
form requires the assembler operator FAR PTR to identify the label as being in a new
code segment. The indirect forms must specify a double word for the new CS and IP
values.

46
Table 3.13 jump instruction

47
3.11.2 CONDITIONAL JUMP
The conditional jump instructions perform a short jump based on the condition of the
status flags.

Tables below show and list all the testable conditions. Usually, a conditional jump
instruction is placed after an arithmetic or logical instruction, transferring control
depending on the result of that instruction.

Table 3.14 conditional jump instructions

48
Example 3.11

Explain the operation of the following program.

MOV BL, 47H


IN AL, 36H
CMP AL, BL
JE MATCH
JA BIG
JMP SMALL
Note that MATCH, BIG, and SMALL must be located within -128 to +127bytes of the
corresponding conditional jump instruction
Solution

The program inputs a data byte from input port 36H and then compares it with 47H. If a
match occurs, control is transferred to the program beginning at address MATCH. If the
input byte is >47, control is transferred to the program beginning at address BIG. If none
of these conditions are met, control is passed to the program beginning at address
SMALL.

In summary, the conditional jump instructions are among the most important in the
processor’s instruction set, because they allow the processor to make decisions based on
program condition.

3.12 Loop instructions

Loop instructions are used to set up a group of instructions to execute several times. They
combine the decrement counter and transfer of control instruction

Decrement register which holds the loop count by 1 at the end of each loop
JNZ (jump to the start if count register is not zero)
Example 3.12

Using the loop instruction, write a program segment to output 256 bytes from data table
beginning at address TABLE to output port A0H. Assume DF=0

Solution

LEA SI, TABLE


MOV CX, 0100H
AGAIN: LODSB
OUT 0A0H, AL
LOOP AGAIN

49
Table 3.15 loop instructions

This example shows the string and loop instructions actually perform two operations
each. LODSB (load string byte) is equivalent to
MOV AL, [SI]
INC SI

And LOOP AGAIN replaces the equivalent instructions


DEC CX
JNZ AGAIN

The LOOPE or LOOPZ (loop if equal or zero) and LOOPNE or LOOPNZ (loop if not
equal or not zero) instructions test CX and ZF. For example, LOOPE “loops while equal”
this means that if CX≠0 and ZF=1, the loop will be repeated. These two forms are useful
when comparing two strings or looking for a match between a CPU register and a byte or
word in a data table.

Note all forms the loop instruction repeat until CX=0, this means that the loop will be
repeated 65,536 times if CX=0 initially.

50
3.13 Push and pop instructions

The PUSH and POP instructions use the stack area of the memory. Stack Segment (SS) is
a 64K-B memory segment whose base address determined by SS register. Two CPU
registers SP, and BP normally points into this area. The stack is a special area in memory
used by the processor for temporary data storage. SS segment is LIFO type of memory.

Data is pushed onto the stack by the PUSH source instruction. And the POP destination
instruction causes the data currently on top of the stack to be popped into the destination
operand. Note the stack actually grows downward with each successive PUSH
instructions.

Table 3.16 push and pop instructions

51
Example 3.13

PUSH CX
PUSH BX

Registers should be popped off the stack in the reverse order in which they were pushed
on. Before using the stack it is important that register SP be initialized to a high memory
location allowing room for the stack to grow.

Finally, PUSHF and POPF instructions allow the processor flags to be stored on the
stack. This can be useful
ul with interrupts and subroutines as the entire state of the machine
(all CPU registers and flags) can be saved and then restored later.

3.14 Call and return instructions

The CALL and RET instructions allow the programmer to use a group of instructions as a
subroutine or procedure that can be executed several times from within the main
program. The CALL instruction is similar to an unconditional jump except that the value
of IP is pushed onto the stack, Control then transfer. The subroutine must end with a RET
instruction, which causes the top of the stack to be popped into IP, neatly returning
control to the instruction in the main program with which it left off.

The far CALL differs from the near CALL in that the value of CS (in addition to IP) is
saved onn the stack. For this reason a far RET instruction is used to pop CS and IP from
the stack when the far procedure has ended.

52
Table 3.17 call and return instructions

53
3.15 Software interrupts

An interrupt is a request of the processor to suspend its current program and transfer
control to a new program called the interrupt service routine (ISR). The interrupt request
can be initiated in hardware or software. For the 8086, applying a logic 1 to the INTR or
NMI input line will initiate the interrupt request.

Software interrupts are initiated by giving the instruction INT type. The processor
responds by pushing the flags, CS, and IP on to the stack. It then loads new value for CS
and IP from an interrupt jump table located in absolute memory from 00000 – 003FFH.
These 1KB allow 256 different software interrupt request

54
Figure 3.4 Stack area after executing an INT type instruction.
SP’ is the new value of register SP

Figure 3.5 interrupt jump table


If an INT 23H is executed, the processor will multiply 23H by 4 (rotate left twice),
resulting in the jump table address 0008CH. CS and IP will then be loaded with the
double word stored in 0008CH through 0008FH (CS in the higher order word, IP in the
th

55
lower order word). When ISR has finished, the IRET instruction should be executed to
pop the flag register from stack (in addition to CS and IP).

400H Type 255

3FCH Type 254

14H Type 5

10H Type 4 Over flow

CH Type 3 Break point

Type 2 NMI non maskable


8H interrupt

4H Type 1 Trap

0H Type 0 Division error

CS high byte

CS low byte

IP high byte

IP low byte

Figure 3.6 interrupt jump table

56
Table 3.18 software interrupt instructions

3.16 Processor control instruction

Processor control instructions are used to control the operation of the processor and set or
clear the status indicators.

The STD (set direction flag) and CLD (clear direction flag) instructions are used to set or
clear this flag.

STI (set interrupt enable flag) and CLI (clear interrupt enable flag) enable or disable
maskable interrupts on the INTR input line. Clearing this bit blocks all interrupts on
INTR effectively masking this input.

57
There is no instruction for setting or resetting TF (trap flag), but the following sequence
of instructions can be used to set TF.

PUSHF
MOV BP, SP
OR BYTE PTR[BP+1], 01H
POPF
The HALT instruction will stop the processor and cause it to enter an idle loop.
However, once halted it can be restarted only via a hardware interrupt or system reset.
Table 3.19 processor control instructions

58
59

You might also like