乐闻世界logo
搜索文章和话题

ARM : link register and frame pointer

5 个月前提问
4 个月前修改
浏览次数46

1个答案

1

ARM体系结构中的链接寄存器和帧指针

在ARM体系结构中,链接寄存器(Link Register,LR)和帧指针(Frame Pointer,FP)是两个重要的寄存器,它们在函数调用和栈帧管理中发挥着关键作用。

链接寄存器(LR,R14)的作用:

链接寄存器(LR)主要用于存储函数调用时的返回地址。在ARM架构中,当一个函数(称为“调用者”)调用另一个函数(称为“被调用者”)时,返回地址(即调用者中调用指令的下一条指令的地址)会被自动保存到LR寄存器中。这使得被调用者函数执行完毕后可以通过LR寄存器中的地址返回到正确的位置继续执行。

例如,假设有一个函数A调用函数B:

assembly
// 函数A中 BL functionB // BL指令调用函数B,并将返回地址存储到LR中

在函数B中,通常在结束前会有如下指令返回到调用者A:

assembly
MOV PC, LR // 将LR的值移动到程序计数器PC,实现返回调用者

帧指针(FP,R11)的作用:

帧指针(FP)用于定位当前函数的栈帧。在复杂的函数调用中,尤其是当函数有局部变量和需要保存的寄存器时,栈帧提供了一个结构来保存这些信息。FP寄存器指向栈帧的基地址,这使得在函数执行期间能够有效地定位和访问所有局部变量和保存的寄存器。

例如,当进入一个新的函数时,通常会发生以下操作:

assembly
PUSH {FP, LR} // 保存旧的帧指针和链接寄存器 ADD FP, SP, #4 // 设置新的帧指针

在函数退出之前,会恢复FP和LR,并根据需要调整栈指针(SP):

assembly
MOV SP, FP // 恢复栈指针 POP {FP, LR} // 恢复帧指针和链接寄存器,准备返回

通过上述操作,即使在多层函数调用和复杂的调用栈的情况下,每个函数也能准确地访问自己的局部变量,并且能正确地返回到调用它的那个函数。

这种机制使得程序的调试和维护变得更加简单和直观,因为每个函数的执行环境是独立和清晰的。

2024年6月29日 12:07 回复

你的答案