0
0
ARM Architectureknowledge~10 mins

Nested subroutine calls in ARM Architecture - Step-by-Step Execution

Choose your learning style9 modes available
Concept Flow - Nested subroutine calls
Start main
Call subroutine A
subroutine A starts
Call subroutine B
subroutine B starts
subroutine B ends
Return to subroutine A
subroutine A ends
Return to main
Program ends
The main program calls subroutine A, which calls subroutine B. Each subroutine runs and returns control back to its caller in order.
Execution Sample
ARM Architecture
main:
  BL subA
  ; continue main

subA:
  BL subB
  BX LR

subB:
  BX LR
Main calls subA, subA calls subB, then returns back step-by-step.
Analysis Table
StepInstructionActionCall StackReturn Address
1BL subACall subA, save return to main+4[main]main+4
2BL subBCall subB, save return to subA+4[main, subA]subA+4
3BX LR (in subB)Return to subA at subA+4[main, subA]subA+4
4BX LR (in subA)Return to main at main+4[main]main+4
5Main continuesProgram continues after subA call[]
💡 All subroutines returned; call stack empty; main resumes and program ends.
State Tracker
Call StackStartAfter Step 1After Step 2After Step 3After Step 4Final
Stack Frames[][main][main, subA][main, subA][main][]
Key Insights - 3 Insights
Why does the call stack grow when subA calls subB?
Because each BL instruction saves the return address on the stack before jumping, as shown in execution_table step 2 where subB is called and the stack becomes [main, subA].
How does the program know where to return after subB finishes?
The return address saved by BL in step 2 is used by BX LR in step 3 to jump back to subA at subA+4, as shown in the call stack and return address columns.
What happens if BX LR is missing in a subroutine?
The program would not return to the caller, causing incorrect flow or crash. The execution_table shows BX LR instructions at steps 3 and 4 ensure proper returns.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at step 2, what is the call stack after BL subB?
A[subA]
B[main]
C[main, subA]
D[]
💡 Hint
Refer to the 'Call Stack' column in execution_table row for step 2.
At which step does the program return from subB to subA?
AStep 1
BStep 3
CStep 4
DStep 5
💡 Hint
Check the 'Action' column for when BX LR in subB returns to subA.
If the BL instruction at step 1 was removed, what would happen?
AsubA would not be called; main continues without subA
BsubB would be called directly
CProgram would crash immediately
DsubA would run twice
💡 Hint
Look at step 1 where BL subA causes the call; removing it means no call to subA.
Concept Snapshot
Nested subroutine calls use BL (Branch with Link) to jump and save return address.
Each call adds a return address to the call stack.
Subroutines return using BX LR to jump back.
Calls can be nested; returns unwind the stack step-by-step.
Proper return instructions are essential to maintain flow.
Full Transcript
This visual trace shows how nested subroutine calls work in ARM architecture. The main program calls subroutine A using BL, which saves the return address and jumps to subA. Then subA calls subB similarly. Each call adds a frame to the call stack. When subB finishes, it returns to subA using BX LR, which uses the saved return address. Then subA returns to main the same way. The call stack grows and shrinks as calls and returns happen, ensuring the program continues correctly. Missing return instructions would break this flow.