我目前正在尝试进入操作系统开发,主要是关注OSDev中的文章和教程。就像现在一样,我有多个我需要的汇编文件,例如启用分页和设置长模式。
虽然我唯一需要在自己的文件中分离的汇编程序代码是引导程序集文件,但我对这些实践以及标准"很好奇。如何在用C编写的操作系统中处理汇编。将汇编程序与C分开是否方便,或者是否存在例如Linux将大部分汇编代码包装在C函数中并使用asm volatile
指令调用它们?
我没有看到太大的区别,因为您可以通过将值移到eax
寄存器中,或者在使用asm
和asm volatile
时返回汇编结果,您可以指定参数并输出存储结果的操作数。但是,您始终需要使用\n
或\n\t
分隔多个说明。
截至目前,我只发现了在一个更大的项目中处理汇编的不同方法,但不是为什么有些人选择将汇编代码从C或C ++中分离出来,以及为什么有些人选择在整个程序中使用内联汇编
我希望你能就我在这个主题上使用的不同方法给出一些见解。
答案 0 :(得分:1)
在纯汇编语言项目中,您需要设置传递值和返回值的协议或约定。
将汇编语言函数与C或C ++混合时,您需要遵循C或C ++的参数传递约定,这取决于您使用的编译器。
某些编译器可能使用传递R0中第一个参数的约定,而其他编译器可能会传递R0中的最后一个参数。有些编译器可能会将变量放在堆栈上而不使用寄存器。其他人可能会使用寄存器来处理一些参数,剩下的就是堆栈。
一个问题是可移植性。汇编语言是处理器特定的。例如,ARM程序集没有EAX寄存器。英特尔组装没有R10注册。使用内联汇编时,程序集必须根据处理器而更改,包括修改高级语言函数以考虑所有目标处理器。当作为单独的汇编函数(文件)实现时,只有在移植到其他处理器时才需要换出该文件。
恕我直言,纯组装功能比混合C和内联汇编更容易阅读。
应尽量减少汇编语言的数量。汇编语言需要更长的时间来开发(键入和调试,更多行==高可能注入的缺陷),而高级语言更高效,风险更低。
喜欢用高级语言编写整个操作系统。让这个版本运行稳健。将C函数替换为汇编函数以提高效率,或者在需要特定的汇编语言指令时。