网站大量收购独家精品文档,联系QQ:2885784924

第三章-ARM中C语言与汇编混合编程.ppt

  1. 1、本文档共35页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第3章 ARM中的C语言和汇编混合编程 * ATPCS介绍 内嵌汇编器的使用 汇编和C的相互调用 汇编程序和C程序调用举例 本章内容 3.1 ATPCS介绍 ATPCS规定了ARM程序和Thumb子程序调用的基本规则,目的是为了使单独编译的C语言和汇编程序之间能够相互调用。ATPCS规定的基本规则包括了子程序调用过程中寄存器的使用规则、数据栈的使用规则、参数传递的规则,子程序的返回规则。 3.1.1 寄存器的使用规则 寄存器的使用必须满足以下的规则。 子程序通过寄存器R0-R3来传递参数,记作A0-A3。被调用的子程序在返回前无须恢复寄存器R0-R3的内容。 在子程序中,使用R4-R11来保存局部变量。这时寄存器R4-R11 可以记作V1-V8。如果在子程序中使用到V1-V8的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值;对于子程序中没有用到的寄存器,则不必执行这些操作。 寄存器R12用做子程序间scratch寄存器(用于保存SP,在函数返回时使用该寄存器出栈),记作IP。在子程序的连接代码段中经常会有这种使用规则。 寄存器R13用做数据栈指针,记作SP,在子程序中寄存器R13不能用做其他用途。寄存器SP在进入子程序时的值和退出子程序时的值必须相等。 寄存器R14用做连接寄存器,记作LR。它用于保存子程序的返回地址。如果再子程序中保存了返回地址,则R14可用做其他的用途。 寄存器R15是程序计数器,记作PC,它不能用做其他用途。 需要注意的是ATPCS中的各寄存器在ARM编译器和汇编器中都是预定义的。寄存器的使用规则如下: 3.1.2 数据栈使用规则 栈指针通常可以指向不同的位置。当栈指针指向栈顶元素(即最后一个入栈的数据元素)时,称为Full栈;当栈指针指向与栈顶元素相邻的一个元素时,称为Empty栈。数据栈的增长方向也可以不同。当数据栈向内存减小的地址方向增长时,称为Descending栈;当数据栈向着内存地址增加的方向增长时,称为Ascending栈。 FD(Full Descending):满递减。 ED(Empty Descending):空递减。 FA(Full Ascending): 满递增。 EA(Empty Ascending):空递增。 ATPCS规定数据栈为FD类型,并对数据栈的操作是8字节对齐的。异常中断的处理程序可以使用被中断程序的数据栈,这时用户要保证中断的程序数据栈足够大。下面是一个数据栈的实例及相关的名称。 数据栈指针:指向最后一个写入栈的数据的内存地址。 数据栈的基地址:是指数据栈的最高地址。 已占用的数据栈:是指数据栈的基地址和数据栈栈指针之间的区域。 未占用的数据栈:是指数据栈指针和数据栈界限之间的区域。 数据栈中的数据帧:是指在数据栈中,为子程序分配的用来保存寄存器和局部变量的区域。 3.1.3 参数传递规则 根据参数个数是否固定,可以将子程序分为参数个数固定的子程序和参数个数可变的子程序,这两种子程序的参数传递规则是不同的。 1. 参数个数可变的子程序传递规则 对于参数个数可变的子程序,当参数不超过4个时,可以使用寄存器R0-R3来进行参数传递;当参数超过4个时,还可以使用数据栈来传递参数。 在参数传递时,将所有参数看做存放在连续的内存单元中的字数据,然后依次将各字数据传输到寄存器R0、R1、R2、R3中,如果参数多于4个,将剩余的字数据传输到数据栈中,入栈的顺序与参数顺序相反,即最后一个字数据先入栈。 按照上面的规则,一个浮点数参数可以通过寄存器传递,也可以通过数据栈传递,也可能一半通过寄存器传递,另一半通过数据栈传递。 2. 参数个数固定的子程序参数传递规则 对于参数个数固定的子程序,参数传递与参数个数可变的子程序参数传递规则不同。如果系统包含浮点运算的硬件部件,浮点参数将按照下面的规则传递。 各个浮点参数按顺序处理。 为每个浮点参数分配FP寄存器。 分配的方法是,满足该浮点参数需要的且编号最小的一组连续的FP寄存器,第一个整数参数,通过寄存器R0-R3来传递,其他参数通过数据栈传递。 3. 子程序返回规则 结果为一个32位的整数时,可以通过寄存器R0返回。 结果为一个64位整数时,可以通过R0-R1返回,依次类推。 结果为一个浮点数时,可以通过浮点运算部件的寄存器f0/d0或者s0来返回。 结果为复合的浮点数时,可以通过寄存器f0-fN或者d0-dN来返回。 对于位数更多的结果,需要通过调用内存来传递。 AREA?example,CODE,READONLY?;声明代码段Example ????????ENTRY??????????????????????;程序入口 ????Start? ????????MOV??R3,#4??

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档