- 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 函数 4.函数定义 当某个函数在一个源文件的开始部分声明后,程序员必须在该源文件或其他伴随的源文件中定义这个函数。函数还可以在伴随的库文件中定义。函数定义可以在程序的任何地方进行,但通常都位于主程序后。除了末尾没有分号外,函数定义与函数声明的格式差不多。 4.2 C语言编程元素 4.2.8 函数 4.函数定义 例如,假设前面声明的compute函数接受两个输入参数作为一个向量,计算该向量的长度并返回该长度值。该函数可以作如下定义: 4.2 C语言编程元素 4.2.8 函数 5.函数调用 在程序地任何地方,都可以用函数名和位于一对圆括号中的参数来调用某个函数。仍然以计算向量的长度为例,可以使用如下方式调用该函数。 4.2 C语言编程元素 4.2.8 函数 6.函数间参数的传递 在函数的调用过程中,调用者,即函数的触发者可以向该函数传递多个参数。以上面一个例子作为参考,调用compute函数时,需要传递两个整型参数,因为该函数在定义和声明时就已经确定了两个参数。 如果单纯使用C语言编写程序,可以不必关心函数间参数是如何传递的。但是如果希望汇编语言编写的子程序和C语言编写的函数实现相互调用,则汇编语言编写的子程序与C语言编写的函数应该具有相同的格式,这样汇编语言程序就可以在C程序中被调用,同样汇编语言程序也可以调用C的函数。必须彻底弄清楚函数的结构和参数传递方法,才能使汇编语言编写的子程序符合C语言的函数格式,这里提供一种分析方法。 4.2 C语言编程元素 4.2.8 函数 6.函数间参数的传递 在C程序中,参数都是通过堆栈传递的,使用的C编译器不同,参数进入堆栈的顺序以及最后一个参数或第一个参数保存在什么地方也会有所不同,故与汇编语言程序的接口方式也会不同。在开发嵌入式应用程序中,因不可避免地会使用到汇编语言,故使用一个新的C交叉编译工具软件时,首先要搞清楚汇编语言程序和C程序之间是如何传递参数的。下面的例子是分析说明不同编译器是如何处理参数传递的,这里以Freescale公司的CodeWarrior编译器为例分析说明。 在C中定义以下函数 编译器生成如下汇编代码 4.2 C语言编程元素 4.2.8 函数 6.函数间参数的传递 在C中调用上面定义的函数 编译器生成如下汇编代码 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所示。 4.2 C语言编程元素 4.2.8 函数 6.函数间参数的传递 (3)调用函数(形式参数数目是固定的) 如果函数有固定数目的两个以上的形式参数,调用前,从第一个参数(最左端的)开始,从左至右逐个压入堆栈,留最后一个参数在D中,然后调用该函数。故在用汇编语言编写该函数时,存取这些参数,应该到堆栈区以SP为指针,以偏移量+2,+4,…,进行存取。 (4)调用函数(形式参数数目是不固定的) 如果函数的形式参数数目是不固定的,如printf()函数,括号内为形式参数表,此时调用函数参数的入栈顺序和(3)相反,编译器会从右向左将参数全部推入堆栈。故定义函数时,到堆栈中访问这些形式参数时,偏移量的顺序也和固定数目的参数情况相反。 注意:计算偏移量时要多加3,目的是避开调用过程中本身压入堆栈的子程序返回地址。可以模仿C交叉编译器,用SP寄存器间址;也可以用指令TSX将堆栈指针传给IX,用IX寄存器间址替代SP寄存器间址。 4.3 C程序编译器与交叉编译器 C语言程序设计需要两个编
您可能关注的文档
- 第4 章网玉络营销.ppt
- 第4 电容体式传感器.ppt
- 第4 第2章 第奖8节 补益药课件.ppt
- 第44章统说计指标.ppt
- 第41讲 防火技术及windows防火虎墙技术.ppt
- 第4次课哨 青年的自意识.ppt
- 第44讲随为机事件及其概率64张.ppt
- 第4章 erp辉 的基本功能模块.ppt
- 第46讲随像机抽样、用样本估计总体143张.ppt
- 第4章 excel200胆3子课件.ppt
- 2012-2021北京重点校高一(下)期中语文汇编:词类活用.pdf
- 电力市场与经济运行优化:电力市场优化算法_(28).电力市场中的市场力分析.docx
- 医院培训课件:《俯卧位通气的护理》.pptx
- 电力市场与经济运行优化:电力系统能效优化方法_(1).电力市场基础理论.docx
- 电力市场与经济运行优化:电力系统能效优化方法_(9).电力系统运行与能效优化.docx
- 电力市场与经济运行优化:电力系统能效优化方法_(15).电力市场与环境影响分析.docx
- 电力市场与经济运行优化:电力系统优化调度_(1).电力市场基础与原理.docx
- 电力市场与经济运行优化:电力系统优化调度_(14).电力市场改革政策与影响.docx
- 电力市场与经济运行优化:电力系统运行优化_(4).电力系统运行基础.docx
- 2025年航运行业分析.docx
文档评论(0)