keil4 下 c语言和汇编语言。混合编程的方法。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了keil4 下 c语言和汇编语言。混合编程的方法。相关的知识,希望对你有一定的参考价值。

keil4 下 c语言和汇编语言。混合编程的方法。百度上查的都是好几年前的东西了。放在现在的keil里根本跑不了。如果有什么带源码。或者工程文件的话。最好。要有可操作性的。在keil4下可以直接编译通过的asm文件的和 c语言与汇编混着写的都有最好。最主要是c语言和汇编混合写成的源程序。或者工程文件。有资料也行

参考技术A 用C语言作为主模块,汇编作为次模块(也就是单纯一个函数)。
在C中使用EXTERN声明函数(需要准确类型)
然后在汇编模块中编写函数定义(参数类型只要等大就行)
然后记得设置好生成工具(C模块用C编译器,汇编用汇编编译器)和命令行参数
参考技术B _asm

追问

我试了一下,我水平有限。没有调试好。我需要源码或者源程序。能编译通过的,然后慢慢揣摩!你没看清我要什么朋友!

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

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 参考技术A 编译和链接的时候使用的指令:(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
此时应该就没有什么问题了。本回答被提问者采纳

以上是关于keil4 下 c语言和汇编语言。混合编程的方法。的主要内容,如果未能解决你的问题,请参考以下文章

最近在搞C\C++ 和汇编语言 的混合编程,如何讲2者在编译环境中连接起来。

Java语言和C语言混合编程--Java native关键字

Python混合编程:C语言接口ctypes

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

C和C++如何混合编程

QT可以和python混合编程吗