Repeated Task (Different Data)
……
LOOP LDR R3,[R2],#4 ADD R0,R0,R3 SUBS R1,R1,#1 BGT LOOP
…………
LOOP LDR R3,[R2],#4 ADD R0,R0,R3 SUBS R1,R1,#1 BGT LOOP
…………
LOOP LDR R3,[R2],#4 ADD R0,R0,R3 SUBS R1,R1,#1 BGT LOOP
…………
LOOP LDR R3,[R2],#4 ADD R0,R0,R3 SUBS R1,R1,#1 BGT LOOP
……
LOOP LDR R3,[R2],#4 ADD R0,R0,R3 SUBS R1,R1,#1 BGT LOOP
…………
LOOP LDR R3,[R2],#4 ADD R0,R0,R3 SUBS R1,R1,#1 BGT LOOP
…………
LOOP LDR R3,[R2],#4 ADD R0,R0,R3 SUBS R1,R1,#1 BGT LOOP
…………
LOOP LDR R3,[R2],#4 ADD R0,R0,R3 SUBS R1,R1,#1 BGT LOOP
……
……
LOOP LDR R3,[R2],#4 ADD R0,R0,R3 SUBS R1,R1,#1 BGT LOOP
…………
LOOP LDR R3,[R2],#4 ADD R0,R0,R3 SUBS R1,R1,#1 BGT LOOP
…………
LOOP LDR R3,[R2],#4 ADD R0,R0,R3 SUBS R1,R1,#1 BGT LOOP
…………
LOOP LDR R3,[R2],#4 ADD R0,R0,R3 SUBS R1,R1,#1 BGT LOOP
Special Branch
…………
……
……
…………
……
…………
…………
……
…………
……
……
…………
……
……
CALL {parameters to SUBROUTINE}
RETURN (result to CALLER)
………..
LOOP LDR R3,[R2],#4 ADD R0,R0,R3 SUBS R1,R1,#1 BGT LOOP
………..
SUBROUTINE
Instructions
Fig. 2.16 Caller and Callee
Or Use Stack Frame
2
1 3
2.7.2 Parameter Passing
• Parameter passing:
• Information exchange to/from a subroutine
• Different input => subroutine => different results
• Complete Solution: using stack for
• Parameters
• Local variables in subroutine
• Saving registers
• Return address
Fig. 2.20 Stack Frame Layout
(stack pointer)SP
(frame pointer)FP
saved [R1]
saved [R0]
Stack frame calledfor subroutine Return address
localvar3 localvar2 localvar1 saved [FP]
Old TOS param2
param1
param3 param4
(top-of-stack)
A local base reference to access elements of current Stack Frame
A global reference point to push/pop stack
R0 and R1 are used by the current subroutine; original values of R0 and R1 must be saved before execution
Local variables for current subroutine
Parameter passing
Call Process (re: Fig. 2.20)
Caller:
1. Pass 4 parameters
a. Push 4 parameters Processor:
2. Call instruction executed
a. Return address on stack (↑SP) Subroutine:
3. FP is a GP register and saved on stack by
a. Move FP,-(SP) ; auto-decrement: R=R-WordSize first b. Move SP,FP ; ↑SP = ↑FP = old[FP]
4. Allocate local variables space a. Subtract #12,SP
5. Use R2, R1 so save on stack; ↑SP = old[R1]
Return Process (re: Fig. 2.20)
Subroutine:
6. Before Return:
a. Pop R0, R1
b. Add #12,SP; remove local variables c. Pop old[FP] back to FP
; ↑SP = return address
Processor:
7. Return instruction executed
Caller:
8. After Return:
a. Pop parameters; ↑SP = old TOS
Fig. 2.20 Stack Layout-Call-A
SP (stack pointer)
(frame pointer)FP
saved [R1]
saved [R0]
Stack frame calledfor subroutine Return address
localvar3 localvar2 localvar1 saved [FP]
Old TOS param2
param1
param3 param4
(top-of-stack)
CC-0
CC=Caller Call
SC=Sub Call
Fig. 2.20 Stack Layout-Call-B
(stack pointer)SP
(frame pointer)FP
saved [R1]
saved [R0]
Stack frame calledfor subroutine Return address
localvar3 localvar2 localvar1 saved [FP]
Old TOS param2
param1
param3 param4
(top-of-stack)
CC-1a
1. Pass 4 parameters
a. Push 4 parameters
CC=Caller Call SC=Sub Call
→ Stack Pointer
Fig. 2.20 Stack Layout-Call-C
(stack pointer)SP
(frame pointer)FP
saved [R1]
saved [R0]
Stack frame calledfor subroutine Return address
localvar3 localvar2 localvar1 saved [FP]
Old TOS param2
param1
param3 param4
(top-of-stack)
CC-Call 2a
2. Call instruction executed
a. Return address on stack (↑SP)
CC=Caller Call
SC=Sub Call
Fig. 2.20 Stack Layout-Call-D
SP (stack pointer)
(frame pointer)FP
saved [R1]
saved [R0]
Stack frame calledfor subroutine Return address
localvar3 localvar2 localvar1 saved [FP]
Old TOS param2
param1
param3 param4
(top-of-stack)
SC-3a
3. FP is a GP register and saved on stack by
a. Move FP,-(SP) ; auto- decrement
CC=Caller Call SC=Sub Call
→ Stack Pointer
Fig. 2.20 Stack Layout-Call-E
SP (stack pointer)
(frame pointer)FP
saved [R1]
saved [R0]
Stack frame calledfor subroutine Return address
localvar3 localvar2 localvar1 saved [FP]
Old TOS param2
param1
param3 param4
(top-of-stack)
SC-3b SC-3b
3. FP is a GP register and saved on stack by (make FP=SP)
b. Move SP,FP ;
↑SP = ↑FP = old[FP]
CC=Caller Call
SC=Sub Call
Fig. 2.20 Stack Layout-Call-F
(stack pointer)SP
FP (frame pointer)
saved [R1]
saved [R0]
Stack frame calledfor subroutine Return address
localvar3 localvar2 localvar1 saved [FP]
Old TOS param2
param1
param3 param4
(top-of-stack)
SC-4a
SC-3b
4. Allocate local variables space a. Subtract #12,SP
CC=Caller Call SC=Sub Call
→ Stack Pointer; → Frame Pointer
Fig. 2.20 Stack Layout-Call-G
(stack pointer)SP
FP (frame pointer)
saved [R1]
saved [R0]
Stack frame calledfor subroutine Return address
localvar3 localvar2 localvar1 saved [FP]
Old TOS param2
param1
param3 param4
(top-of-stack)
SC-5
SC-3b
5. Use R1, R0 so save on stack;
↑SP = old[R1] = saved[R1]
CC=Caller Call
SC=Sub Call
Return Process (re: Fig. 2.20)
Subroutine:
6. Before Return:
a. Pop R0, R1
b. Add #12,SP; remove local variables c. Pop old[FP] back to FP
; ↑SP = return address
Processor:
7. Return instruction executed
Caller:
8. After Return:
a. Pop parameters; ↑SP = old TOS
Fig. 2.20 Stack Layout-Return-A
(stack pointer)SP
(frame pointer)FP
saved [R1]
saved [R0]
Stack frame calledfor subroutine Return address
localvar3 localvar2 localvar1 saved [FP]
Old TOS param2
param1
param3 param4
(top-of-stack)
SR-6a
SC-3b
6. Before Return:
a. Pop R1, R0; original values
CR=Caller Return
SR=Sub Return
Fig. 2.20 Stack Layout-Return-B
SP (stack pointer)
(frame pointer)FP
saved [R1]
saved [R0]
Stack frame calledfor subroutine Return address
localvar3 localvar2 localvar1 saved [FP]
Old TOS param2
param1
param3 param4
(top-of-stack)
SR-6b SC-3b 6. Before Return:
b. Add #12,SP; remove local variables
CR=Caller Return SR=Sub Return
→ Stack Pointer; → Frame Pointer
Fig. 2.20 Stack Layout-Return-C
(stack pointer)SP
FP (frame pointer)
saved [R1]
saved [R0]
Stack frame calledfor subroutine Return address
localvar3 localvar2 localvar1 saved [FP]
Old TOS param2
param1
param3 param4
(top-of-stack)
SR-6c
6. Before Return:
c. Pop old[FP] back to FP ;
↑SP = return address
CR=Caller Return
SR=Sub Return
Fig. 2.20 Stack Layout-Return-D
(stack pointer)SP
(frame pointer)FP
saved [R1]
saved [R0]
Stack frame calledfor subroutine Return address
localvar3 localvar2 localvar1 saved [FP]
Old TOS param2
param1
param3 param4
(top-of-stack)
7
7. Return instruction executed
CR=Caller Return SR=Sub Return
→ Stack Pointer
Fig. 2.20 Stack Layout-Return-E
(stack pointer)SP
(frame pointer)FP
saved [R1]
saved [R0]
Stack frame calledfor subroutine Return address
localvar3 localvar2 localvar1 saved [FP]
Old TOS param2
param1
param3 param4
(top-of-stack)
CR-8
8. After Return:
a. Pop parameters;
↑SP = old TOS
CR=Caller Return
SR=Sub Return
2.7.1 Subroutine Nesting
• Subroutine nesting:
• A subroutine is allowed to call another subroutine
• Link register
• Has next address of first call
• Overwritten after subsequent calls
Subroutine #1 Subroutine #2
Link Register
Subroutine #3 1.1 Return Address.1
1.2 Call Sub #2
2.1 Return Address.2 2.2 Call Sub #3
Return.1 <= Return.2
Return.1
Subroutine Nesting using Stack
• Saves return address on stack before call
• Restores link register (pop from stack) after return from subroutine
Subroutine #1 Subroutine #2
Return.2
Subroutine #3 1.1 Ret Add
2.1 Ret Add
Return.1 XXXXXXX
1.2 2.2
Link Register Link Register Return from 3 Return from 2
STACK SP.1 —>
SP.2 —>
SP.3 —>
Example: Nested Subroutines Program
Main program .. .
2000 Move PARAM2, (SP) Place parameterson stack.
2004 Move PARAM1, (SP)
2008 Call SUB1
2012 Move (SP),RESULT Store result.
2016 Add #8,SP Restorestack level.
2020 next instruction .. .
–
–
Nested Subroutines Sub-1
2100 SUB1 Move FP, (SP) Save frame pointer register.
2104 Move SP,FP Load the frame pointer.
2108 MoveMultiple R0 R3, (SP) Save registers.
2112 Move 8(FP),R0 Get first parameter.
Move 12(FP),R1 Get secondparameter.
.. .
Move PARAM3, (SP) Placea parameteron stack.
2160 Call SUB2
2164 Move (SP)+,R2 Pop SUB2 result into R2.
.. .
Move R3,8(FP) Placeansweron stack.
MoveMultiple (SP)+,R0 R3 Restoreregisters.
Move (SP)+,FP Restoreframe pointer register.
Return Return to Main program.
–
– –
–
–
Nested Subroutines Sub-2
3000 SUB2 Move FP, (SP) Save frame pointer register.
Move SP,FP Load the frame pointer.
MoveMultiple R0 R1, (SP) Save registersR0 and R1.
Move 8(FP),R0 Get the parameter.
.. .
Move R1,8(FP) Place SUB2 result on stack.
MoveMultiple (SP)+,R0 R1 RestoreregistersR0 and R1.
Move (SP)+,FP Restoreframe pointer register.
Return Return to Subroutine 1.
–
– –
–
Nested Subroutines Stack Frames
FP
FP
[FP] from SUB1 2164
Stack frame firstfor subroutine [R0] from Main
param3 [R3] from Main [R2] from Main [R1] from Main
Old TOS 2012
[FP] from Main
param1 param2 [R0] from SUB1 [R1] from SUB1
Stack frame secondfor subroutine