计算机自制操作系统(十三):汇编语言与C语言的混合编程

如题所述

在自制操作系统的征途中,我们探讨了C语言的核心地位,并迎来了新的挑战:将汇编语言与C语言结合进行编程。借助链接器,我们能够将C语言和汇编语言生成的目标文件融合,形成单一的可执行文件,如同使用GCC的ld或Visual Studio的link工具。为了与32位的汇编代码协同工作,我们创建了专用的32位汇编模块,为C语言调用的函数提供服务。确保函数名称的一致性和链接的正确性是这个过程的关键。
以下是C与汇编语言无缝对接的关键步骤:
1. 编写汇编函数(例如naskfunc.nas),编译后生成naskfunc.obj。
2. 在C主程序(Kernelc.c)中声明并调用这些汇编函数,生成Kernelc.obj。
3. 使用链接器obj2bim.exe将Kernelc.obj和naskfunc.obj结合,生成可执行的Kernelc.bim。
4. 最终目标是生成二进制文件Kernel.bin,它是程序的基础。
在C程序中,我们使用EXTERN和GLOBAL关键字来标识需要调用的汇编函数。通过修改链接器haribote.rul,我们将入口函数HariMain更改为标准的Main。当C调用汇编函数时,call指令的参数在链接后会进行调整,但这并不影响它们之间的协同工作。链接器会将汇编代码插入到C程序的尾部,确保准确的函数调用。
链接器的运作原理包括:
- 寻找程序入口:定位到C程序中的Main函数。
- 加载机器代码:C程序从0x80+C开始,汇编程序在C程序之后。
- 修正函数调用偏移:调整汇编函数的偏移。
- 计算最终偏移:结合链接后的实际位置。
- 链接过程的细节变化在Kernelc.map文件中显示。
在链接过程中,C程序通过"#include"指令引用库函数,链接器将它们紧密结合。参数传递是关键,C函数通过堆栈传递参数,但需要注意堆栈的正确管理以避免程序崩溃。
总结来说,掌握C调用汇编的技巧对于深入理解操作系统的核心至关重要。在Linux环境下,可以使用C内嵌汇编来实现特定功能。汇编调用C时,需要注意清理堆栈,以避免留下隐患。现在,你已经准备好继续你的操作系统构建之旅,迎接新的编程挑战。
温馨提示:答案为网友推荐,仅供参考