c调用汇编说明与实例程序.doc_第1页
c调用汇编说明与实例程序.doc_第2页
c调用汇编说明与实例程序.doc_第3页
c调用汇编说明与实例程序.doc_第4页
c调用汇编说明与实例程序.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

科技信息SCIENCE & TECHNOLOGY INFORMATION 2008 年第6 期在单片机C 语言与汇编语言的混合编程过程中, C 语言调用汇编代码常有两种方法: 一是直接在C 语言程序中嵌入汇编语句; 二是C语言调用汇编语言子程序。把汇编语言程序加入到C 语言程序中, 必须使汇编程序和C 程序一样具有明确的边界、参数、返回值和局部变量, 必须为汇编语言编写的程序段指定段名并进行定义, 如果要在它们之间传递参数, 则必须保证汇编程序用来传递参数的存储区和C 函数使用的存储区是一样的。1.C 语言内嵌汇编代码1.1 内嵌汇编代码的格式在C 语言程序中嵌入汇编代码, 可以通过预编译指令“asm”来实现。其格式如下:; C 代码#pragma asm; 汇编代码#pragma endasm; C 代码1.2 Keil 软件中含内嵌汇编代码的C 文件的编译与连接1.2.1 工程相关选项的设置在Project 窗口中包含汇编代码的C 文件上点击右键, 选择“Options for .”, 然后在弹出的窗口中选中“Generate Assembler SRCFile”和“Assemble SRC File”两项。选中这两项编译器才会将“asm”与“endasm”中的代码复制到输出的SRC 文件中, 然后才会将这些代码放入它所产生的目标文件中。在编译过程中产生SRC 文件为C 文件对应的汇编文件, 我们还可以对SRC 文件进行仔细的分析来了解其函数封装规则。1.2.2 加入库文件根据所选择的编译模式, 在工程中添加相应的库文件(如Small 模式时, 库文件为C51S.Lib)。1.2.3 编译与连接选择“Project/Build Target”仅对修改过的文件进行编译与连接处理, 或选择“Project/Build all Target Files”对所有源程序全部进行编译与连接, 生成目标代码。1.3 内嵌汇编代码的C 文件实例*example1.c*#include void main(void)P2=1;#pragma asmMOV R7,#10DEL0: MOV R6,#20DEL1: DJNZ R6,DEL1DJNZ R7,DEL0#pragma endasmP2=0;example1.c 经过编译与连接后可得到下面的example1.SRC 文件:; .example1.SRC generated from: example1.c( 寄存器描述省略)?PR?main?EXAMPLE1 SEGMENT CODEEXTRN CODE (?C_STARTUP)PUBLIC main; #include ; void main(void)RSEG ?PR?main?EXAMPLE1main:; SOURCE LINE # 2; ; SOURCE LINE # 3; P2=1; SOURCE LINE # 4MOV P2,#01H; #pragma asm; MOV R7,#10MOV R7,#10; DEL0: MOV R6,#20DEL0: MOV R6,#20; DEL1: DJNZ R6,DEL1DEL1: DJNZ R6,DEL1; DJNZ R7,DEL0DJNZ R7,DEL0; #pragma endasm; P2=0; SOURCE LINE # 11CLR AMOV P2,A; ; SOURCE LINE # 12RET; END OF mainEND从上述SRC 文件中可以看出, 在“asm”与“endasm”中的代码被复制到输出的SRC 文件中2.C 语言调用汇编函数2.1C 语言调用不传递参数的汇编函数2.1.1 汇编文件的格式在汇编语言中, 要求用汇编语言编写的函数和用C 编译器编译出来的代码风格一样, 这样可以让开发的程序具有很好的可读性和可维护性, 另外也很容易和C 编写的函数进行连接。首先在程序存储区中定义段, 其次利用PUBLIC 声明函数为公共函数, 再用RSEG 表示函数可被连接器放置在任何地方, 最后编写汇编函数。其实例DELAY.asm 如下:*DELAY.asm*?PR?DELAY SEGMENT CODE; /在程序存储区中定义段PUBLIC DELAY; /声明函数为公共函数RSEG ?PR?DELAY; /函数可被连接器放置在任何地方DELAY:MOV R7,#10DEL0: MOV R6,#20DEL1: DJNZ R6,DEL1DJNZ R7,DEL0单片机C 语言与汇编语言的混合编程陈百良( 中山火炬职业技术学院职高部广东中山528437)【摘要】汇编语言的机器代码生成效率高、执行速度快, 但可读性却并不强; 而C 语言的可读性和可移植性却远远超过汇编语言, 用C 语言开发中大型软件的周期要比用汇编语言短很多, 但C 语言很难解决高时效性等代码编写的问题, 此时便可利用汇编语言来实现。本文便是针对这一问题, 详细介绍了单片机C 语言与汇编语言混合编程的实现方法。【关键词】C 语言; 汇编语言; 混合编程IT 技术论坛60科技信息SCIENCE & TECHNOLOGY INFORMATION 2008 年第6 期科RETEND2.1.2 C 文件的格式在C 语言中, 调用汇编函数之前必须先用extern 声明此函数。其实例example2.c 如下:*example2.c*#include extern void delay(); /声明此函数为外部函数void main(void)P2=1;delay();P2=0;2.2 C 语言调用传递参数的汇编函数2.2.1 汇编函数接收参数的方式在C 语言与汇编函数之间传递参数的方式有两种: 一种是通过寄存器传递参数; 另一种是当要传递的参数多于3 个时, 剩余的参数将在默认的存储器中进行。C 语言将不同类型的实参存入相应的寄存器或存储器中, 在汇编函数中只需对相应的寄存器或存储器进行操作,即达到接收参数的目的。不同类型的数据及其传递参数的寄存器如下表所示:2.2.2 文件格式传递参数的汇编函数与不传递参数的汇编函数的格式类似, 不同之处是传递参数的汇编函数名必须以下划线“_”为首字符。在C 语言中, 调用汇编函数之前同样先用extern 声明此函数为外部函数, 不同之处是函数具有参数。其实例delay1.asm、example3.c 如下:*delay1.asm*?PR?_DELAY?_DELAY SEGMENT CODEPUBLIC _DELAYRSEG ?PR?_DELAY?_DELAY_DELAY:MOV 09H, R7DEL0: MOV R7, 09HDEL1: DJNZ R7,DEL1DJNZ R6,DEL1RETEND*example3.c*#include extern void DELAY(unsigned int j);main()P2=1;DELAY(0x1213);P2=0;C 文件example3.c 的SRC 文件如下:; .example3.SRC generated from: example3.c?PR?main?EXAMPLE3 SEGMENT CODEEXTRN CODE (_DELAY)EXTRN CODE (?C_STARTUP)PUBLIC main; #include ; extern void DELAY(unsigned int j); main()RSEG ?PR?main?EXAMPLE3main:USING 0; SOURCE LINE # 3; ; SOURCE LINE # 4; P2=1; SOURCE LINE # 5MOV P2,#01H; DELAY(0x1213); SOURCE LINE # 6MOV R7,#013HMOV R6,#012HLCALL _DELAY; P2=0; SOURCE LINE # 7CLR AMOV P2,A; ; SOURCE LINE # 8RET; END OF mainEND由example3.SRC 文件可以看出: C 程序调用汇编函数, 在编译过程自动加上首字符“_”, 所以汇编函数名必须以下划线“_”为首字符。另外从example3.SRC 中可以清楚的知道参数unsigned int j 的高位存入R6 中, 低位存入R7 中, 所以汇编函数只有通过寄存器R6、R7 才能接收到正确的参数。3.汇编和C 的变量调用3.1 汇编程序中访问c 程序中的变量在汇编程序中, 用_XX 就可以访问C 中的变量XX 了。访问数组时, 可以用“_XX+偏移量”来访问, 如_XX+3 访问了数组中的“XX3”。3.2 C 程序中访问汇编程序中的变量如果C 程序需要访问汇编程序中的变量, 则汇编程序中的变量名必须以下划线为首字符, 并用global 使之成为全局变量。4.结束语本文虽然没有涉及单片机C 语言与汇编语言混合编程的所有知识点, 但完全能够满足混合编程的需要, 尤其对初学者, 可以让他们轻松的掌握混合编程的方法。【参考文献】 1 于永, 戴佳, 常江编著.51 单片机C 语言常用模块与综合系统设计实例精讲.北京: 电子工业出版社.2007.4. 2 赵亮, 侯国锐等编著.单片机C 语言编程与实例.北京: 人民邮电出版社.2003. 3 张志良编著.单片机原理与控制技术.北京: 机械工业出版社.2001. 责任编辑: 韩铭;这是被CALLT549.C调用的TLC549汇编程序,文件名为STLC549.ASMNAME tlc549 ;定义模块名?PR?tlc549 SEGMENT CODE;/在程序存储区中定义段PUBLIC tlc549 ;/声明函数为公共函数RSEG ?PR?tlc549 ;/函数可被连接器放置在任何地方CLK EQU P3.0DOUT EQU P3.1CS EQU P3.2/*c wen jian zhong wei extern uchar tlc549(uchar); /把a_func(uchar)声明为外部函数_tlc549: NAME _tlc549 ;定义模块名?PR?_tlc549 SEGMENT CODE;/在程序存储区中定义段PUBLIC _tlc549 ;/声明函数为公共函数RSEG ?PR?_tlc549 ;/函数可被连接器放置在任何地方CLK EQU P3.0DOUT EQU P3.1CS EQU P3.2 */tlc549: CLR CLK SETB CS CLR CS MOV R1,#08H ;串行转换部分LOOP: SETB CLK CLR CLK MOV C,DOUT RLC A NOP DJNZ R1,LOOP setb CS MOV R7,A ;将结果放入R7中,为返回值 RET END#include#include#define uchar unsigned char#define uint unsigned intsbit lcden=P34;sbit lcdrs=P35;void delay(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);/*void delay10us() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();void delay7us() _nop_();_nop_();_nop_();void delay49us() delay10us(); delay10us(); delay10us(); delay10us(); delay7us();void delay100us() delay49us(); delay49us(); */ void write_com(uchar com)lcdrs=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;void write_data(uchar date)lcdrs=1;P0=date;delay(5);lcden=1;delay(5);lcden=0;void write_lcd(uchar x,char *cha) uchar length,i=0;write_com(x);for(length=0;chalength!=0;length+); for(i=0;ilength;i+)write_data(chai);delay(5);void write_ft(float t)/显示float型函数uchar s1,s2,s3,s4;uint tt;tt=t*100;s1=tt/1000;s1+=0x30;s2=tt%1000/100;s2+=0x30;s3=tt%1000%100/10;s3+=0x30;s4=tt%10;s4+=0x30;write_data(s1);write_data(s2);write_data(46);write_data(s3);write_data(s4); void init()lcden=0;write_com(0x38);/设置16*2显示? write_com(0x0c);/设置开显示,不显示光标write_com(0x06);/写一个字符后地址指针加1write_com(0x01);/显示清0,数据指针清0 /* 这是调用TLC549的汇编程序(STLC549.ASM)的C51程序, */* 文件名CALLT549.C */* 功能:本程序主要是读出输入通道ANALOG IN的 */* 模数转换值,并将转换值放在变量chai中。 */#includeuchar chai; /把全局变量chai声明为外部变量 extern uchar tlc549(); /把a_func(uchar)声明为外部函数extern uint tlc1543(uchar );void main()float t;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论