chapters 8 stacks and subroutines...subroutine la subroutineis a block of code that is calledfrom...
TRANSCRIPT
![Page 1: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/1.jpg)
Chapters 8Stacks and Subroutines
Embedded Systems with ARM Cortext-M Updated: Tuesday, March 6, 2018
![Page 2: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/2.jpg)
Basic Idea
lLarge programs are hard to handle lWe can break them to smaller programslThey are called subroutines
lSubroutines are called from the main programlWriting subroutines
lWhen should we jump? (use CALL)lWhere do we return to? (use RETURN)
![Page 3: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/3.jpg)
Subroutine
lA 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.
lA subroutine can have l parameters that control its operationl local variables for computation.
lA 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.
![Page 4: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/4.jpg)
Subroutine
![Page 5: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/5.jpg)
Using Subroutines
• When using subroutines we need to know the following: • Where is the NEXT instruction�s address • How to remember the RETURN address
• Subroutines are based on MPU instructions and use STACK
Let’s Review Stacks and then we come back to subroutines!
![Page 6: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/6.jpg)
StacklTemporary memory storage
space used during the execution of a program
lUsed by MPUlStack Pointer (SP)
lThe MPU uses a register called the stack pointer, similar to the program counter (PC), to keep track of available stack locations.
STKPTR
PUSH POP
Stack base
Memory Address
0x00000000
0xFFFFFFFF
Stack grows downwards
Stack top
![Page 7: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/7.jpg)
Data Storage via the Stack• 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.• Visualize a stack of boxes. To build a stack, you place box A,
then box B, then box C• 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)
GENERALLY set in SRAM 0x20000600 Area
![Page 8: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/8.jpg)
Instructions to Store and Retrieve Information from the Stack
lPUSHlIncrement the memory address in the stack pointer (by one) and
stores the contents of the counter (PC+2) on the top of the stack
lPOPlDiscards the address of the top of the stack and decrement the
stack pointer by one
![Page 9: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/9.jpg)
Example
lWhat is the value of PC (PC=PC+2), and STKPTR as you execute each line?
nPC TOS STKPTR W22 0 0 0024 0 0 2026 26 1 2028 28 2 202A 26 1 202C 0 0 20
MOV R0, #2MOV R0, #2MOV R0, #2
REG
![Page 10: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/10.jpg)
Stack Growth Convention:Ascending vs Descending
10
Descending stack: Stack grows towards low memory address
Ascending stack: Stack grows towards high memory address
PUSH POP
Stack base
Memory Address
0x00000000
0xFFFFFFFF
Stack grows downwards
Stack top
PUSH POP
Stack base
Stack grows upwards
Stack top
Memory Address0xFFFFFFFF
0x00000000
![Page 11: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/11.jpg)
Cortex-M Stack• stack pointer (SP) = R13 • Cortex-M uses full descending
stack• stack pointer• decremented on PUSH• incremented on POP• SP starts at 0x20000600 for
STM32F401xe devices
11
PUSH POP
Stack Pointer
(SP)
Stack base
Memory Address
0x00000000
0xFFFFFFFF
stack growdownwards
Stack top
![Page 12: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/12.jpg)
StackPUSH {Rd} • SP = SP-4 ⟶descendingstack• (*SP) = Rd ⟶fullstack
Push multiple registers
12
PUSH {r6, r7, r8}
They are equivalent. PUSH {r8}PUSH {r7}PUSH {r6}
PUSH {r8, r7, r6}
• The order in which registers listed in the register list does not matter. • When pushing multiple registers, these registers are automatically
sorted by name and the lowest-numbered register is stored to the lowest memory address, i.e. is stored last.
Lowest Memory
Highest MemoryLM HM
![Page 13: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/13.jpg)
Example: swap R1 & R2R1
R2
R13 (SP)
0x20000200
0x200001FC
0x200001F8
0x20000200
0x22222222
0x11111111
13
xxxxxxxx
PUSH {R1}PUSH {R2}POP {R1}POP {R2}
memory
Address
xxxxxxxx
xxxxxxxx
![Page 14: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/14.jpg)
Example: swap R1 & R2R1
R2
R13 (SP)
0x20000200
0x200001FC
0x200001F8
0x200001FC
0x22222222
0x11111111
14
xxxxxxxx
PUSH {R1}PUSH {R2}POP {R1}POP {R2}
memory
AddressPC
0x11111111
xxxxxxxx
![Page 15: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/15.jpg)
Example: swap R1 & R2R1
R2
R13 (SP)
0x20000200
0x200001FC
0x200001F8
0x200001F8
0x22222222
0x11111111
15
xxxxxxxx
PUSH {R1}PUSH {R2}POP {R1}POP {R2}
memory
Address
PC
0x11111111
0x22222222
![Page 16: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/16.jpg)
Example: swap R1 & R2R1
R2
R13 (SP)
0x20000200
0x200001FC
0x200001F8
0x200001FC
0x22222222
0x22222222
16
xxxxxxxx
PUSH {R1}PUSH {R2}POP {R1}POP {R2}
memory
Address
PC 0x11111111
0x22222222
![Page 17: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/17.jpg)
Example: swap R1 & R2R1
R2
R13 (SP)
0x20000200
0x200001FC
0x200001F8
0x20000200
0x11111111
0x22222222
17
xxxxxxxx
PUSH {R1}PUSH {R2}POP {R1}POP {R2}
memory
Address
PC0x11111111
0x22222222
![Page 18: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/18.jpg)
Quiz
18
Are the values of R1 and R2 swapped?
PUSH {R1, R2}POP {R2, R1}
PUSH {r2}PUSH {r1}
Lowest Memory
Highest Memory
Descending SP
![Page 19: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/19.jpg)
Quiz
19
Are the values of R1 and R2 swapped?
PUSH {R1, R2} ; Push R2 then R1POP {R2, R1} ; POP R1 then R2
Answer: No.
But you can:PUSH {R1, R2}POP {R2}POP {R1}
orPUSH {R1}PUSH {R2}POP {R1, R2}
PUSH {r2}PUSH {r1}
Lowest Memory
Highest Memory
Descending SP
POPing out of order!
![Page 20: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/20.jpg)
Back to Subroutine
• In general, a subroutines, also called a function or a procedure, • single-entry, single-exit• Return to caller after it exits
• In ARM: • When a subroutine is called, the Link Register (LR) holds the memory address
of the next instruction to be executed after the subroutine exits.
20
![Page 21: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/21.jpg)
Link Register
21
R0R1R2R3R4R5R6R7R8R9
R10R11R12
R13 (SP)R14 (LR)R15 (PC)
32 bits
CONTROLFAULTMASK
PRIMASKBASEPRI
R13 (MSP) R13 (PSP)
xPSR
Low Registers
High Registers
32 bits
SpecialPurposeRegister
GeneralPurposeRegister
Link Register (LR) holds the return address of the current subroutine call.
![Page 22: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/22.jpg)
Call a Subroutine
Caller Program Subroutine/Callee
MOV r4, #100...BL foo...ADD r4, r4, #1 ; r4 = 101, not 11
foo PROC...MOV r4, #10 ; foo changes r4...BX LRENDP
![Page 23: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/23.jpg)
Calling a SubroutineBL label• Step 1: LR = PC + 4 (Return address)• Step 2: PC = label (Next instruction)
• Notes:• label is name of subroutine• Compiler translates label to memory address• After call, LR holds return address (the
instruction following the call)
23
Caller Program
MOV r4, #100...BL fooMOV. R5,#2...
Subroutine/Calleefoo PROC
...MOV r4, #10...BX LRENDP
Subroutine: A New Process
![Page 24: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/24.jpg)
Exiting a SubroutineBX LR• PC = LR
24
Caller Program
MOV r4, #100...BL foo...
Subroutine/Calleefoo PROC
...MOV r4, #10...BX LRENDP
![Page 25: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/25.jpg)
ARM Procedure Call Standard
25
Register Usage SubroutinePreserved Notes
r0 Argument 1 and return value No If return has 64 bits, then r0:r1 hold it. If argument 1 has 64 bits, r0:r1 hold it.
r1 Argument 2 Nor2 Argument 3 No If the return has 128 bits, r0-r3 hold it.r3 Argument 4 No If more than 4 arguments, use the stackr4 General-purpose V1 Yes Variable register 1 holds a local variable.r5 General-purpose V2 Yes Variable register 2 holds a local variable.r6 General-purpose V3 Yes Variable register 3 holds a local variable.r7 General-purpose V4 Yes Variable register 4 holds a local variable.r8 General-purpose V5 YES Variable register 5 holds a local variable.r9 Platform specific/V6 No Usage is platform-dependent.
r10 General-purpose V7 Yes Variable register 7 holds a local variable.r11 General-purpose V8 Yes Variable register 8 holds a local variable.
r12 (IP) Intra-procedure-call register No It holds intermediate values between a procedure and the sub-procedure it calls.
r13 (SP) Stack pointer Yes SP has to be the same after a subroutine has completed.
r14 (LR) Link register No LR does not have to contain the same value after a subroutine has completed.
r15 (PC) Program counter N/A Do not directly change PC
![Page 26: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/26.jpg)
Link Register
26
R0R1R2R3R4R5R6R7R8R9
R10R11R12
R13 (SP)R14 (LR)R15 (PC)
32 bits
CONTROLFAULTMASK
PRIMASKBASEPRI
R13 (MSP) R13 (PSP)
xPSR
Low Registers
High Registers
32 bits
SpecialPurposeRegister
GeneralPurposeRegister
Scratch registers, not saved by subroutine. Hold arguments/result
Link Register
Callee must save them. Caller expects these values are retained .
![Page 27: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/27.jpg)
Preserve Runtime Environment via Stack
27
Caller Program Subroutine/Callee
MOV r4, #100...BL foo...ADD r4, r4, #1 ; r4 = 101, not 11
foo PROCPUSH {r4} ; preserve r4...MOV r4, #10 ; foo changes r4...POP {r4} ; Recover r4BX LR
ENDP
Callee must save R4 and beyond. Caller expects these values to be retained
![Page 28: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/28.jpg)
Stacks and SubroutinesWhere is the ADD INSTRUCTION Return Address saved?
ADD INSTRUCTION
![Page 29: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/29.jpg)
Stacks and Subroutines Saving PC1+4: ADD INSTRUCTION
ADD INSTRUCTION
![Page 30: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/30.jpg)
Subroutine Calling Another Subroutine
30
MAIN
MOV R0,#2
BL QUAD
ENDL ...
QUAD PUSH {LR}
BL SQ
BL SQ
POP {LR}
BX LR
SQ MUL R0,R0
BX LR
Function MAIN Function QUADFunction SQ
![Page 31: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/31.jpg)
Subroutine Calling Another Subroutine
31
MAIN PROC
MOV R0,#2
BL QUAD
ENDL ...
ENDP
QUAD PROC
PUSH {LR}
BL SQ
BL SQ
POP {LR}
BX LR
ENDP
SQ PROC
MUL R0,R0
BX LR
ENDP
Function MAIN
Function QUAD
Function SQ
![Page 32: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/32.jpg)
Example: R0 = R04MOV R0,#2
BL QUAD
B ENDL
SQMUL R0,R0
BX LR
QUAD PUSH {LR}
BL SQ
BL SQ
POP {LR}
BX LR
ENDL ...
PUSH {LR}
POP {LR}
BL SQ
B ENDL
BL SQ
BX LR
xxxxxxxx 0x200002000x200001FC0x200001F8
MOV R0,#2
BL QUAD
BX LR
MUL R0,R0
0x0800014C0x08000150
0x08000140
0x08000148
0x080001540x08000158
0x080001380x0800013C
0x08000144
0x0800015C
R0
PC 0x08000138LRSP 0x20000200
SQ
QUAD
32
Descending Stack
![Page 33: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/33.jpg)
Example: R0 = R04
PUSH {LR}
POP {LR}
BL SQ
B ENDL
BL SQ
BX LR
xxxxxxxx 0x200002000x200001FC0x200001F8
MOV R0,#2BL QUAD
BX LR
MUL R0,R0
0x02R0
PC 0x0800013CLRSP 0x20000200
SQ
QUAD
33
MOV R0,#2
BL QUAD
B ENDL
SQMUL R0,R0
BX LR
QUAD PUSH {LR}
BL SQ
BL SQ
POP {LR}
BX LR
ENDL ...
0x0800014C0x08000150
0x08000140
0x08000148
0x080001540x08000158
0x080001380x0800013C
0x08000144
0x0800015C
![Page 34: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/34.jpg)
Example: R0 = R04MOV R0,#2
BL QUAD
B ENDL
SQMUL R0,R0
BX LR
QUAD PUSH {LR}
BL SQ
BL SQ
POP {LR}
BX LR
ENDL ...
PUSH {LR}
POP {LR}
BL SQ
B ENDL
BL SQ
BX LR
xxxxxxxx 0x200002000x200001FC0x200001F8
MOV R0,#2BL QUAD
BX LR
MUL R0,R0
0x02R0
PC 0x0800014CLRSP 0x20000200
0x08000140 SQ
QUAD
34
Preserve Link Register (LR)
0x0800014C0x08000150
0x08000140
0x08000148
0x080001540x08000158
0x080001380x0800013C
0x08000144
0x0800015C
![Page 35: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/35.jpg)
Example: R0 = R04MOV R0,#2
BL QUAD
B ENDL
SQMUL R0,R0
BX LR
QUAD PUSH {LR}
BL SQ
BL SQ
POP {LR}
BX LR
ENDL ...
PUSH {LR}
POP {LR}
BL SQ
B ENDL
BL SQ
BX LR
xxxxxxxx 0x200002000x08000140 0x200001FC
0x200001F8
MOV R0,#2BL QUAD
BX LR
MUL R0,R0
0x02R0
PC 0x08000150LRSP 0x200001FC
0x08000140SQ
QUAD
35
0x0800014C0x08000150
0x08000140
0x08000148
0x080001540x08000158
0x080001380x0800013C
0x08000144
0x0800015C
Note: The address is saved
![Page 36: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/36.jpg)
Example: R0 = R04MOV R0,#2
BL QUAD
B ENDL
SQMUL R0,R0
BX LR
QUAD PUSH {LR}
BL SQ
BL SQ
POP {LR}
BX LR
ENDL ...
PUSH {LR}
POP {LR}
BL SQ
B ENDL
BL SQ
BX LR
xxxxxxxx 0x200002000x200001FC0x200001F8
MOV R0,#2BL QUAD
BX LR
MUL R0,R0
0x02R0
PC 0x08000144LRSP 0x200001FC
0x08000154
0x08000140
SQ
QUAD
36
0x0800014C0x08000150
0x08000140
0x08000148
0x080001540x08000158
0x080001380x0800013C
0x08000144
0x0800015C
![Page 37: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/37.jpg)
Example: R0 = R04MOV R0,#2
BL QUAD
B ENDL
SQMUL R0,R0
BX LR
QUAD PUSH {LR}
BL SQ
BL SQ
POP {LR}
BX LR
ENDL ...
PUSH {LR}
POP {LR}
BL SQ
B ENDL
BL SQ
BX LR
xxxxxxxx 0x200002000x200001FC0x200001F8
MOV R0,#2BL QUAD
BX LR
MUL R0,R0
0x04R0
PC 0x08000148LRSP 0x200001FC
0x08000154
0x08000140
SQ
QUAD
37
0x0800014C0x08000150
0x08000140
0x08000148
0x080001540x08000158
0x080001380x0800013C
0x08000144
0x0800015C
![Page 38: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/38.jpg)
Example: R0 = R04MOV R0,#2
BL QUAD
B ENDL
SQMUL R0,R0
BX LR
QUAD PUSH {LR}
BL SQ
BL SQ
POP {LR}
BX LR
ENDL ...
PUSH {LR}
POP {LR}
BL SQ
B ENDL
BL SQ
BX LR
xxxxxxxx 0x200002000x200001FC0x200001F8
MOV R0,#2BL QUAD
BX LR
MUL R0,R0
0x04R0
PC 0x08000154LRSP 0x200001FC
0x08000154
0x08000140
SQ
QUAD
38
0x0800014C0x08000150
0x08000140
0x08000148
0x080001540x08000158
0x080001380x0800013C
0x08000144
0x0800015C
![Page 39: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/39.jpg)
Example: R0 = R04MOV R0,#2
BL QUAD
B ENDL
SQMUL R0,R0
BX LR
QUAD PUSH {LR}
BL SQ
BL SQ
POP {LR}
BX LR
ENDL ...
PUSH {LR}
POP {LR}
BL SQ
B ENDL
BL SQ
BX LR
xxxxxxxx 0x200002000x200001FC0x200001F8
MOV R0,#2BL QUAD
BX LR
MUL R0,R0
0x04R0
PC 0x08000144LRSP 0x200001FC
0x08000158
0x08000140
SQ
QUAD
39
0x0800014C0x08000150
0x08000140
0x08000148
0x080001540x08000158
0x080001380x0800013C
0x08000144
0x0800015C
![Page 40: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/40.jpg)
Example: R0 = R04MOV R0,#2
BL QUAD
B ENDL
SQMUL R0,R0
BX LR
QUAD PUSH {LR}
BL SQ
BL SQ
POP {LR}
BX LR
ENDL ...
PUSH {LR}
POP {LR}
BL SQ
B ENDL
BL SQ
BX LR
xxxxxxxx 0x200002000x200001FC0x200001F8
MOV R0,#2BL QUAD
BX LR
MUL R0,R0
0x10R0
PC 0x08000148LRSP 0x200001FC
0x08000158
0x08000140
SQ
QUAD
40
0x0800014C0x08000150
0x08000140
0x08000148
0x080001540x08000158
0x080001380x0800013C
0x08000144
0x0800015C
![Page 41: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/41.jpg)
Example: R0 = R04MOV R0,#2
BL QUAD
B ENDL
SQMUL R0,R0
BX LR
QUAD PUSH {LR}
BL SQ
BL SQ
POP {LR}
BX LR
ENDL ...
PUSH {LR}
POP {LR}
BL SQ
B ENDL
BL SQ
BX LR
xxxxxxxx 0x200002000x200001FC0x200001F8
MOV R0,#2BL QUAD
BX LR
MUL R0,R0
0x10R0
PC 0x08000158LRSP 0x200001FC
0x08000158
0x08000140
SQ
QUAD
41
0x0800014C0x08000150
0x08000140
0x08000148
0x080001540x08000158
0x080001380x0800013C
0x08000144
0x0800015C
![Page 42: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/42.jpg)
Example: R0 = R04MOV R0,#2
BL QUAD
B ENDL
SQMUL R0,R0
BX LR
QUAD PUSH {LR}
BL SQ
BL SQ
POP {LR}
BX LR
ENDL ...
PUSH {LR}
POP {LR}
BL SQ
B ENDL
BL SQ
BX LR
xxxxxxxx 0x200002000x200001FC0x200001F8
MOV R0,#2BL QUAD
BX LR
MUL R0,R0
0x10R0
PC 0x0800015CLRSP 0x20000200
0x08000140 SQ
QUAD
42
RecoverLink Register (LR)
0x0800014C0x08000150
0x08000140
0x08000148
0x080001540x08000158
0x080001380x0800013C
0x08000144
0x0800015C
0x08000140
![Page 43: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/43.jpg)
Example: R0 = R04MOV R0,#2
BL QUAD
B ENDL
SQMUL R0,R0
BX LR
QUAD PUSH {LR}
BL SQ
BL SQ
POP {LR}
BX LR
ENDL ...
PUSH {LR}
POP {LR}
BL SQ
B ENDL
BL SQ
BX LR
xxxxxxxx 0x200002000x200001FC0x200001F8
MOV R0,#2BL QUAD
BX LR
MUL R0,R0
0x10R0
PC 0x08000140LRSP 0x20000200
0x08000140
0x08000140
SQ
QUAD
43
0x0800014C0x08000150
0x08000140
0x08000148
0x080001540x08000158
0x080001380x0800013C
0x08000144
0x0800015C
![Page 44: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/44.jpg)
Initializing the stack pointer (SP)
44
• Before using the stack, software has to define stack space and initialize the stack pointer (SP).• The assembly file startup.s defines
stack space and initialize SP.
![Page 45: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/45.jpg)
Example: R0 = R04
PUSH {LR}
POP {LR}
BL SQ
B ENDL
BL SQ
BX LR
0x20000200
0x200001FC
0x200001F8
MOV R0,#2
BL QUAD
BX LR
MUL R0,R0
R0
PCLRSP
SQ
QUAD
45
0x0800014C
0x08000150
0x08000140
0x08000148
0x08000154
0x08000158
0x08000138
0x0800013C
0x08000144
0x0800015CFind PC, LR, and SP values as you execute each line of code. What is happening?
STACK
RETURN ADDRESSNext Instruction
Top of the Stack
ENDL
![Page 46: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/46.jpg)
Example: R0 = R04
PUSH {LR}
POP {LR}
BL SQ
B ENDL
BL SQ
BX LR
0x20000200
8000140 0x200001FC
0x200001F8
MOV R0,#2
BL QUAD
BX LR
MUL R0,R0
R0
PCLR
200001F8SP
SQ
QUAD
46
0x0800014C
0x08000150
0x08000140
0x08000148
0x08000154
0x08000158
0x08000138
0x0800013C
0x08000144
0x0800015CFind PC, LR, and SP values as you execute each line of code. What is happening?
STACK
RETURN ADDRESSNext Instruction
Top of the Stack
ENDL
![Page 47: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/47.jpg)
Let’s practice a little more….
![Page 48: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/48.jpg)
Using Push & Pop
![Page 49: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/49.jpg)
Calling a Subroutine• Note that R0 and R1 can be
used as the arguments • PUSH and POP can be used
to store the values
![Page 50: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/50.jpg)
Calling a Subroutine from a different source file (sum3.s) from the __main
![Page 51: Chapters 8 Stacks and Subroutines...Subroutine lA subroutineis a block of code that is calledfrom different places from within a main program or other subroutines. lSaves code space](https://reader030.vdocuments.us/reader030/viewer/2022040112/5e9048cdd891e85cec081c83/html5/thumbnails/51.jpg)
Practice
• Find PC, LR, and SP values as you execute each line of code. What is happening?
InstructionLocation PC LR SP