OpenEuler 中C与汇编的混合编程
目录
OpenEuler 中C与汇编的混合编程
在X86_64架构下实践2.5中的内容,提交代码和实践截图
准备工作
首先,查看ubuntu版本并下载gcc32位库
可见x86-64
将C代码编译成汇编代码
示例2.2
将s.c文件经过预处理、编译成s1.s文件,再将s.s、s1.s文件经过汇编、链接形成可执行文件,最后结果可见
示例2.3
与上面步骤相同。
编译过程中遇到一个问题,在汇编mysum.s文件时如果不加-m32会出现以下错误
经查资料,发现是错误原因是,在64位系统和32位系统中对于某些汇编指令的处理支持不一样造成的。在文件mysum.s中,包含指令:pushl %ebp,该指令在64位系统下就编译不过。
博客中给的解决方法是在.s文件的开头加上.code32,这样汇编确实通过了,但是在执行最后的可执行文件时会发生段错误
这是个治标不治本的方法,直接在gcc的命令中加上-m32则不会出现此问题
如果汇编.s文件加-m32,编译.c文件不加,则会出现以下错误
这是因为两份文件一个是32位一个是64位,无法匹配导致的错误
示例2.4
步骤同上
把2.5的内容在OpenEuler中重新实践一遍,提交相关代码和截图
由于OpenEuler的软件包中没有提供 gcc-multilib 的安装,我将缺少的头文件lib-names-32.h、stubs-32.h、stubs-x32.h、lib-names-x32.h从ubuntu中复制到operneuler中,将crtn.o crt1.o crti.o也复制过去,仍会出现以下错误
目前还没有找到解决方法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现