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}