首页 > 解决方案 > 内联汇编或单独的汇编文件

问题描述

我目前正在尝试进入操作系统开发,主要关注OSDev的文章和教程。作为现在的操作系统,我需要多个程序集文件,例如启用分页和设置长模式。

虽然我确定唯一需要在自己的文件中分离的汇编代码是引导汇编文件,但我很好奇如何在用 C 编写的操作系统中处理汇编的实践和“标准”。方便吗将汇编程序与 C 分开还是有原因,例如 Linux 将大部分汇编代码包装在 C 函数中并使用asm volatile指令调用它们?

我看不出有多大区别,因为您可以通过将值移动到eax寄存器中来从汇编中返回结果,或者在使用asmand时asm volatile,您可以指定参数和输出操作数来存储结果的位置。\n但是,您总是需要使用or来分隔多条指令\n\t

到目前为止,我只发现了在大型项目中处理汇编的不同方法,但不知道为什么有些人选择将汇编代码与 C 或 C++ 分开,以及为什么有些人选择在整个程序中使用内联汇编。

我希望你能给我一些关于在这个主题上使用的不同方法的见解。

标签: c++cassembly

解决方案


接口、协议和约定

在纯汇编语言项目中,您需要设置传递值和返回值的协议或约定。

将汇编语言函数与 C 或 C++ 混合使用时,您需要遵循所使用的编译器所规定的 C 或 C++ 的参数传递约定。

一些编译器可能使用在 R0 中传递第一个参数的约定,而其他编译器可能在 R0 中传递最后一个参数。一些编译器可能会将变量放在堆栈上而不使用寄存器。其他人可能将寄存器用于一些参数,其余的则在堆栈中。

内联与单独的汇编函数

一个问题是便携性。汇编语言是特定于处理器的。例如,ARM 程序集没有 EAX 寄存器。英特尔组件没有 R10 寄存器。使用内联汇编时,汇编必须根据处理器而改变,其中包括修改高级语言函数以考虑所有目标处理器。当实现为单独的汇编函数(文件)时,移植到其他处理器时只需要换出文件。

恕我直言,纯汇编函数比混合的 C 和内联汇编更容易阅读。

操作系统中高级语言使用指南

应尽量减少汇编语言的数量。汇编语言需要更长的时间来开发(打字和调试,更多的行==高可能的注入缺陷),而高级语言的生产力更高,风险更低。

更喜欢用高级语言编写整个操作系统。让这个版本运行良好。用汇编函数替换 C 函数以提高效率,或者在需要特定的汇编语言指令时。


推荐阅读