A subroutine is a block of code that performs a task based on some arguments and optionally
returns a result. By convention, you use registers R0 to R3 to pass arguments to
subroutines, and R0 to pass a result back to the callers. A subroutine that requires more
than four inputs uses the stack for the additional inputs.
To call subroutines, use a branch and link instruction. The
the label on the first instruction of the subroutine.
can also be a
- Places the return address in the link register.
- Sets the PC to the address of the subroutine.
After the subroutine code has executed you can use a
BX LR instruction to
NoteCalls between separately assembled or compiled modules must
comply with the restrictions and conventions defined by the Procedure Call Standard for the
The following example shows a subroutine,
doadd, that adds the values of
two arguments and returns a result in
AREA subrout, CODE, READONLY ; Name this block of code
ENTRY ; Mark first instruction to execute
start MOV r0, #10 ; Set up parameters
MOV r1, #3
BL doadd ; Call subroutine
stop MOV r0, #0x18 ; angel_SWIreason_ReportException
LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit
SVC #0x123456 ; ARM semihosting (formerly SWI)
doadd ADD r0, r0, r1 ; Subroutine code
BX lr ; Return from subroutine
END ; Mark end of file