- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《MC9S12XS单片机原理及嵌入式系统开发》 4.2 C语言编程元素 4.2.8 函数 6.函数间参数的传递 在函数的调用过程中,调用者,即函数的触发者可以向该函数传递多个参数。以上面一个例子作为参考,调用compute函数时,需要传递两个整型参数,因为该函数在定义和声明时就已经确定了两个参数。 如果单纯使用C语言编写程序,可以不必关心函数间参数是如何传递的。但是如果希望汇编语言编写的子程序和C语言编写的函数实现相互调用,则汇编语言编写的子程序与C语言编写的函数应该具有相同的格式,这样汇编语言程序就可以在C程序中被调用,同样汇编语言程序也可以调用C的函数。必须彻底弄清楚函数的结构和参数传递方法,才能使汇编语言编写的子程序符合C语言的函数格式,这里提供一种分析方法。 《MC9S12XS单片机原理及嵌入式系统开发》 4.2 C语言编程元素 4.2.8 函数 6.函数间参数的传递 在C程序中,参数都是通过堆栈传递的,使用的C编译器不同,参数进入堆栈的顺序以及最后一个参数或第一个参数保存在什么地方也会有所不同,故与汇编语言程序的接口方式也会不同。在开发嵌入式应用程序中,因不可避免地会使用到汇编语言,故使用一个新的C交叉编译工具软件时,首先要搞清楚汇编语言程序和C程序之间是如何传递参数的。下面的例子是分析说明不同编译器是如何处理参数传递的,这里以Freescale公司的CodeWarrior编译器为例分析说明。 在C中定义以下函数 编译器生成如下汇编代码 《MC9S12XS单片机原理及嵌入式系统开发》 4.2 C语言编程元素 4.2.8 函数 6.函数间参数的传递 在C中调用上面定义的函数 编译器生成如下汇编代码 《MC9S12XS单片机原理及嵌入式系统开发》 4.2 C语言编程元素 4.2.8 函数 6.函数间参数的传递 (1)返回参数 对于函数返回的参数,相当于return(n)中的n值,如果n是一个单字节数据(char),则在B寄存器中,即D寄存器的低字节;如果n是一个双字节数据(int),在D寄存器中,低字节在B寄存器中,高字节在A寄存器中,对于返回值n是其他数据类型,则返回一个指向n的指针,也在D寄存器中。 (2)定义函数 定义函数时,如果只有一个形式参数,C程序会默认该参数已经放在D寄存器中,参数类型定义同上述返回参数;如果有两个以上的形式参数,最后一个参数(最右端的)在D中,可以以堆栈指针为基地址,加上偏移量寻址其他参数,计算偏移量时要多加2,目的是避开调用该函数时堆栈中保存的程序返回地址。左边第一个参数偏移量值最大,上例中程序调用时堆栈数据结构如图4.2所示。 《MC9S12XS单片机原理及嵌入式系统开发》 4.2 C语言编程元素 4.2.8 函数 6.函数间参数的传递 (3)调用函数(形式参数数目是固定的) 如果函数有固定数目的两个以上的形式参数,调用前,从第一个参数(最左端的)开始,从左至右逐个压入堆栈,留最后一个参数在D中,然后调用该函数。故在用汇编语言编写该函数时,存取这些参数,应该到堆栈区以SP为指针,以偏移量+2,+4,…,进行存取。 (4)调用函数(形式参数数目是不固定的) 如果函数的形式参数数目是不固定的,如printf()函数,括号内为形式参数表,此时调用函数参数的入栈顺序和(3)相反,编译器会从右向左将参数全部推入堆栈。故定义函数时,到堆栈中访问这些形式参数时,偏移量的顺序也和固定数目的参数情况相反。 注意:计算偏移量时要多加3,目的是避开调用过程中本身压入堆栈的子程序返回地址。可以模仿C交叉编译器,用SP寄存器间址;也可以用指令TSX将堆栈指针传给IX,用IX寄存器间址替代SP寄存器间址。 《MC9S12XS单片机原理及嵌入式系统开发》 4.3 C程序编译器与交叉编译器 C语言程序设计需要两个编译器。一个编译器在主机上运行,编译器生成目标文件,编译器可以是Turbo C、Borland C 、C++、VC等高级语言,用于开发、设计、测试以及调试目标系统;另一个编译器是交叉编译器,交叉编译器也是在主机上运行的,但是它为目标系统生成机器代码,对于大多数的嵌入式系统微处理器和微控制器来说,目标系统多选择指定的或者商用的交叉编译器使用。主机往往同时运行一个提供完整开发环境的编译器和交叉编译器,这意味着可以在主机上仿真、调试、模拟目标系统。 《MC9S12XS单片机原理及嵌入式系统开发》 4.3 C程序编译器
原创力文档


文档评论(0)