riscv 组装需要帧指针吗?

hny*_*002 0 assembly llvm codegen riscv

我正在开发一个项目,需要我从 llvm ir 生成 asm 代码。

当我使用llc直接从.ll文件生成代码时,程序集没有框架指针fp。但是,当我使用 riscv-unknow-elf-gcc 编译.cpp文件时,它确实有一个帧指针。

网上查了一下,发现-fomit-frame-pointer编译时有参数。

我只是认为对于 riscv asm 来说帧指针是不必要的,因为我们实际上知道函数帧的开始和结束。并且使用帧指针来表示堆栈变量与使用堆栈指针没有区别sp

Eri*_*idt 5

不,在 MIPS 或 RISC V 中,对于普通函数调用和返回来说,帧指针并不是严格必需的。

\n

但是,如果您想支持堆栈展开,它会很有帮助,尽管在其他一些环境中,静态数据提供了堆栈展开所需的信息,而无需在运行时使用帧指针。

\n

如果您希望能够抛出和捕获异常,通常需要堆栈展开,具体取决于语言。

\n
\n

一些教授 MIPS 或 RISC V 的讲师希望您学习帧指针概念,因为它通常在 x86 \xe2\x80\x94 上使用,但是,由于指令集的特殊性,在 x86 上有时会使用帧指针。\xc2\ xa0 即,频繁的压入和弹出操作使得堆栈相对于移动的堆栈指针(与不移动的帧指针相比)更难跟踪,并且指令集默认两个寄存器来使用堆栈段寄存器,即帧指针和栈指针寄存器,而原来的x86也没有sp+偏移量寻址,只有bp(帧指针)+偏移量。

\n
\n

因此,出于上述所有原因,一些 MIPS 和 RISC V 教学材料教授帧指针概念。

\n

  • 顺便说一句,x86-64 代码不会频繁进行推送和弹出操作,并且大多数 x86-64 编译器仅在调试版本中使用 RBP 作为帧指针(如果有的话)。但是,是的,具有 stack-args 调用约定的 32 位模式倾向于将堆栈更多地移到函数内部,并且一些讲师可能不久前学习了他们的 asm,或者从强调帧指针的东西(即使在 64 位代码中)中学习。 (2认同)