- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
4.3.5 汇编程序调用C函数 C语言调用汇编程序子程序,需要以下步骤: (1)在汇编文件中,用伪指令IMPORT将要调用的C函数引用; (2)如果在函数调用时需传递参数,参数1,2,3,4默认使用寄存器R0~R3传递,如果参数个数多于4个,则使用堆栈传递; (3)如果函数有返回值,则默认用R0返回。 例4-14:在C文件中定义函数sum,实现三个数的相加并返回和。在汇编文件中调用sum子程序。 本章小结 本章通过一个完整的ARM汇编例子入手,给出了ARM汇编程序的基本框架,并详细介绍了编写汇编程序常用的汇编器伪指令,具备了这些基础知识,学生就能自己动手编写汇编程序。 4.2节详细的介绍了顺序程序、分支程序、循环程序和子程序的编写。在顺序程序中,通过对例子的修改,引出8位位图数的概念,并给出缺省文字池和自定义文字池的使用方法。在循环程序中,分别给出计数控制循环和条件控制循环的例子,在子程序中分别讨论了通过寄存器,存储器和堆栈传递参数的方法。在本节最后给出基于查表法的程序设计方法。 4.3节讨论了C与ARM汇编混合编程问题,其中包括C语言内嵌汇编代码、C与汇编文件变量互访。C与汇编之间进行函数(子程序)相互调用时,需要遵循ARM过程调用标准APCS,介绍了APCS标准后,分别通过两小节讲述了C程序调用汇编子程序和汇编程序调用C函数的方法。 在学习本章时,读者可以使用ADS调试书中的例子程序,并参照附录中给出的ADS使用方法,查看程序的运行结果。动手实践能取得更好的学习效果。 习题 1、请写出带有一个代码段和一个数据段的ARM汇编程序框架。 2、画图说明下列数据定义伪指令所分配的存储空间及初始化的数值。 (1) BYTE_VAR DCB “ABCD” ,-5,0x78, 9*10 (2) WORD_VAR DCW -5, 0x12, 0x5678 (3) DWORD_VAR DCD -5, 0x12, 0x567890ab 3、在ADS中编写一段汇编程序,添加题2中的数据定义伪指令,验证题2是否正确完成,并查看BYTE_VAR,WORD_VAR和DWORD_VAR是否连续分配空间,如果没有,请问为什么会出现这种情况呢? 4、语句MOV R1, #0x123456能通过编译吗?如果不行,请进行修改,使之能通过编译。 5. 什么是8位位图数?什么情况下可以使用缺省文字池?什么情况下需要自定义文字池? 6. 编写程序,给定符号函数: ,定义数据段,存放变量x和y,假定x是-9,函数值计算出来存放到y单元。 7、编写程序,定义字变量buf,存放10个带符号数,比较10个数的大小,将最小数存放到min单元,最大数存放到max单元。 8、编写程序,定义立方表tab,存放0~10的立方值,定义变量x,y,假定x=6,查tab表得出x3,存放到y单元。 9、在C程序中内嵌ARM汇编,实现1+2+……+100,并在C程序中将结果输出到屏幕上。 10、在汇编中实现子程序max:两个数比较大小,返回大数,并在C程序中调用。 11、在C程序中实现函数max,两个数比较大小,返回大数,并在汇编程序中调用。 THE END 采用LTORG伪指令自定义文字池,该程序汇编链接成功。一般LTORG伪指令放在跳转指令B之后,使得在数据段中开辟的文字池中存放的数据不被当做指令执行。虚线框住的部分为自定义文字池,实线框住的部分为缺省文字池。 4.2.2 分支程序 ARM汇编分支程序采用转移指令B或条件转移指令BX来实现。 例4-4:给定符号函数: ,假定x是-5。 4.2.3 循环程序 计数控制循环 已知循环次数,可以用计数器控制循环的次数来进行程序的设计。 例4-5:计算1+2+3+……+100的结果,并存放到sum单元。 条件控制循环 有些情况无法确定循环的次数,这时只能通过循环结束的条件来判断是否结束循环。 例4-6:计算1+2+3+……+n,当计算结果大于10000时停止循环,在数据段中定义sum和n两个变量,并将加法和存放到sum单元,将最后一个加数存放到n单元。 4.2.4 子程序 在ARM汇编中,通过BL指令可以实现子程序的调用,在跳转时LR寄存器自动保存紧跟着BL指令的下一条指令的地址。在子程序的结束处,可以通过MOV PC,LR返回主程序中。 子程序的定义一般放在程序结束返回编译器调试环境的语句之后,END之前,这样使得子程序的定义代码参与编译,但不会在定义的位置执行。只有调用该子程序才会执行。 主程序在调用子程序时,往往需要向子程序传递一些参数,同样,子程序在运行完毕后也可能要把结果传回给调用程序。 寄存器传递参数 存储区域传递参数 堆栈传递参数 例4-7:用子程序实现内存块
文档评论(0)