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

2023-12-30

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

我从之前的 SO 读中了解到,LR 告诉代码之前在执行期间的位置。我还知道叶函数是位于函数调用层次结构末尾的函数。

The ARM 维基百科页面说 https://en.wikipedia.org/wiki/ARM_architecture#Instruction_set:

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

为什么这个说法是正确的?我查看了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);
}

给出(每个函数分别由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.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么ARM说“链接寄存器支持快速叶函数调用” 的相关文章

随机推荐