The link register (R14 or LR) is used to store the return address when a function or subroutine is called. It helps the processor know where to go back after finishing the function.
Link register (R14/LR) in ARM Architecture
BL label ; Branch with link to 'label', saves return address in LR MOV PC, LR ; Return from function by jumping to address in LR
BL instruction saves the next instruction address in LR before jumping.
To return from a function, the program counter (PC) is set to the value in LR.
BL my_function ; LR now holds address after BL instruction
MOV PC, LR ; Return to the instruction after the function call
PUSH {LR}
; Save LR on stack before calling another functionPOP {LR}
MOV PC, LR
; Restore LR and return from functionThis program calls 'function' using BL, which saves the return address in LR. The function sets R0 to 42 and returns by moving PC to LR. After returning, the program sets R0 to 0 and ends.
start:
BL function
; After function returns, continue here
MOV R0, #0
B end
function:
; Do some work here
MOV R0, #42
MOV PC, LR
end:
; Program endLR is automatically updated by BL and BLX instructions.
Always save LR if you call another function inside your function to avoid losing the return address.
Using LR helps avoid using memory for return addresses, making function calls faster.
The link register (R14/LR) stores the return address during function calls.
BL instruction saves the return address in LR before jumping.
Returning from a function is done by moving PC to LR.
Practice
Solution
Step 1: Understand the role of the link register
The link register (R14/LR) is specifically designed to hold the return address when a function call is made.Step 2: Differentiate from other registers
Other registers like the program counter hold the current instruction, and the stack pointer manages the stack, but LR stores the return address.Final Answer:
To store the return address during function calls -> Option DQuick Check:
Link register = return address storage [OK]
- Confusing LR with the program counter
- Thinking LR stores general data
- Mixing LR with stack pointer
Solution
Step 1: Identify the instruction for function calls
The BL (Branch with Link) instruction branches to a function and saves the return address in LR.Step 2: Understand other instructions
MOV moves data, ADD adds values, and STR stores data to memory; none save return addresses.Final Answer:
BL -> Option AQuick Check:
BL saves return address in LR [OK]
- Choosing MOV as it moves data
- Confusing STR with saving return address
- Thinking ADD saves addresses
BL function
...
function:
MOV R0, #5
BX LRWhat happens when the instruction
BX LR executes?Solution
Step 1: Understand what BL does
BL saves the return address (next instruction after BL) into LR and jumps to 'function'.Step 2: Analyze BX LR instruction
BX LR branches to the address stored in LR, which is the return address after BL.Final Answer:
The program jumps back to the instruction after BL -> Option AQuick Check:
BX LR returns to caller address [OK]
- Thinking BX LR jumps to function start
- Assuming program halts on BX LR
- Believing BX LR jumps to random address
BL function
...
function:
MOV R0, #10
MOV PC, R0Solution
Step 1: Check the return method
To return from a function, the program must jump to the address in LR, not to a fixed value in R0.Step 2: Identify the problem with MOV PC, R0
MOV PC, R0 sets the program counter to 10, which is not a valid return address, causing incorrect behavior.Final Answer:
MOV PC, R0 does not return to caller correctly -> Option BQuick Check:
Return must use LR, not arbitrary register [OK]
- Thinking BL is invalid
- Assuming MOV R0, #10 is wrong
- Ignoring the need to use LR for return
Solution
Step 1: Understand function call with BL
BL saves the return address in LR and branches to the called function.Step 2: Understand correct return instruction
Returning is done by branching to LR using BX LR, which jumps back to the saved return address.Step 3: Evaluate other options
B does not save return address in LR; MOV PC, R0 returns to wrong place; BX R14 is equivalent to BX LR but using B (not BL) means LR is not saved.Final Answer:
Use BL to call the function, then return with BX LR -> Option CQuick Check:
BL + BX LR = correct call and return [OK]
- Using B instead of BL for calls
- Returning with MOV PC, R0 instead of BX LR
- Confusing BX R14 and BX LR usage
Ready to prove it?
Pass the test and this pattern moves unknown
