Keil™, An ARM® Company

RealView Assembler User's Guide

Calling subroutines

2.3.3. Calling subroutines

To call subroutines, use a branch and link instruction. The syntax is:

    BL  destination

where destination 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.

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.

Note

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, on the ARM website for more information.

Example 2.2 shows a subroutine that adds the values of two parameters and returns a result in r0.

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
Copyright © 2007 ARM Limited. All rights reserved.ARM DUI 0379A