C 语言和 ARM 汇编 - 11 函数调用

C 语音的函数调用,转换成汇编是用 “bl” 这个指令,当这个指令执行的时候,将下一个返回地址寄存器 lr 保存到堆栈,然后将控制权转移到被调用的函数上。函数返回的时候,通过从堆栈返回之前保存的 lr 到 pc。编译器需要小心处理堆栈数据,才能正确的返回。

例子

void fun()
{
    int x = 0;
    x++;
}
int main()
{
    fun();
}

汇编代码

fun:
    sub sp, sp, #8
    movs    r3, #0
    str r3, [sp, #4]
    ldr r3, [sp, #4]
    adds    r3, r3, #1
    str r3, [sp, #4]
    add sp, sp, #8
    @ sp needed
# 跳回到返回地址
    bx  lr
main:
# lr 寄存器入栈
    push    {r3, lr}
# 调用函数,下一个指令保存到 lr
    bl  fun
    mov r0, r3
# 恢复使用的 r3 寄存器,恢复 lr 寄存器到 pc
    pop {r3, pc}