1 / 21

Week 8

Week 8. Stack and Subroutines. Stack. The stack is a section of data memory (or RAM) that is reserved for storage of temporary data The data may represent addresses The stack operates in a last-in first-out (LIFO) manner

nelly
Download Presentation

Week 8

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Week 8 Stack and Subroutines

  2. Stack • The stack is a section of data memory (or RAM) that is reserved for storage of temporary data • The data may represent addresses • The stack operates in a last-in first-out (LIFO) manner • This means that access to the stack is in a restricted manner, whereby new data is added to the top of the stack and data is removed from the top also • While it appear that such a structure for storing and retrieving data seems limited, the stack actually makes handling of certain programming tasks very easy • See important uses for stack soon

  3. Stack • Think of a stack of plates • It is natural to add a plate to the top of stack • It is natural to remove a plate from the top also • The terminology used for stacks • Push • Meaning add to of stack • Pop • Meaning remove from top of stack The terminology associated with stacks comes from the spring loaded plate containers common in dining halls. When a plate is washed it is pushed on the stack. When someone needs food, a clean plate is popped off the stack.

  4. Stack • Data is pushed on top and poped from the top of a stack • To access a stack in memory, the address of the top of the stack is needed • Processers have a special register called a Stack Pointer (SP) to store the address of the stack top • Actually processor designers differ in how this is handled. • Some processors have a stack pointer that points to the last data pushed on the stack, while others point to the next available location!

  5. Stack: Example operation

  6. 8051 has a SP reg 8 bit register in the SFR block (address Used to address (indirectly) a location in internal data memory Max of 256 locations Initialised to address 07H on power up Can be changed if needed Stack grows with increasing memory addresses The two instructions are PUSH direct Operates by firstly incrementing the contents of the SP and then storing the value addressed by direct at the address in SP POP direct Operates by copying the byte pointed to by SP into the location specified by direct. The contents of SP is then decremented by 1 Stack: 8051 Details

  7. 8051 Programmer’s Model Note: The SP reg is shown twice here!

  8. Example • Assume SP contains 07H, A contains 3AH and address 40H contains 00H • What does the stack look like after these instructions? PUSH ACC INC A PUSH ACC POP 39H PUSH 40H ADD A,#05H PUSH ACC POP 40H POP ACC

  9. Example • The A, B and PSW registers are required to perform some calculations, but contain values that are needed later. Use the stack to solve the problem • Solution PUSH ACC ; Store on Stack. PUSH B PUSH PSW …. ; Do calculations …. ; here. POP PSW ; Restore from stack. POP B ; Note order of instructions, POP ACC ; this is important!!

  10. Subroutines

  11. Subroutines • Subroutines provide a mechanisn to reuse a piece of code • They also simplify the design and coding process, allowing the programmer to partition and abstract subtasks • Subroutines also makes testing and debugging easier

  12. Subroutines: ACALL and LCALL • Just as there was AJMP and LJMP, similarly there is ACALL and LCALL. The assembler will select the approapiate call instruction if the CALL instruction is used (see earlier lectures) • The CALL instruction is • CALL addr • Operates by saving the address of the next instruction on the stack and transferring program control to the subroutine code starting at addr • By saving the address of the next instruction, it is possible to resume execution of the next instruction when the subroutine is finished

  13. Subroutines: Example MOV P1,10H MOV A,90H main XRL P1,A CALL Delay JMP main Delay: ; delay 100ms MOV R7,#200 ; 200*500us=100ms dy1: MOV R6,#250 ; 250*2us=500us dy2: DJNZ R6,dy2 ; here for 500us DJNZ R7,dy1 ; repeat 200 times ; (100ms delay) RET • When the instruction CALL Delay is executed, • The address of the next instruction is pushed onto the stack automatically • 2 address bytes • The PC is loaded with the address of the Delay subroutine • The next instruction to be fetched will then be the first instruction in the Delay subroutine

  14. Subroutines: RET • How does the processor know when to return from the subroutine? • When a RET instruction is executed • The instruction is RET • It has no operands • The execution of this instruction causes the PC to be reloaded with two bytes (16 bits) that are popped off the stack MOV P1,10H MOV A,90H Main: XRL P1,A CALL Delay JMP main Delay: ; delay 100ms MOV R7,#200 ; 200*500us=100ms dy1: MOV R6,#250 ; 250*2us=500us dy2: DJNZ R6,dy2 ; here for 500us DJNZ R7,dy1 ; repeat 200 times ; (100ms delay) RET

  15. Example:Simulation

  16. Subroutines • Always make sure to include a RET instruction in the subroutine • What are the consequences of not doing so? • Because the stack is used, make sure that it is not corrupted between calling the subroutine and returning • Can still use PUSH and POP instructions • See next example

  17. Subroutines • When subroutines are called, care must be taken not to corrupt resources that are used by the calling code • Calling code refers to code from which subroutine called from • Called code refers to subroutine code itself • A good way to address this issue is to use the stack • Consider the Delay subroutine example. • This uses R6 and R7. What if the called function used these registers

  18. Subroutines MOV P1,10H MOV A,90H Main: XRL P1,A CALL Delay JMP main Delay: PUSH 07 PUSH 06 ; delay 100ms MOV R7,#200 ; 200*500us=100ms dy1: MOV R6,#250 ; 250*2us=500us dy2: DJNZ R6,dy2 ; here for 500us DJNZ R7,dy1 ; repeat 200 times ; (100ms delay) POP 06 POP 07 RET • By storing the values of R6 and R7 on the stack at start of subroutine and restoring the original values from the stack at the end of the routine, it is now possible to use the delay routine, even when it is called from a section of code that uses R6 or R7 for a different purpose. • This really makes the Delay routine very usable. • Assumes Bank 0 used

  19. Subroutines • Subroutines often require data to be passed in/out • There are 2 standard approaches • Both are flexible in that data does not have to be located at fixed addresses in memory • The two approaches • Through registers • Limited no. of registers • Fast • Using the stack • More space available • Allows re-entrant operation (recursive calls)

  20. Examples • Write a delay routine that can provide a delay of between 100ms and 10s, in increments of 100ms. • Use both approaches for passing data

  21. Exercises • What is instruction encoding for each of the following? PUSH 41H POP 41H

More Related