在某些体系结构(例如 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);
}
给出(每个函数分别由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
注意我们如何避免访问核心中的内存caller
and in calee
.