| |||
| Home > Writing ARM Assembly Language > Structure of assembly language modules > Calling subroutines | |||
To call subroutines, use a branch and link instruction. The syntax is:
BL destination
where is
usually the label on the first instruction of the subroutine.destination
can
also be a program-relative expression. See B, BL, BX, BLX, and BXJ for more information.destination
The BL instruction:
places the return address in the link register
sets the PC to the address of the subroutine.
After
the subroutine code is executed you can use a BX lr instruction
to return. By convention, registers r0 to r3 are used to pass parameters
to subroutines, and r0 is used to pass a result back to the callers.
Calls between separately assembled or compiled modules must
comply with the restrictions and conventions defined by the procedure
call standard. See the Procedure Call Standard for the
ARM Architecture specification, aapcs.pdf,
in for
more information.install_directory\Documentation\Specifications\...
Example 2.2 shows a
subroutine that adds the values of two parameters and returns a result
in r0. It is supplied as subrout.s in
the main examples directory .
See Code examples for instructions
on how to assemble, link, and execute the example.install_directory\RVDS\Examples
Example 2.2.
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