c - 包含在内联汇编中

标签 c gcc assembly operating-system inline-assembly

我们正在开发一个玩具操作系统,作为类作业。 我在编写内核 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/

相关文章:

gcc - MinGW Win32 + nasm : "undefined reference"

c++ - gcc - 删除 "is used uninitialized in this function"警告

c - 如何告诉 gcc 通过在代码的每一行调用我自己的函数来检测代码?

c - 在 C 编程中打印输出 st_uid

c - c中(a=a+1)+(a=a+1)+(a=a+1)的结果?

linux - CMake - 如何避免链接器命令行中的 CMAKE_CXX_FLAGS

linux - 任何人都可以告诉我有关 ARM 在 Linux 上的栈帧布局的详细信息吗?

windows - 如何确定 EXE(或 DLL)是否参与 ASLR,即是否可重定位?

c - 请求非结构或 union 中的成员 'next'

c - fputc 与 C 中的 putc