我目前正在尝试进入操作系统开发,主要是遵循 OSDev 中的文章和教程。 。作为现在的操作系统,我有多个需要的汇编文件,例如启用分页并设置长模式。
虽然我确信唯一需要在自己的文件中分离的汇编代码是引导汇编文件,但我很好奇如何在用 C 编写的操作系统中处理汇编的实践和“标准”。将汇编程序与 C 分开是否方便,或者是否有原因,例如Linux 将大部分汇编代码包装在 C 函数内,并使用 asm volatile
调用它们。指令?
我没有看到太大的区别,因为您可以通过将值移动到eax
来从汇编返回结果。注册,或使用 asm
时和asm volatile
,您可以指定参数和输出操作数存储结果的位置。但是,您始终需要使用 \n
分隔多个指令。或\n\t
.
到目前为止,我只了解了在较大项目中处理汇编的不同方法,但没有了解为什么有些人选择将汇编代码与 C 或 C++ 分离,以及为什么有些人选择在整个程序中使用内联汇编.
我希望您能给我一些关于此主题所使用的不同方法的见解。
最佳答案
接口(interface)、协议(protocol)和约定
在纯汇编语言项目中,您需要设置用于传递值和返回值的协议(protocol)或约定。
将汇编语言函数与 C 或 C++ 混合时,您需要遵循您所使用的编译器规定的 C 或 C++ 参数传递约定。
某些编译器可能会使用在 R0 中传递第一个参数的约定,而其他编译器可能会在 R0 中传递最后一个参数。有些编译器可能会将变量放在堆栈上而不使用寄存器。其他人可能会使用寄存器来存储一些参数,并将剩余的参数放在堆栈上。
内联函数与单独的汇编函数
其中一个问题是可移植性。汇编语言是特定于处理器的。例如,ARM 汇编没有 EAX 寄存器。 Intel 汇编没有 R10 寄存器。使用内联汇编时,汇编必须根据处理器进行更改,其中包括修改高级语言函数以考虑所有目标处理器。当作为单独的汇编函数(文件)实现时,在移植到其他处理器时仅需要换出该文件。
恕我直言,纯汇编函数比混合的 C 和内联汇编更容易阅读。
操作系统中高级语言使用指南
应尽量减少汇编语言的数量。汇编语言需要更长的开发时间(打字和调试,更多的行==可能注入(inject)的缺陷高),而高级语言的生产力更高,风险更低。
更喜欢用高级语言编写整个操作系统。让这个版本稳定运行。将 C 函数替换为汇编函数以提高效率,或者当需要特定的汇编语言指令时。
关于c++ - 内联汇编或单独的汇编文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50495208/