Pointers 为什么在ARM过程调用标准中使用帧指针寄存器是过时的?

Pointers 为什么在ARM过程调用标准中使用帧指针寄存器是过时的?,pointers,arm,call,frame,procedure,Pointers,Arm,Call,Frame,Procedure,我正在阅读ARM程序调用标准: 它说: 仅支持不需要帧指针寄存器的APCS变体。需要帧指针寄存器的APCS变体已经过时。这些变体仅用于向后兼容 有人能告诉我为什么吗?我认为如果堆栈帧大小在编译时未知,则需要帧指针。假设调用约定指定如何在函数退出时清理堆栈,则只需要堆栈指针。编译器可以跟踪函数中的所有堆栈操作,因此不需要将这些信息保存在单独的寄存器中 这当然很方便,但严格来说并不是必需的。为什么在编译时堆栈帧大小未知?使用帧指针的另一个原因是易于编程(和调试编译器),有时指令集的工作方式也适合使

我正在阅读ARM程序调用标准:

它说:

仅支持不需要帧指针寄存器的APCS变体。需要帧指针寄存器的APCS变体已经过时。这些变体仅用于向后兼容


有人能告诉我为什么吗?我认为如果堆栈帧大小在编译时未知,则需要帧指针。

假设调用约定指定如何在函数退出时清理堆栈,则只需要堆栈指针。编译器可以跟踪函数中的所有堆栈操作,因此不需要将这些信息保存在单独的寄存器中


这当然很方便,但严格来说并不是必需的。

为什么在编译时堆栈帧大小未知?使用帧指针的另一个原因是易于编程(和调试编译器),有时指令集的工作方式也适合使用帧指针。arm并不真正需要。@dwelch堆栈上动态大小的数组就是一个很明显的例子。你能提供一些例子吗?例子,
int*p=alloca(var1);int var_arr[var2]当然,这并不是为了编译器的利益——因为正如你所说,它可以跟踪堆栈的使用情况并在函数结束时撤销堆栈——而是为了调试器,调试器不一定知道当前
sp
和当前帧的基部之间的关系。@Marko,编译器可以发出调试信息供调试器执行此操作。