5.ARM汇编语言程序设计.ppt

  1. 1、本文档共100页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
5.ARM汇编语言程序设计

三、C和ARM汇编程序间相互调用 在C和ARM汇编程序之间相互调用必须遵守ATPCS(ARM-Thumb Procedure Call Standard)规则。 C和汇编之间的相互调用可以从以下这三方面来介绍: 汇编程序对C全局变量的访问 在C语言程序中调用汇编程序 在汇编程序中调用C语言程序 1. 汇编程序访问全局C变量 汇编程序可以通过地址间接访问在C语言程序中声明的全局变量。通过使用IMPORT关键词引人全局变量,并利用LDR和STR指令根据全局变量的地址可以访问它们。 对于不同类型的变量,需要采用不同选项的LDR和STR指令,如下所示: unsigned char LDRB/STRB unsigned short LDRH/STRH unsigned int LDR/STR char LDRSB/STRSB short LDRSH/STRSH AREA globals,CODE,READONLY EXPORT asmsubroutine; IMPORT globvar ; asmsubroutine LDR R1,=globvar ;从文字池读globvar的地 ;址,并将其保存到R1 LDR R0,[R1] ;再将其值读入到寄存器R0中 ADD R0,R0,#2 STR R0,[R1] ;修改后再将寄存器R0的值 ;赋予变量globvar MOV PC,LR END 2. 在C语言程序中调用汇编程序 为了保证程序调用时参数的正确传递,汇编程序的设计要遵守ATPCS。在汇编程序中需要使用EXPORT伪操作来声明,使得本程序可以被其它程序调用。同时,在C程序调用该汇编程序之前需要在C语言程序中使用extern关键词来声明该汇编程序。 C源程序: # include stdio.h extern void strcopy(char *d,const char *s) ;用extern声明一个函数为外部函数,可以被其他文件中的函数调用。 int main() { const char *srcstr =“First string-source”; char * dststr =“Second string-destination”; strcopy(dststr,srcstr) ;调用汇编函数strcopy() return(0); } 汇编源程序: AREA SCopy,CODE,READONLY EXPORT strcopy ;用EXPORT伪操作声明该变量可以被其他文件引用,相当于声明了一个全局变量。 Strcopy ;R0指向目标字符串,R1指向源字符串 LDRB R2,[R1],#1 ;字节加载,并更新地址 STRB R2,[R0],#1 ;字节保存,并更新地址 CMP R2,#0 ;检测R2是否等于0 BNE strcopy ;若条件不成立则继续执行 MOV PC,LR ;从子程序返回 END 3. 在汇编程序中调用C语言程序 为了保证程序调用时参数的正确传递,汇编程序的设计要遵守ATPCS。在C程序中不需要使用任何关键字来声明将被汇编语言调用的C程序,但是在汇编程序调用该C程序之前需要在汇编语言程序中使用IMPORT伪操作来声明该C程序。在汇编程序中通过BL指令来调用子程序。 C函数原型: int g(int a,int b,int c,int d,int e) { return a+b+c+d+e; } ////汇编程序调用C程序g()计算5个整数i, 2*i, 3*i, 4*i, 5*i 的和。 汇编源程序: EXPORT f AREA f,CODE,READONLY IMPORT g ;声明该变量函数g( ) STR LR,[SP,#- 4]! ;预先保存LR ADD R1,R0,R0 ; i在R0中,计算2 * i(第2个参数) ADD R2,R1,R0 ;计算3*i(第3个参数) ADD R3,R1,R2 ;计算5*i(第5个参数) STR R3,[SP,#- 4]!

文档评论(0)

yan698698 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档