2009-10-21 37 views
1

我们正在研究一个玩具操作系统作为一个班级的作业。 我在编写内核恐慌函数时遇到了一些麻烦。包含在内联组件

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

+0

定义'SAVE_REGISTERS'究竟如何? – 2009-10-21 16:16:28

回答

3

我想你是误会宏如何工作。在进行其他编译之前,它们会被扩展。您不能使用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); 
+0

虚假do循环是为了确保宏后面有一个分号,methinks。 – 2009-10-21 16:38:24

+3

虚拟do循环是多语句宏中的一种常用技术,例如,在if语句中使用时,它们表现良好。它应该留在宏中(但应该添加右括号)。查看http://stackoverflow.com/questions/154136/why-are-there-sometimes-meaningless-do-while-and-if-else-statements-in-cc-macr – 2009-10-21 18:30:19

+0

好的,我不知道该公约。编辑答案。谢谢。 – 2009-10-21 21:45:54

1

我没有MIPS体系躺在附近,但在我的x86 loonix箱我试图#include,发现#是注释字符,所以我尝试.include并为我所引用的文件名,一旦工作:.include "something.i" 。尽管如此,如果你有头文件和一个有组织的基础结构的汇编代码,我不得不想知道为什么你想用inline asm来做这件事。为什么不制作一个真正的.s.S文件,包含汇编头文件,并使其成为系统中的一流模块?

我见过小的杰作与ASM即使在已经在他们的Makefilelocore.S项目完成后,去图...