ARM架构使用哪个寄存器来记住返回到哪里

请问ARM架构使用哪个寄存器来记住返回到哪里
执行一个方法?
又如何使用此寄存器来控制
程序 可以的话可以提供一个例子吗

ARM架构用lr寄存器保存函数返回地址,下面是一个简单的例子

int add(int a, int b)
{
  return a+b;
}

int main()
{
  int a = 1;
  int b = 2;
  int c = add(a, b);
  return 0;
}
$ gcc -S a.c
        .arch armv6
        .eabi_attribute 28, 1
        .eabi_attribute 20, 1
        .eabi_attribute 21, 1
        .eabi_attribute 23, 3
        .eabi_attribute 24, 1
        .eabi_attribute 25, 1
        .eabi_attribute 26, 2
        .eabi_attribute 30, 6
        .eabi_attribute 34, 1
        .eabi_attribute 18, 4
        .file   "a.c"
        .text
        .align  2
        .global add
        .arch armv6
        .syntax unified
        .arm
        .fpu vfp
        .type   add, %function
add:
        @ args = 0, pretend = 0, frame = 8
        @ frame_needed = 1, uses_anonymous_args = 0
        @ link register save eliminated.
        str     fp, [sp, #-4]!   ; 保存上一层函数的帧指针到栈上
        add     fp, sp, #0       ; 设置当前帧指针
        sub     sp, sp, #12      ; 分配局部变量内存,sp-4: 上一层函数帧指针,sp-8: 局部变量a,sp-12: 局部变量b
        str     r0, [fp, #-8]    ; 把传入的第一个参数(寄存器r0)拷贝到局部变量a
        str     r1, [fp, #-12]   ; 把传入的第二个参数(寄存器r1)拷贝到局部变量b
        ldr     r2, [fp, #-8]    ; 把变量a的值读入到寄存器r2
        ldr     r3, [fp, #-12]   ; 把变量b的值读入到寄存器r3
        add     r3, r2, r3       ; 计算r2+r3,结果保存到r3
        mov     r0, r3           ; 拷贝r3到r0,寄存器r0里的值就是函数的返回值
        add     sp, fp, #0       ; 恢复栈指针
        @ sp needed
        ldr     fp, [sp], #4     ; 恢复帧指针
        bx      lr               ; 函数返回,寄存器lr是返回地址
        .size   add, .-add
        .align  2
        .global main
        .syntax unified
        .arm
        .fpu vfp
        .type   main, %function
main:
        @ args = 0, pretend = 0, frame = 16
        @ frame_needed = 1, uses_anonymous_args = 0
        push    {fp, lr}          ; 把帧指针和函数返回地址压栈
        add     fp, sp, #4        ; 设置帧指针
        sub     sp, sp, #16       ; 在栈上分配局部变量内存
        mov     r3, #1            ;
        str     r3, [fp, #-8]     ; a = 1
        mov     r3, #2
        str     r3, [fp, #-12]    ; b = 2
        ldr     r1, [fp, #-12]    ; 把b的值拷贝到r1,r1是传给子函数的第二个参数
        ldr     r0, [fp, #-8]     ; 把a的值拷贝到r0,r0是传给子函数的第一个参数
        bl      add               ; 调用子函数add,函数返回地址保存到lr寄存器
        str     r0, [fp, #-16]    ; 寄存器r0里的值是函数返回值,把函数返回值拷贝到局部变量c中
        mov     r3, #0
        mov     r0, r3            ; main函数返回值0
        sub     sp, fp, #4        ; 恢复栈指针
        @ sp needed
        pop     {fp, pc}          ; main函数返回
        .size   main, .-main
        .ident  "GCC: (Raspbian 8.3.0-6+rpi1) 8.3.0"
        .section        .note.GNU-stack,"",%progbits

看是32位处理器还是64位了。32位就是lr,64位是r30。