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