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

如何在64位的linux系统上使用汇编和C语言混合编程

发布网友 发布时间:2022-05-12 11:09

我来回答

2个回答

热心网友 时间:2023-10-06 06:11

C51与汇编语言混合编程(1).C51语言中调用汇编语言程序1、在文件中选中FILEGROUP和C51程序原文件,在配置文件选项中激活“i”产生汇编(SRC)文件,“编译(SRC)文件”和“创建工程(目标)时包含“三个选项。2、根据选择的编译模式,把相应的库文件(如SMALL模式,库文件为KEIL\C51\LIB\C51S.LIB)加入到工程中。3、在C51语言中必须声明需要调用的函数为外部函数。externvoidDELAY(void);4、在汇编语言程序中必须声明被调用子程序为公共子程序,在被调用的文件中还需要声明此文件是新定位的。PUBLICDELAY,DELDELAYYSEGMENTCODERSEGAELAYY实例如下:#include"reg51.h"externvoidDELAY(void);externvoidDEL(void);voidmain(void){P1=0x00;DELAY();DEL();P!=0xff;}汇编语言文件:PUBLICDELAY,DELDELAYYSEGMENTCODERSEGAELAYYDELAY:MOVR2,#3HDJNZR2,$RETDEL:MOVR3,#3HDJNZR3,$RETEND(2)、C51语言中嵌入汇编程序:在C51语言中嵌套使用汇编语言程序要注意以下几个问题:1、在文件中选中FILEGROUP和C51程序原文件,在配置文件选项中激活“i”产生汇编(SRC)文件,“编译(SRC)文件”和“创建工程(目标)时包含“三个选项。2、根据选择的编译模式,把相应的库文件(如SMALL模式,库文件为KEIL\C51\LIB\C51S.LIB)加入到工程中。3、用#pragmaasm.和#pragmaendasm语句包含嵌入的汇编语言程序。实例如下:#include"reg51.h"voiddelay(void);voidmain(void){voiddelay(void);P1=0x00;#pragmaasmMOVR3,#08HDINZR3,$#pragmaendasmP1=0xff;}voiddelay(void){#pragmaasmMOVR4,#08HDJNZR4,$#pragmaendasm}

热心网友 时间:2023-10-06 06:12

编译和链接的时候使用的指令:(AMD处理器,64位操作系统)
编译链接指令
1 nasm -f elf foo.s -o foo.o
2 gcc -c bar.c -o bar.o
3 ld -s -o foobar bar.o foo.o
汇编语言用nasm编写并用nasm编译器编译,而C语言用的是gcc编译,这些都没有问题,但是在链接的时候出错了,提示如下:
ld: i386 architecture of input file `foo.o' is incompatible with i386:x86-64 output
google了一下,意思就是nasm 编译产生的是32位的目标代码,gcc 在64位平台上默认产生的是64位的目标代码,这两者在链接的时候出错,gcc在64位平台上默认以64位的方式链接。
这样在解决的时候就会有两种解决方案:
<1> 让gcc 产生32位的代码,并在链接的时候以32位的方式进行链接
在这种情况下只需要修改编译和链接指令即可,具体如下:
32位的编译链接指令
1 nasm -f elf foo.s -o foo.o
2 gcc -m32 -c bar.c -o bar.o
3 ld -m elf_i386 -s -o foobar foo.o bar.o
具体的-m32 和 -m elf_i386 请自行查阅gcc (man gcc)

如果你是高版本的gcc(可能是由于更新内核造成的),可能简单的使用-m32 的时候会提示以下错误(使用别人的历程,自己未曾遇到):
> In file included from /usr/include/stdio.h:28:0,
> from test.c:1:
> /usr/include/features.h:323:26: fatal error: bits/predefs.h: No such file or directory
> compilation terminated.
这应该是缺少构建32 位可执行程序缺少的包,使用以下指令安装:
sudo apt-get install libc6-dev-i386
此时应该就没有什么问题了。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
八月中国最凉快的地方 八月份哪里最凉快,去哪旅游好?美丽的地方 乱字同韵字是什么意思 华硕笔记本电脑触摸板怎么开笔记本电脑触摸板怎么开启和关闭_百度知 ... 陕西职务侵占案立案准则 结婚后我的恋情维系了十年,怎么做到的? 玉米仁子饭产自哪里 中国期货交易所的交易品种有哪些? 历史要怎么读,有啥诀窍 高中历史诀窍 如何取消绑定手机号 怎么在淘宝上投诉华泰保险 去那里可以 投诉淘宝的华泰保险 手机屏碎险---令人失望的华泰保险公司 不想绑定手机号要怎么解除? 平安金管家里的的平安银行理财产品是平安保险公司担保的吗? 平安银行金管家里面的保单红利怎么看不到? 平安金管家怎么邀请新人注册 天天快递可以寄猫吗 夏天生鸡腿在凉水里泡了一晚有腥味能吃吗 返利怎么赚钱 抖音返利怎么弄的 手机进水后屏幕亮但是触摸屏不好使怎么办 立嘉牌烤箱哪里有卖啊? 哪有卖烤箱里的模具的啊 哪有卖烤箱,食品添加剂的 烤箱食谱哪有得卖?网购也行 名下绑定超过5个微信,现在用的微信只有一个,其他的都不用了,如何解绑其他? 烤箱的烤架哪有卖的 邯郸哪有卖烤箱的? 补办国际快递许可证需要实地核查吗? c语言与汇编语言混合编程编译器 单片机C语言与汇编语言混合编程有哪几种方式?通常采用什么方式 开快递公司需要哪些条件 单片机 一般什么情况下会用到 汇编语言和C语言的混合编程? c语言和汇编语言混合编程,键盘输入4个十进制数,用汇编语言计算这四 51单片机编程时汇编和C语言如何结合 汇编语言和c语言的混合编程中,为什么ESP+4可以用来接收c语言函数的参数? 急求!!C语言和汇编混合编程 马上预产期到了,究竟是剖腹产好还是顺产好? 为什么网上都说剖腹产好,现实中都说顺产好?到底哪个更好? 怎么看实名认证 有朋友建议我以后生孩子一定要剖腹产,剖腹产一定比顺产好吗? 怎么绑定小孩社保卡到大人卡上 佳能2202dn恢复出厂设置 我苹果手机微信怎样才能批量删除好友呢?设置根本没有不常联系人,微信版本最新的 手机怎么合成图片 qq年龄怎么修改不了 怎么在手机QQ里改性别和年龄 手机怎么合并通话?