You copied the Doc URL to your clipboard.

Accessing sp (r13), lr (r14), and pc (r15) in legacy code

The following methods enable you to access the sp, lr, and pc registers correctly in your source code:

Method 1

Use the compiler intrinsics in inline assembly, for example:

void printReg()
    unsigned int spReg, lrReg, pcReg;
        MOV spReg, __current_sp()
        MOV pcReg, __current_pc()
        MOV lrReg, __return_address()
    printf("SP = 0x%X\n",spReg);
    printf("PC = 0x%X\n",pcReg);
    printf("LR = 0x%X\n",lrReg);
Method 2

Use embedded assembly to access physical ARM registers from within a C or C++ source file, for example:

__asm void func()
    MOV r0, lr
    BX lr

This enables the return address of a function to be captured and displayed, for example, for debugging purposes, to show the call tree.


The compiler might also inline a function into its caller function. If a function is inlined, then the return address is the return address of the function that calls the inlined function. Also, a function might be tail called.