汇编调用C51函数的混合编程.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
汇编调用C51函数的混合编程 目前单片机开发编程语言主要用汇编和C51两种,这两种编程语言各有自己的特点,汇编语言具有实时性强、占用资源少、①有些单片机项目中如果大部分运行时间段是对时序精度要求非常严格控制操作,则必需以汇编为主。②出于成本与体积的考虑,选用的单片机程序存贮器容量有限,采用汇编语言编程,占用资源少③项目中含有少量的数值计算,利用汇编语言编写计算程序并不是一件容易之事,特别有浮点运算更是如此,如果用C51来编写计算子程序则轻易而举。考虑到以上三种因素,我们就可以以汇编为主体,结合对C51计算子程序的调用,完成开发任务。 混合编程中两种语言程序相互调用以及它们之间参数传递必须遵循一定的规则,C51中的函数名运用在汇编中应按表1中的规则进行转换。至于两种语言程序间参数传递一般是通过寄存器进行(也有其它的传递方式),对于单字节数一次最多可传递3个,详见表2。 下面是汇编调用C51完成华氏到摄氏温度整数部分计算的一个简单实例,汇编通过寄存器将参数传给C51函数,C51完成计算后通过寄存器将参数返回给汇编。为简化汇编程序中复杂调用规则声明,C51与汇编之间应避免相互调用对方的变量segment code”一句声明即可。对51单片机而言,目前绝大多数都是在Keil uVision开发环境中编辑、调试完成,以Keil uVision3为例,其编辑、调试窗口如图1所示,汇编调用C51函数的混合编程具体步骤如下: ⑴、单击菜单栏中的“文件”再单击其中的“新建”并键入如下代码,完成汇编语言程序段的编程,并以A51.asm文件名保存。 ?PR?_FtoC?C51 segment code ;对调用C51函数的声明 org 0000H ljmp main org 0030H main: mov sp, #60H ;堆栈栈顶重新设置 mov r7, #41D ;华氏温度41放入寄存器中,传递给C语言函数 lcall ?PR?_FtoC?C51 ;汇编调用C51完成华氏到摄氏整数部分的计算 mov 30H, r7 ;通过R7获得返回值, loop: ljmp loop end ⑵、再次单击“新建”键入如下代码,完成C语言程序段的编程,并以C51.c文件名保存。 #include reg51.h #define uchar unsigned char extern uchar FtoC(uchar F) /* 含有一个参数的C语言函数 */ { uchar C; /*变量C定义*/ C=(F-32)*5/9; /*由华氏温度计算得到摄氏温度*/ return C; /*返回计算结果给汇编*/ } ⑶、单击菜单栏的“工程”,指向“新建”,再单击“新建工程”,在打开的对话框输入一文件名F_C.Uv2并保存,在随后弹开窗口中选择合适单片机芯片型号,点击“确定”按钮点击,完成工程的建立。 ⑷、在Keil uVision3左侧工程小窗口中右击“Source Group 1”,弹出快捷菜单,点击其中“添加文件到组”(如图2所示),在打开的对话框中选择A51.asm,点击“Add” 按钮,完成汇编语言程序加入,用同样的方法将C51.c添加到“Source Group 1”。 ⑸、单击菜单栏的“工程”在弹开的菜单中单击“重建所有的目标文件”命令,执行该命令后Keil uVision3将对上述两原程序进行编译和连接,如果一切正确,会出现“0个错误,0个警告”提示。并产生单片机烧录所需的Hex文件(之前必须在‘目标1’设置选项 中勾选‘产生HEX文件)。 ⑹、单击菜单栏上“调试” 在弹开的菜单中依次单击“启动/停止调试”、“运行”、“停止运行”就可看到以上的混合编程运行结果。 总之单片机开发混合编程中C51调用汇编的实例较多,而鲜有汇编调用C51的介绍,本文只是想在这一方面起抛砖引玉之作用。 参数类型 char int long/float 通用指针 第1个 R7 R6、R7 R4~R7 R1~R3 第2个 R5 R4、R5 R4~R7 R1~R3 第3个 R3 R2、R3 R1~R3 混合编程分类 C51函数名 在汇编中 相应函数名 说明 无参数传递或参数不通过寄存器传递 FUNC FUNC 函数名不变 带有经寄存器传递参数的函数 FUNC1 _FUNC1 函数名前加“_” 再入函数或包含堆栈内的参数传递 FUNC2 _?FUNC2 函数名前加“_?”

文档评论(0)

企管文库 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档