如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
万方数据单片机C语言与汇编语言的混合编程e枷plel.c经过编译与连接后可得到下面的咖pkl.sRc文件:SCmNCE&TEC删OLOGY唧0蹦ATl0N在喇ect窗口中包含汇编代码的C文件上点击右键,选择(中山火炬职业技术学院职高部广东中山528437)卸阳舭a鹊mCODE(?C—贸ARTUP)陈百良选择“Projec曲uild}幸木奉宰事幸车幸宰奉}霉ex咖plel.c幸········}····★·void咖in(void);沁xmplel.SRCfmm:ex咖plel.c啪in科技信息oIT技术论坛o2008年第6期【摘要】汇编语言的机器代码生成效率高、执行速度快,但可读性却并不强;而C语言的可读性和可移植性却远远超过汇编语言,用C语言开发中大型软件的周期要比用汇编语言短很多,但C语言很难解决高时效性等代码编写的问题,此时便可利用汇编语言来实现。本文便是针对这一问题,详细介绍了单片机C语言与汇编语言混舍编程的实现方法。【关键词】C语言:汇编语言;混合编程在单片机C语言与汇编语言的混合编程过程中.C语言调用汇编代码常有两种方法:一是直接在C语言程序中嵌入汇编语句:二是C语言调用汇编语言子程序。把汇编语言程序加入到C语言程序中.必须使汇编程序和C程序一样具有明确的边界、参数、返回值和局部变量,必须为汇编语言编写的程序段指定段名并进行定义。如果要在它们之问传递参数,则必须保证汇编程序用来传递参数的存储区和C函数使用的存储区是一样的。1.C语言内嵌汇编代码1.1内嵌汇编代码的格式在C语言程序中嵌入汇编代码。可以通过预编译指令“∞m”来实现。其格式如下::C代码:汇编代码却ra殍MKeil软件中含内嵌扩编代码的C文件的编译与连接1.2.1工程相关选项的设置“0pti∞sfor⋯”,然后在弹出的窗口中选中“GenerateFile”两项。选中这两项编译器才会将“∞m”与“end鹊m”中的代码复制到输出的SRC文件中.然后才会将这些代码放入它所产生的目标文件中。在编译过程中产生SRC文件为C文件对应的汇编文件,我们还可以对sRC文件进行仔细的分析来了解其函数封装规则。1.2.2加入库文件根据所选择的编译模式,在工程中添加相应的库文件(如Small模式时。库文件为C5lS.“b)。1.2.3编译与连接1k铲t”仅对修改过的文件进行编译与连接处理,或选择“Pmject,BuildFiles”对所有源程序全部进行编译与连接,生成目标代码。1.3内嵌汇编代码的C文件实例椭nclude<re95{#p阳孕na髓m。卸ml伊ml⋯⋯(寄存器描述省略);撕nclude<re951.1l>main(void);{P2.椰1H;卸mgmaP2A;l从上述SRC文件中可以看出。在“∞m”与“end∞m”中的代码被复制到输出的SRC文件中2.C语言调用汇编函数2.1C语言调用不传递参数的汇编函数2.1.1汇编文件的格式在汇编语言中。要求用汇编语言编写的函数和用C编译器编译出来的代码风格一样,这样可以让开发的程序具有很好的可读性和可维护性。另外也很容易和C编写的函数进行连接。首先在程序存储区中定义段,其次利用PUBuC声明函数为公共函数,再用RSEG表示函数可被连接器放置在任何地方,最后编写汇编函数。其实例DELAY.幽m如下:/,在程序存储区中定义段,,声明函数为公共函数RSEG?PR?DELAY:/,函数可被连接器放置在任何地方end∞m1.2AssemblerSRCFile”和“A8∞mbleallTar8et1.h>P2=1:MOVR7搿lODEI由:MOVR6.#20DELl:DJNZR6.DELlDJNZR7.DELOendasmgenerated?PR?main?EXAMPLElSEGMENTCODEEx‘nlNPUBUC;voidRSEG?PR?main?EXAMPLEl:SOURCEUNE撑2LINE#3;P2=l;UNE#4R7_#10:DEL0:MOV:DELl:DJNZR6,DELlR7,DEL0;P2=0;LINE撑llCLRAUNE撑12RET:ENDOFmainEND·+·¨:·}···¨聿DELAY.鸽m······宰·}·}··}宰宰?PR?DELAYsEGMENTCODE:DELAY;DEL气Y:R7.#lODELO:MOVR7。DEIJDP2=o:main:;#p糟gmaasmR7.#10DEID:MOV:;万方数据RSEG?PR?main?EXAM眦3松的掌握混合编程的方法。eC文件e姗ple3.c的sRC文件如下:DELAY(哪i印ed在C语言中,调用汇编函数之前必须先用ext锄声明此函数。其m异51.h>中,调用汇编函数之前同样先用ext锄声明此函数为外部函数,不同generalcd丘哪:懿衄lpl