【发布时间】:2018-05-23 18:33:39
【问题描述】:
我目前正在尝试进入操作系统开发,主要关注来自OSDev 的文章和教程。就像现在的操作系统一样,我有多个我需要的程序集文件,例如启用分页和设置长模式。
虽然我确定唯一需要在自己的文件中分离的汇编代码是引导汇编文件,但我很好奇如何在用 C 编写的操作系统中处理汇编的实践和“标准”。将汇编程序与 C 分开是否方便,或者是否有原因,例如Linux 将大部分汇编代码封装在 C 函数中并使用 asm volatile 指令调用它们?
我看不出有什么不同,因为您可以通过将值移动到eax 寄存器中来从汇编中返回结果,或者在使用asm 和asm volatile 时,您可以指定参数和输出操作数的存储位置结果。但是,您总是需要使用\n 或\n\t 来分隔多个指令。
到目前为止,我只发现了在一个较大的项目中处理汇编的不同方法,但不知道为什么有些人选择将汇编代码与 C 或 C++ 分开,以及为什么有些人选择在整个程序中使用内联汇编.
我希望你能给我一些关于在这个主题上使用的不同方法的见解。
【问题讨论】:
-
您可以通过将值移动到 eax 寄存器中来返回汇编结果。这可能看起来有效,但只是偶然有效。除非您使用输入和输出操作数告诉编译器您在做什么,否则您不能安全地使用 GNU C 内联汇编。当编译器将您的函数内联到调用者中时,它将中断。请参阅this answer 以获取有关内联 asm 的更多链接,以及错误使用它可能带来的麻烦。