为什么ARM说"链接寄存器支持快速叶函数调用"

ach*_*ora 7 assembly arm instruction-set cpu-architecture

我最近遇到了链接寄存器和叶函数的概念.

我从之前的SO读取中了解到,LR告诉代码在执行过程中的位置.我还知道叶子函数是一个函数,它位于函数调用层次结构的末尾.

ARM维基百科页面称:

链接寄存器支持快速叶函数调用.

为什么这个说法属实? 我查看了ARMARM(架构参考手册),链接寄存器的信息很少.

ysd*_*sdx 2

在某些体系结构(例如 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