- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
ARM汇编程序设计8重点
3. 汇编语言子程序调用及返回 子程序的调用 在ARM汇编语言中,子程序调用是通过BL指令来完成的。BL指令的语法格式如下: BL subname 其中,subname是被调用的子程序的名称。 子程序的返回 在返回调用子程序时,转移链接指令保存到LR寄存器(r14)中的值需要拷贝回程序寄存器PC(r15)。 ARM语言选择 由于高级编程语言隐藏了CPU执行指令的许多细节,因此在只关心系统所具有功能,采用高级语言编写程序更为合适。 但是,CPU执行指令的细节差异会反应在系统的非功能特性上,例如系统程序的规模和运行速度。因此,掌握汇编语言程序设计对于嵌入式系统的设计者来说是非常必要的。 ATPCS ATPCS(ARM-Thumb Procedure Call Standard)规定了一些子程序间调用的基本规则,这些规则包括子程序调用过程中寄存器的使用规则,数据栈的使用规则,参数的传递规则。有了这些规则之后,单独编译的C语言程序就可以和汇编程序相互调用。 使用C语言编译器编译的C语言子程序满足用户指定的ATPCS类型。而对于汇编语言来说,则需要用户来保证各个子程序满足ATPCS的要求。 ATPCS规范要点 寄存器的使用规则 堆栈使用规则 参数传递规则 子程序结果返回规则 寄存器的使用规则 子程序间通过寄存器R0~R3来传递参数。 寄存器R0~R3可记作a0~a3。被调用的子程序在返回前无需恢复寄存器R0~R3的内容。 在子程序中,使用寄存器R4~R11来保存局部变量。 寄存器R4~R11可以记作v1~v8。子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值。在Thumb程序中,通常只能使用寄存器R4~R7来保存局部变量。 寄存器R12用作过程调用中间临时寄存器,记作IP。在子程序之间的连接代码段中常常有这种使用规则。 寄存器R13用作堆栈指针,记作SP。 在子程序中寄存器R13不能用作其他用途。寄存器SP在进入子程序时的值和退出子程序时的值必须相等。 寄存器R14称为连接寄存器,记作LR。 它用于保存子程序的返回地址。如果在子程序中保存了返回地址,寄存器R14则可以用作其他用途。 寄存器R15是程序计数器,记作PC。它不能用作其它用途。 ATPCS中的各寄存器在ARM编译器中和汇编器中都是预定义的。 寄存器的使用规则 堆栈使用规则 ATPCS规定堆栈为FD类型,即满递减堆栈,并且对堆栈的操作是8字节对齐。 参数传递规则 对于参数个数可变的子程序,当参数个数不超过4个时,可以使用寄存器R0~R3来传递参数;当参数超过4个时,还可以使用堆栈来传递参数。 子程序结果返回规则 子程序中结果返回的规则如下: 结果为一个32位整数时,可以通过寄存器R0返回; 结果为一个64位整数时,可以通过寄存器R0和Rl返回; 结果为一个浮点数时,可以通过浮点运算部件的寄存器f0、d0或s0来返回; 结果为复合型浮点数(如复数)时,可以通过寄存器f0~fn或d0~dn来返回; 对于位数更多的结果,需要通过内存来传递。 3. ARM高级语言程序设计 一、汇编程序中访问C程序变量 在C中声明的全局变量可以被汇编程序通过地址间接访问 访问方法: 使用IMPORT伪操作声明全局变量 使用LDR指令读取该全局变量的内存地址 根据数据的类型,使用相应的LDR指令读取该全局变 量的值;使用相应的STR指令修改该全局变量的值 例: 相当于C语言中的extern关键词 二、C程序中内嵌汇编指令 在ARM的C程序中可用关键词_ _asm加入一段汇编程序 格式: 在C语言中嵌入ARM汇编时需注意的几个问题 汇编中不能再使用“;”作为注释行的开头,而应使用C 语言中的“/**/”或者“//”进行注释 不能使用一个物理寄存器去改变一个C变量 对于内嵌的汇编代码用到的寄存器,编译器在编译时 会自动加入保存和恢复这些寄存器的代码而不用用户 去管理 不支持ADR、ADRL伪指令 不能用PC寄存器返回当前指令的地址 不支持内存分配的伪操作 三、汇编、C以及C++的相互调用 1、C程序调用汇编程序 使用extern关键词表明strcopy函数是本文件之外定义的 表明该函数是一个全局的函数并可以被其他文件使用 注: 汇编程序使用r0-r3来传递函数的第1-4个参数 若参数多于4个,则多余的参数将被压入堆栈 2、汇编程序调用C程序 * * ARM汇编语言源程序中语句一般由指令、伪操作、宏指令和伪指令组成。 伪操作是ARM汇编语言程序里的一些特殊指令助记符,它的作用
文档评论(0)