Bird
Raised Fist0
ARM Architectureknowledge~10 mins

Branch and link (BL) for subroutines in ARM Architecture - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Branch and link (BL) for subroutines
Start Execution
↓
Encounter BL instruction
↓
Save return address in LR
↓
Jump to subroutine address
↓
Execute subroutine instructions
↓
Return using LR
↓
Continue main program
The BL instruction saves the return address, jumps to the subroutine, and later returns to continue the main program.
Execution Sample
ARM Architecture
BL subroutine_address
...
subroutine_address:
  ; subroutine code
  BX LR
This code calls a subroutine using BL, which saves the return address and jumps to the subroutine, then returns using BX LR.
Analysis Table
StepInstructionActionLR (Link Register)PC (Program Counter)Notes
1BL subroutine_addressSave return address (PC+4) to LR, jump to subroutinePC+4subroutine_addressPrepare to call subroutine
2subroutine instructionsExecute subroutine codePC+4subroutine_address + offsetRunning subroutine
3BX LRBranch to address in LR (return)PC+4PC+4Return to instruction after BL
4Next instruction after BLContinue main programPC+4PC+8Execution resumes
💡 Return to main program after subroutine finishes using LR
State Tracker
RegisterStartAfter BLDuring SubroutineAfter BX LR
LRundefinedAddress of next instruction after BLunchangedunchanged
PCstart addresssubroutine_addressadvances through subroutinereturn address (after BL)
Key Insights - 3 Insights
Why does BL save PC-4 in LR instead of PC?
BL saves PC+4 because PC points to the current instruction plus 8 bytes in ARM, so PC+4 points to the next instruction after BL, ensuring correct return (see execution_table step 1).
How does the program know where to return after the subroutine?
The return address is stored in LR by BL, and the subroutine uses BX LR to jump back (see execution_table steps 1 and 3).
What happens if BX LR is missing in the subroutine?
Without BX LR, the program won't return to the main code, causing incorrect execution flow or crash (no return in execution_table).
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what value does LR hold immediately after the BL instruction?
AThe address of the instruction after BL (PC+4)
BThe address of the subroutine
CThe current PC value
DZero
💡 Hint
Check execution_table row 1 under LR column.
At which step does the program jump back to the main code after the subroutine?
AStep 1
BStep 2
CStep 3
DStep 4
💡 Hint
Look for the BX LR instruction in execution_table.
If the BL instruction did not save the return address in LR, what would happen?
AThe subroutine would execute and return normally
BThe program would jump to a random address on return
CThe program would continue sequentially without jumping
DThe subroutine would never be called
💡 Hint
Consider the role of LR in execution_table steps 1 and 3.
Concept Snapshot
BL instruction saves the return address (next instruction) in LR.
It then jumps to the subroutine address.
Subroutine executes and returns using BX LR.
This allows the program to resume after the call.
BL is essential for function calls in ARM.
Full Transcript
The Branch and Link (BL) instruction in ARM saves the address of the instruction following BL into the Link Register (LR). It then jumps to the subroutine address specified. The subroutine executes its instructions and returns control to the main program by branching to the address stored in LR using the BX LR instruction. This mechanism allows the program to call functions or subroutines and return correctly to continue execution. The LR holds the return address, and the PC changes to the subroutine address during the call. Without saving the return address, the program would not know where to return after the subroutine finishes.

Practice

(1/5)
1. What does the BL instruction do in ARM architecture?
easy
A. It jumps to a subroutine and saves the return address in the link register.
B. It loads a value into a register.
C. It performs a bitwise AND operation.
D. It returns from a subroutine without saving the return address.

Solution

  1. Step 1: Understand the purpose of BL

    The BL instruction is used to jump to a subroutine while saving the return address.
  2. Step 2: Identify where the return address is saved

    The return address is saved in the link register (LR) to allow returning after the subroutine finishes.
  3. Final Answer:

    It jumps to a subroutine and saves the return address in the link register. -> Option A
  4. Quick Check:

    BL saves return address in LR [OK]
Hint: BL jumps and saves return address in LR [OK]
Common Mistakes:
  • Confusing BL with simple jump instructions
  • Thinking BL does not save return address
  • Mixing BL with data load instructions
2. Which of the following is the correct syntax to return from a subroutine in ARM assembly?
easy
A. BX PC
B. MOV PC, LR
C. BX LR
D. BL LR

Solution

  1. Step 1: Identify the instruction to return from subroutine

    Returning from a subroutine requires branching to the address stored in the link register (LR).
  2. Step 2: Choose the correct instruction

    The instruction BX LR branches to the address in LR, effectively returning control.
  3. Final Answer:

    BX LR -> Option C
  4. Quick Check:

    Return uses BX LR [OK]
Hint: Return with BX LR to jump back [OK]
Common Mistakes:
  • Using BX PC instead of BX LR
  • Confusing BL with return instruction
  • Using MOV PC, LR which is valid but less common
3. Consider this ARM assembly snippet:
BL subroutine
MOV R0, #0
B end
subroutine:
MOV R0, #1
BX LR
end:

What value will register R0 hold after execution?
medium
A. 1
B. 0
C. Undefined
D. The program will crash

Solution

  1. Step 1: Follow the BL instruction

    The BL instruction jumps to subroutine and saves the return address (address of MOV R0, #0) in LR.
  2. Step 2: Execute subroutine and return

    Inside subroutine, MOV R0, #1 sets R0 to 1, then BX LR returns to MOV R0, #0.
  3. Step 3: Continue after BL

    MOV R0, #0 overwrites R0 to 0, followed by B end.
  4. Final Answer:

    0 -> Option B
  5. Quick Check:

    Post-return MOV R0, #0 overwrites subroutine value [OK]
Hint: BL returns to next instr MOV R0, #0 overwriting subroutine's R0=1 [OK]
Common Mistakes:
  • Assuming R0 remains 1 after subroutine return
  • Misidentifying the BL return address
  • Thinking instructions after BL are skipped
4. Identify the error in this ARM assembly code snippet:
BL subroutine
MOV R0, #5
B end
subroutine:
MOV R0, #10
BX PC
end:
medium
A. No error; code is correct.
B. BL instruction is missing a label.
C. MOV R0, #5 should be before BL.
D. Using BX PC instead of BX LR to return causes incorrect return.

Solution

  1. Step 1: Check return instruction in subroutine

    The subroutine uses BX PC to return, which branches to the current PC, not the saved return address.
  2. Step 2: Understand correct return usage

    Correct return uses BX LR to jump back to the caller address saved by BL.
  3. Final Answer:

    Using BX PC instead of BX LR to return causes incorrect return. -> Option D
  4. Quick Check:

    Return must use BX LR, not BX PC [OK]
Hint: Return with BX LR, not BX PC [OK]
Common Mistakes:
  • Using BX PC to return from subroutine
  • Ignoring the link register usage
  • Assuming BL needs no label
5. You want to call two subroutines in sequence using BL instructions. Which sequence correctly preserves the return addresses so both subroutines return properly?
hard
A. Use BL to first subroutine, then BL to second subroutine inside the first subroutine before returning.
B. Use BL to first subroutine, then BL to second subroutine without returning from the first.
C. Use two BL instructions one after another without returning in between.
D. Use BX LR to call subroutines instead of BL.

Solution

  1. Step 1: Understand BL saves return address in LR

    Each BL saves the return address in LR, so calling BL twice in a row overwrites LR.
  2. Step 2: Preserve return addresses by nesting calls

    Calling the second BL inside the first subroutine preserves the first return address until both return.
  3. Step 3: Avoid overwriting LR by sequential BL calls without return

    Calling BL twice in sequence without returning overwrites LR, losing the first return address.
  4. Final Answer:

    Use BL to first subroutine, then BL to second subroutine inside the first subroutine before returning. -> Option A
  5. Quick Check:

    Nest BL calls to preserve return addresses [OK]
Hint: Nest BL calls to keep return addresses safe [OK]
Common Mistakes:
  • Calling BL twice in a row without nesting
  • Using BX LR to call subroutines
  • Ignoring LR overwrite on multiple BL calls
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard