我们正在开发一个玩具操作系统,作为类作业。 我在编写内核 panic 函数时遇到了一些问题。
它应该保存所有寄存器,调用一些类似 printf 的函数,然后打印保存的寄存器并停止 cpu。现在它被定义为一个宏:
#define panic(...) \
do{ \
asm volatile("SAVE_REGISTERS %1\n\t" : "m="(_panic_context)); \
_panic_printk(&_panic_context, __VA_ARGS__); \
while(0)
_panic_context
是一个全局变量,包含保存的线程寄存器和更多内容。问题出在 SAVE_REGISTERS
上。它是在汇编程序头文件中某处定义的宏,但我不知道如何包含它。文件中的简单#include 显然不起作用。我试过谷歌搜索和写一些有趣和绝望的东西(比如汇编字符串中的#include :-))但没有任何帮助。您有解决此问题的想法吗?
我们正在使用 GCC 并针对 MIPS 进行编译(在模拟器中运行 :-))
编辑:
SAVE_REGISTERS
是用 .macro SAVE_REGISTERS
... 定义的。它不能在 C 宏中,因为它在其他汇编模块中使用。
我不能用它制作 .S 文件,因为 panic 必须是可变的。或者至少我想不出任何其他方法来做到这一点。
最佳答案
我认为您误解了宏的工作原理。它们在任何其他编译发生之前得到扩展。您不能使用 asm
发出一些包含宏的代码,因为该宏永远不会被扩展。
相反,您可以尝试将 SAVE_REGISTERS
定义为使用 asm
语句构建汇编代码的 C 宏:
#define SAVE_REGISTERS(x) \
asm volatile ("movx ax, %1", ...);
那么你可以做
#define panic(...) \
do { \
SAVE_REGISTERS(_panic_context); \
_panic_printk(&_panic_context, __VA_ARGS__); \
} while(0);
关于c - 包含在内联汇编中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1601788/