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

Subroutines & Stack: Dr. Farid Farahmand Updated: 2/18/2019

The document discusses subroutines and the stack. It defines a subroutine as a block of code that can be called from different places and saves code space. Subroutines use parameters, local variables, and can return values. The stack is used to store return addresses and parameters for subroutines. The CALL instruction pushes the return address onto the stack, and RETURN pops it off. Macros are like subroutines but are assembled each time rather than using the stack.

Uploaded by

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

Subroutines & Stack: Dr. Farid Farahmand Updated: 2/18/2019

The document discusses subroutines and the stack. It defines a subroutine as a block of code that can be called from different places and saves code space. Subroutines use parameters, local variables, and can return values. The stack is used to store return addresses and parameters for subroutines. The CALL instruction pushes the return address onto the stack, and RETURN pops it off. Macros are like subroutines but are assembled each time rather than using the stack.

Uploaded by

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

Subroutines & Stack

Dr. Farid Farahmand


Updated: 2/18/2019
Basic Idea

l Large programs are hard to handle


l We can break them to smaller programs
l They are called subroutines

l Subroutines are called from the main


program
l Writing subroutines
l When should we jump? (use CALL)
l Where do we return to? (use RETURN)
Subroutine

l A subroutine is a block of code that is called from different


places from within a main program or other subroutines.
l Saves code space in that the subroutine code does not have to
be repeated in the program areas that need it;
l Only the code for the subroutine call is repeated.
l A subroutine can have
l parameters that control its operation
l local variables for computation.
l A subroutine may pass a return value back to the caller.
l Space in data memory must be reserved for parameters, local
variables, and the return value.
Subroutine
Using Subroutines

l When using subroutines we need to


know the following:
l Where is the NEXT instruction s address
l How to remember the RETURN address

l Subroutines are based on MPU


instructions and use STACK
Stack
l Temporary memory
storage space used STKPTR
during the execution of a
program
l Used by MPU
l Stack Pointer (SP) PC
l The MPU uses a register
called the stack pointer,
similar to the program
counter (PC), to keep track
of available stack locations.
Data Storage via the Stack
l The word stack is used because storage/retrieval of
words in the stack memory area is the same as
accessing items from a stack of items.
l Visualize a stack of boxes. To build a stack, you place
box A, then box B, then box C
l Notice that you only have access to the last item placed on the stack (the Top
of Stack –TOS). You retrieve the boxes from the stack in reverse order (C
then B then A). A stack is also called a LIFO (last-in-first-out) buffer (similar to
a Queue)
PIC18 Microcontroller Stack
Content:
l Consists of 31 registers-21-
TOSU/H/L
bit wide, called the hardware
stack 21-bit
Address:
STKPTR
l Starting with 1 to 31 (5-bit)
l Stack is neither a part of
program memory or data
registers.
l To identify these 31 registers,
5-bit address is needed
l PIC18 uses one of the special
function registers called
STKPTR (Stack Pointer) to
keep track of the available
stack locations (registers).
STKPTR (Stack Pointer) Register

Find this register in the data sheet:


l SP4-SP0: Stack Address http://ww1.microchip.com/downloads/en/DeviceDoc/41303D.pdf

l STKOF: Stack overflow


l When the user attempts to use more than 31 registers to
store information (data bytes) on the stack, BIT7 in the
STKPTR register is set to indicate an overflow.
l STKUNF: Stack underflow
l When the user attempts to retrieve more information than
what is stored previously on the stack, BIT6 in the
STKPTR register is set to indicate an underflow.
Instructions to Store and Retrieve
Information from the Stack

l PUSH
l Increment the memory address in the stack pointer (by
one) and stores the contents of the counter (PC+2) on the
top of the stack
l POP
l Discards the address of the top of the stack and
decrement the stack pointer by one
l The contents of the stack (21-bit address), pointed
by the stack pointer, are copied into three special
function registers
l TOSU (Top-of-Stack Upper), TOSH (High), and TOSL (Low)
TOSU TOSH TOSL
Instructions to Store and Retrieve Information
from the Stack

l The PIC18 stack has limited capability


compared to other μPs. It resides within its
memory, and is limited to 31 locations.
l For a CALL, address of next instruction
(nPC) is pushed onto the stack 0: left alone!

l A push means to increment STKPTR, then


store nPC (Next PC or PC+2) at location
[STKPTR].
l STKPTR++; [STKPTR] ←nPC
l A return instruction pops the PC off the
stack.
l A pop means read [STKPTR] and store to the
PC, then decrement
l STKPTR (PC ←[STKPTR], STKPTR--)
Example

l What is the value of PC, TOSU/H/L and


STKPTR as you execute each line?
nPC TOS STKPTR W
22 0 0 00
24 0 0 20
26 26 1 20
28 28 2 20
2A 26 1 20
2C 0 0 20
Subroutine Call

l In the PIC18F, the stack is used to store the


return address of a subroutine call.
l The return address is the place in the calling
program that is returned to when subroutine
exits.
l On the PIC18Fxx, the return address is PC+4,
if PC is the location of the call instruction .
l Call is a 2-word instruction!
l The return address is PC+2 if it is a rcall
instruction.
CALL Instruction

l CALL Label, S (0/1) ;Call subroutine


; located at Label
l CALL Label, FAST ;FAST is equivalent to
; S=1
l If S = 0: Increment the stack pointer and store the contents
of the program counter (PC+4) on the top of the stack (TOS)
and branch to the subroutine address located at Label.
l If S = 1: Increment the stack pointer and store the contents of
the program counter (PC+4) on the top of the stack (TOS) and
the contents of W, STATUS, and BSR registers in their
respective shadow registers, and branch to the subroutine
address located at Label.
RCALL Instruction

l RCALL, n ;Relative call to subroutine

within n = 512 ;words (or 1 Kbyte)


;Increments the stack pointer and stores the
contents of the program counter (PC+2) on
the top of the stack (TOS) and branch to the
location Label within n = 512 words (or
1 ;Kbyte)
RETURN Instruction

l RETURN,0 à gets the address from TOS and


moves it to PC, decrements stack pointer
l RETURN,1 à gets the address from TOS and
moves it to PC, decrements stack pointer;
retrieves all shadow registers (WREG,
STATUS, BSR)*
l RETLW à gets the address from TOS and
moves it to PC ; returns literal to WREG,
decrements stack pointer
* 1 or FAST
Example

l Program Listing with Memory Addresses

Org 0x20

? ?
END ;ending directive

Can you tell what the complete commands?


Why do we have 0x2A and then 0x2E?
How many instruction cycle is a CALL?
How did we start DELAY subroutine at 0x40?
What happens after executing 0x0048?
Example

l Program Listing with Memory Addresses

Org 0x20
Org 0x40

2-Word Instructions

END ;ending directive

After CALL: After RETURN:


Note:
2-Word TOS=00 00 2E
àInst. PC=00 00 40 PC=2E
PC+4 (2Aà2E)
STKPTR=01 STKPTR=00
Subroutine Architecture
How do we write a subroutine?
Parameter Passing

Inputs Basic Functionality


Outputs
Register Modifications

List of Subroutines used


Macros and Software Stack
l Macro
l Group of assembly language instructions that can be
labeled with name
l Short cut provided by assembler
l Format includes three parts

Push_macro macro arg


movff arg,POSTINC1
endm

USE: Push_macro WREG


A push means to increment STKPTR, then store nPC (Next PC
or PC+2) at location [STKPTR].
STKPTR++; [STKPTR] ←nPC
Macro Description - Example
l See how FSR is loaded and POSTDEC works.
l How a MACRO is being called!

BYTE MACRO: Before MAIN


MACRO Application
l Note COUNT is not defined in the MARCO
l It is the "arg” of the MACRO
l MACRO is assembled after every instance it is called
MACRO Application

l So what if MACRO is called multiple times?


l A MACRO is assembled after every instance it is
called
Subroutine versus Macro
l Subroutine (by MPU) l Macro (by assembler)
l Requires instructions l Based on assembler
such as CALL and
RETURN, and the l Shortcut in writing
STACK (overhead) assembly code
l Memory space required l Memory space
by a subroutine does required depends on
not depend on how how many times it is
many times it is called called
l It is less efficient in l In terms of execution
terms of execution than it is more efficient
that of a macro
because it includes because it does not
overhead instructions have overhead
such as Call and Return instructions
More about subroutines…

l Remember subroutines can call other


subroutines
l This is referred as structured code
Examine this code:

See next slide…..


Answer the following:

lAtwhat location in the program memory CLEARME is built? Explain.


lWhat are the contents of register 0x60, 0x61, etc. in the program memory?
lWhere is the location of FSR1 when the MARCO is called?
lWhere exactly does CLEARME macro does? How many registers are effected?
lWhere exactly does BYTECP macro does? How many registers are effected?
lModify the program using MACROs such that you perform the following tasks:
l Copy NINE values already stored in PROGRAM MEMORY locations, starting with locations
0x80, into RAM locations starting with register 0x80. Assume the numbers are 1-9.
l Copy NINE values already stored in PROGRAM MEMORY locations, starting with locations
0x80, into RAM locations starting with register 0x90. Assume the numbers are 1-9.
l Take the sum of all the values and locate the SUM in RAM location 0x100.
l Delete all the RAM registers starting with with register 0x90 - 0x09F
Example…..

l Modify program listing here such that


you can correctly take the average of
any sum.
l http://web.sonoma.edu/users/f/farahman/sonoma/courses/es310/labs/ip6-5_finding_average_temp.asm

l The number of inputs can be up to 20


non-zero unsigned values

You might also like