问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2024-05-01 23:27

我来回答

1个回答

热心网友 时间:2024-05-11 17:29

计算机自制操作系统之旅(十三):C与汇编语言的无缝融合


在掌握了C语言的主导后,汇编与C的协同编程成为关键环节。通过链接器,我们将C的obj文件和汇编的obj文件巧妙地结合,形成统一的执行体,如GCC的ld或VS的link工具。为了保持兼容性,我们需要确保与32位汇编程序的协同工作,为此,我们会创建一个专用的32位汇编模块,专为C调用的函数服务。这个过程的核心在于确保函数名称的一致性和链接的准确性。


关键步骤揭示:



C与汇编的无缝对接:

首先,编写汇编函数(naskfunc.nas),如一个简单的"C->A"显示函数,编译后为naskfunc.obj。
接着,在C主程序(Kernelc.c)中,声明并调用这四个外部函数,生成Kernelc.obj。
然后,用链接器obj2bim.exe将Kernelc.obj和naskfunc.obj融合,生成可执行的Kernelc.bim。


目标:最终目标是生成二进制文件Kernel.bin,它是程序的基石。

整个过程涵盖了函数声明、编译、链接和输出的各个环节,确保了函数名称的正确引用和调用。


细节解析:


在C程序中,我们巧妙地使用EXTERN和GLOBAL关键字来标识需要调用的汇编函数。通过配置链接器haribote.rul,我们将入口函数HariMain更改为标准的Main,使之符合规范。


当C调用汇编函数时,call指令的参数在链接后会有所调整,但这并未影响到它们的无缝协作。链接器会将汇编代码插入C程序的尾部,确保精确无误的函数调用。


链接器的运作原理如下:



寻找程序入口:定位到C程序中的Main函数。
加载机器代码:C程序从0x80+C开始,长度0x0D,汇编程序则在C程序之后,0x24+0x0D=0x31。
修正函数调用偏移:在call指令中调整汇编函数的偏移,如调用asmfunc。
最终偏移计算:asmfunc在汇编程序中的偏移值为0x00000000,结合链接后的实际位置,得出偏移值为0x02。
链接过程的细节变化会在Kernelc.map文件中清晰呈现。

链接过程中,C程序通过"#{include}"指令引用库函数,链接器将它们紧密结合。虽然这通常是自动处理的,但理解这一过程有助于我们更好地控制程序的构建。


参数传递至关重要:C函数通过堆栈区域,通过ESP+8,12,16传递3个参数,但实际值比预期少4字节,因为C编译器使用了PUSH EBP进行保护,正确顺序应调整为ESP+4,8,12。


汇编调用C的精准性不容忽视,每次调用前后堆栈管理的正确性至关重要,以避免程序崩溃。示例汇编代码展示了这个微妙的调用过程和堆栈清理。


总结来说,C与汇编语言的混合编程虽有挑战,但只要妥善处理,就能实现高效且精确的通信。在Linux环境下,我们甚至可以使用C内嵌汇编来实现某些特定功能,如通过SYS_PRINT函数调用系统功能,无需printf。


掌握C调用汇编的技巧,你将能更好地掌控操作系统的核心,而汇编调用C时,务必注意清理堆栈,以免留下隐患。现在,你已经准备好迎接下一个编程挑战,继续你的操作系统构建之旅吧。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
“晚来天欲雪,能饮一杯无?”是什么意思_出处及原文翻译_学习力 胸肌中部怎么练 血沉高是怎么回事,怎样才能降低啊! 中海锦江城多久交房 “QMS”作为“质量管理体系”的英文缩写,其背后理论及应用如何?_百度... 我用QQ登的快手绑定了一个电话号码,电话号码不用了,现在怎么能登得进去... 桂林银行白金客户条件 桂林银行最高等级卡 iQOO 11系列曝光,预计年底正式发布! vivo X90先别买?iQOO 11系列配置堪称豪华 晚上喝太多水眼睛会肿,不喝又很渴怎么办? 溪水如(),奔腾向前。填数字成语 引产做月子可以喝孕妇奶粉吗 中国的教育需要改革吗? 角阀作用是什么 怎么泡白萝卜好吃又脆 自萝卜怎么泡脆而好吃 泡白萝卜怎么泡又脆又好吃?这个超简单做法放一夜就能吃,爽脆入味特实用... off是亮着还是灭好 "最后一年"用英语怎么说 请问已故人员户口注销以后档案是否存在 与beef音标相符的单词 您好人亡注销户囗后档案保存多久 涡轮增压漏油会导致什么影响? 涡轮增压漏油会导致什么影响 扑克牌24点,A 5 5 5,怎么算成24 电脑开机了但是显示屏没反应 伯努利方程速度1和速递2有可能相等吗 I will beautiful and cute这句话对不对 铁离子为什么不可以直接上机测定而要先进行显色? 为什么固体会显颜色? 还有为什么铁离子显黄色,还要在可见光分光度用SCN... nothing它的用法 本届世界杯巴西和德国谁更强 今天凌晨,世界杯巴西队与德国队比赛的比分是几比几? 抖音直播人数怎么突破10万人? 一千年以前"士″字怎么写? 长发只留头顶好看吗 男士长发可以怎么留? 免费起名字 男孩爸爸姓钟 妈妈姓赵 想给孩子起个好听响亮的名字 哪位帮... 海拉尔有顺捷驾校吗 我四月十一号在海拉尔新区吉通驾校报的名十四号体验完还没有面签,学... ...MACRO 62MM 麻烦您给看一下用什么样的转接环比较好。 火柴人亨利还会更新吗(中国) 在银行上班有一个月发两百元发错工资的吗 手心脱皮,干燥是为什么?有什么办法改善? ...做了手术直到现在还有肿胀不知道多长时间能消肿?平时感 53岁尿毒症 透析后血压低还能继续透析吗? 运用传统文化的知识说明除夕"全民抢红包"的原因 除夕夜,你更愿意抢红包还是看春晚 除夕夜抢红包与亲情的陪伴矛盾吗 体温计夹十分钟和五分钟一样吗