【发布时间】:2013-10-28 19:05:35
【问题描述】:
我正在尝试在 Cortex-M3 处理器(ARMv7-M 架构)上构建调用堆栈,没有操作系统(裸机)。但是,该 ABI 没有帧指针寄存器。因此,当我没有帧指针时,我正在努力生成调用堆栈。
无论在 GCC 中使用-mapcs-frame、-fno-omit-frame-pointer 和-O0 选项,都不会保留帧指针。我想知道是否有不同的 ABI 我可以强制 GCC 使用,所以我有一个帧指针/堆栈帧?如果没有,是否有其他可靠的方法来生成调用堆栈?
提前致谢。
【问题讨论】:
-
为什么调用堆栈需要帧指针寄存器?我很困惑。帧指针寄存器是一种懒惰的解决方案,只需使用堆栈指针,不要浪费另一个寄存器。只需编译一些 C 代码,看看编译器是如何做的,然后模仿它。
-
实际上是带有 armv7m thumb 2 扩展的 thumb(大约 140-150 条附加说明),这意味着您可以使用类似 arm 的解决方案。
-
我不能只使用堆栈指针,因为我不知道调用函数中每个堆栈帧的大小。同样在浪费寄存器方面,GCC 的 ARM 程序集输出非常奇怪,因为它使用寄存器作为堆栈指针的近似副本(尽管我正在使用
-OO进行编译) -
在拇指模式下GCC不使用r7作为FP吗?
-
我不确定,因为它没有可靠的记录(或者我找错地方了!)请参阅我的 cmets 关于 SilverCode 的回答,了解为什么
r7不能用作帧指针。
标签: c arm stack-trace eabi