Stacks &
Subroutines
The Stack
oThe stack is an area of memory identified
by the programmer for temporary storage
of information.
o The stack is a LIFO (Last In First Out. )
structure.
o The stack normally grows
backwards
into memory.
o In other words, the programmer
defines the of the stack
and the bottom grows up
reducing address range. into
stack
The Stack
oGiven that the stack grows backwards into memory, it
is customary to place the bottom of the stack at the end
of memory to keep it as far away from user programs
as possible.
oIn the 8085, the stack is defined by setting the SP
(Stack Pointer) register.
LXI SP, FFFFH
oThis sets the Stack Pointer to location FFFFH (end of
memory for the 8085).
Saving Information on the
Stack
oInformation is saved on the stack by PUSHing
it on.
oIt is retrieved from the stack by POPing it off.
oThe 8085 provides two instructions: PUSH
and POP for storing information on the stack
and retrieving it back.
oBoth PUSH and POP work with register pairs
ONLY.
The PUSH Instruction
● PUSH B/D/H/PSW
o Decrement SP
o Copy the contents of register B to the memory
pointedlocation
to by SP
o Decrement SP
o Copy the contents of register C to the memory
pointedlocation
to by SP
The POP Instruction
● POP B/D/H/PSW
o Copy the contents of the memory location pointed to by
the
SP
o to register E SP
Increment
o Copy the contents of the memory location pointed to by
SP to register
the D
o Increment
SP
Operation of the Stack
oDuring pushing, the stack operates in a
“decrement then store” style.
oThe stack pointer is decremented first, then
the information is placed on the stack.
oDuring poping, the stack operates in a “use
then increment” style.
oThe information is retrieved from the top of the the
stack and then the pointer is incremented.
o The SP pointer always points to “the top of the stack”.
LIFO
●The order of PUSHs and POPs must be opposite of each
other in order to retrieve information back into its original
location.
PUSH B
PUSH
D
...
POP D
POP B
● Reversing
the order
of the
POP
instructio
ns will
The PSW Register Pair
o The 8085 recognizes one additional pair
register called the PSW (Program Status Word).
oThis register pair is made up of the Accumulator and
the Flags registers.
oIt is possible to push the PSW onto the stack, do
whatever operations are needed, then POP it off of the
stack.
oThe result is that the contents of the Accumulator and
the status of the Flags are returned to what they were
before the operations were executed.
Cautions with PUSH and
●
POP
PUSH and POP should be used in opposite
order.
● There has to be as many POP’s as there are
PUSH’s.
●If not, the RET statement will pick up the
wrong information from the top of the stack and
the program will fail.
●It is not advisable to place PUSH or POP
inside a loop.
Program to Reset and display
Flags
oClear all Flags.
oLoad 00H in the accumulator, and
demonstrate that the zero flag is not affected
by data transfer instruction.
oLogically OR the accumulator with itself to
set the Zero flag, and display the flag at
PORT1 or store all flags on the stack.
Program to Reset and display
Flags
● XX00 LXI SP, XX99H Initialize the stack
● 03 MVI L, 00H Clear L
● 05 PUSH H Place (L) on stack
● 06 POP PSW Clear Flags
● 07 MVI A, 00H Load 00H
● 09 PUSH PSW Save Flags on stack
● 0A POP H Retrieve flags in L
● 0B MOV A, L
● 0C OUT PORT0 Display Flags (00H)
● 0E MVI A, 00H Load 00H Again
Program to Reset and display
Flags
●XX10 ORA A Set Flags and reset
CY, AC
● 11 PUSH PSW Save Flags on Stack
● 12 POP H Retrieve Flags in L
● 13 MOV A, L
● 14 ANI 40H Mask all Flags except Z
● 16 OUT PORT1 Displays 40H
● 18 HLT End of Program
Subroutines
oA subroutine is a group of instructions that will be used
repeatedly in different locations of the program.
oRather than repeat the same instructions several
times, they can be grouped into a subroutine that is
called from the different locations.
oIn Assembly language, a subroutine can exist
anywhere in the code.
oHowever, it is customary to place subroutines
separately from the main program.
Subroutines
oThe 8085 has two instructions for dealing with
subroutines.
oThe CALL instruction is used to redirect
program execution to the subroutine.
oThe RTE instruction is used to return the
execution to the calling routine.
The CALL Instruction
● CALL 4000H
o 3-byte instruction.
o Push the address of the instruction immediately following the
CALL onto the stack and decrement the stack pointer register by
two.
o Load the program counter with the 16-bit address supplied
with the CALL instruction.
o Jump Unconditionally to memory location.
The RTE Instruction
● RTE
o 1-byte instruction
o Retrieve the return address from the top of the stack and
increments stack pointer register by two.
o Load the program counter with the return address.
o Unconditionally returns from a subroutine.
Passing Data to a
Subroutine
o In Assembly Language data is passed to a
subroutine through registers.
oThe data is stored in one of the registers by the calling
program and the subroutine uses the value from the
register.
oThe other possibility is to use agreed upon memory
locations.
oThe calling program stores the data in the memory
location and the subroutine retrieves the data from the
location and uses it.
RESTART, CONDITIONAL CALL
& RETURN INSTRUCTIONS
RST Instruction
RESTART, CONDITIONAL CALL
& RETURN INSTRUCTIONS
Conditional CALL
RESTART, CONDITIONAL CALL
& RETURN INSTRUCTIONS
Conditional RETURN
A Proper Subroutine
o According to Software Engineering practices, a
proper subroutine:
oIs only entered with a CALL and exited with an
RTE
o Has a single entry point
o Do not use a CALL statement to jump into
different points of the same subroutine.
Writing Subroutines
Write a Program that will display FF and 11 repeatedly on the
seven segment display. Write a ‘delay’ subroutine and Call it as
necessary.
C000: LXI
SP, FFFF C003:
MVI A, FF C005:
OUT 00
C007: CALL C014
C00A: MVI A, 11
C00C: OUT 00
C00E: CALL 1420
Writing Subroutines
DELAY: C014: MVIB, FF
C016: MVIC, FF
C018: DCR C
C019: JNZ C018
C01C: DCR B
C01D: JNZ C016
C020: RET
Problem Statement