我们正在开发一个玩具操作系统作为课程的作业。 我在编写内核恐慌函数时遇到了一些麻烦。

它应该保存所有寄存器,调用一些类似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文件,因为恐慌必须是可变的。或者至少我无法想出任何其他办法。

有帮助吗?

解决方案

我认为你误解了宏是如何工作的。在任何其他编译发生之前,它们会被扩展。您不能使用 asm 来发出包含宏的代码,因为该宏永远不会被展开。

相反,您可以尝试将 SAVE_REGISTERS 定义为C宏,它使用 asm 语句来构建汇编代码:

#define SAVE_REGISTERS(x) \
   asm volatile ("movx ax, %1", ...);

然后你可以做

#define panic(...) \
do { \
    SAVE_REGISTERS(_panic_context); \
    _panic_printk(&_panic_context, __VA_ARGS__); \
} while(0);

其他提示

我没有一个MIPS系统,但是在我的x86 loonix盒子上我尝试了 #include 并发现是注释字符,所以我尝试过 .include ,只要我引用文件名就行了: .include" something.i"

现在,如果您有汇编程序代码的头文件和有组织的基础结构,我不得不想知道为什么要首先使用内联asm执行此操作。为什么不只是制作一个真正的 .s .S 文件,包含汇编程序头文件,并使其成为系统中的第一类模块?

我已经看到使用 asm 完成的小作品,即使在已经在 Makefile 中已经有 locore.S 的项目中也是如此。 ..

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top