Subroutine calls require two steps on an ARM architecture:
- store the current pc, i.e. the return address
- branch to the address of the required subroutine
Both steps are carried out in one instruction, where the return address is stored in the link register (lr/r14) and the branch to the target address takes place. Returning means branching to the address stored in lr.