ach*_*ora 7 assembly arm instruction-set cpu-architecture
我最近遇到了链接寄存器和叶函数的概念.
我从之前的SO读取中了解到,LR告诉代码在执行过程中的位置.我还知道叶子函数是一个函数,它位于函数调用层次结构的末尾.
链接寄存器支持快速叶函数调用.
为什么这个说法属实? 我查看了ARMARM(架构参考手册),链接寄存器的信息很少.
在某些体系结构(例如 x86、x86_64)上,函数的返回地址始终存储在堆栈中,调用函数意味着访问主内存:
调用时写入堆栈;
返回时从堆栈读取。
相反,如果您的架构/ABI 可以在不使用主内存的情况下跳转/返回,并且被调用者的参数和返回值也可以在寄存器中传递,则可以在不涉及 RAM 的情况下完成叶函数的调用和返回。
如果叶子函数足够简单,它可能会在不接触 RAM 的情况下执行:
int callee(int a, int b)
{
return a + b;
}
int caller(int a, int b, int c, int d)
{
return callee(a,b) + calle(c,d);
}
Run Code Online (Sandbox Code Playgroud)
给出(每个函数由 单独编译clang -target arm-eabi -S -o- -O3
):
callee:
add r0, r1, r0
bx lr
caller:
.save {r4, r5, r6, r10, r11, lr}
push {r4, r5, r6, r10, r11, lr}
.setfp r11, sp, #16
add r11, sp, #16
mov r4, r3
mov r5, r2
bl callee
mov r6, r0
mov r0, r5
mov r1, r4
bl callee
add r0, r0, r6
pop {r4, r5, r6, r10, r11, lr}
bx lr
Run Code Online (Sandbox Code Playgroud)
caller
请注意我们如何避免访问和 的核心中的内存calee
。