我正在做一个需要我从llvm ir生成asm代码的项目。当我使用llc直接从.ll文件生成代码时,程序集没有帧指针fp。但是,当我使用riscv-unknow-elf-gcc编译.cpp文件时,它确实有帧指针。在网上搜索,我发现编译时有-fomit-frame-pointer参数。我只是认为riscv asm不需要帧指针,因为我们实际上知道函数帧的开始和结束。使用帧指针来表示堆栈变量与使用堆栈指针sp没有区别。
llc
.ll
fp
.cpp
-fomit-frame-pointer
sp
xlpyo6sf1#
不,在MIPS或RISC V中,对于普通函数调用和返回,帧指针不是严格必需的。不过,如果您想要支援堆栈回溯,它会很有帮助,不过在某些其他环境中,静态数据会提供堆栈回溯所需的信息,而不需要在执行阶段使用框架指标。如果您希望能够掷回和拦截例外状况(视语言而定),通常需要堆栈回溯。一些教授MIPS或RISC V的教师希望您学习帧指针的概念,因为它通常用于x86 -然而,在x86上,由于指令集的特殊性,有时会使用帧指针。也就是说,频繁的压栈和弹出会使堆栈相对于移动的堆栈指针比不移动的帧指针更难跟踪,并且,而且,指令集默认两个寄存器使用堆栈段寄存器,即帧指针寄存器和堆栈指针寄存器,而原始x86也没有SP +偏移寻址,只有BP(帧指针)+偏移。因此,出于上述所有原因,一些MIPS和RISC V教学材料讲授帧指针概念。
1条答案
按热度按时间xlpyo6sf1#
不,在MIPS或RISC V中,对于普通函数调用和返回,帧指针不是严格必需的。
不过,如果您想要支援堆栈回溯,它会很有帮助,不过在某些其他环境中,静态数据会提供堆栈回溯所需的信息,而不需要在执行阶段使用框架指标。
如果您希望能够掷回和拦截例外状况(视语言而定),通常需要堆栈回溯。
一些教授MIPS或RISC V的教师希望您学习帧指针的概念,因为它通常用于x86 -然而,在x86上,由于指令集的特殊性,有时会使用帧指针。也就是说,频繁的压栈和弹出会使堆栈相对于移动的堆栈指针比不移动的帧指针更难跟踪,并且,而且,指令集默认两个寄存器使用堆栈段寄存器,即帧指针寄存器和堆栈指针寄存器,而原始x86也没有SP +偏移寻址,只有BP(帧指针)+偏移。
因此,出于上述所有原因,一些MIPS和RISC V教学材料讲授帧指针概念。