ARM体系结构与编程(第2版)第6章_第1页
ARM体系结构与编程(第2版)第6章_第2页
ARM体系结构与编程(第2版)第6章_第3页
ARM体系结构与编程(第2版)第6章_第4页
ARM体系结构与编程(第2版)第6章_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第6章章 ATPCS介绍介绍 ATPCS即即ARM-THUMB procedure call standard的的简称。简称。 PCS规定了应用程序的函数可以如何分开地写,分规定了应用程序的函数可以如何分开地写,分开地编译,最后将它们连接在一起,所以它实际上定义开地编译,最后将它们连接在一起,所以它实际上定义了一套有关过程(函数)调用者与被调用者之间的协议了一套有关过程(函数)调用者与被调用者之间的协议。 为了使单独编译的为了使单独编译的C语言程序和汇编程序之语言程序和汇编程序之间能够相互调用,必须为子程序间的调用制定间能够相互调用,必须为子程序间的调用制定一定的规则。一定的规则。ATPCS

2、就是就是ARM程序和程序和Thumb程序中子程序调用的基本规则。程序中子程序调用的基本规则。26.1 ATPCS概述概述ATPCS规定了一些子程序间调用的基本规则。这规定了一些子程序间调用的基本规则。这些基本规则包括子程序调用过程中寄存器的使用规些基本规则包括子程序调用过程中寄存器的使用规则、数据栈的使用规则、参数的传递规则。为适应则、数据栈的使用规则、参数的传递规则。为适应一些特定的需要,对这些基本的调用规则进行一些一些特定的需要,对这些基本的调用规则进行一些修改,得到几种不同的子程序调用规则。这些特定修改,得到几种不同的子程序调用规则。这些特定的调用规则包括:的调用规则包括:支持数据栈限制

3、检查的ATPCS。支持只读段位置无关(ROPI)的ATPCS。支持可读写段位置无关(RWPI)的ATPCS。支持ARM程序和Thumb程序混合使用的ATPCS。处理浮点运算的ATPCS。36.1 ATPCS概述概述使用使用ADS的的C语言编译器编译的语言编译器编译的C语言子程序满足语言子程序满足用户指定的用户指定的ATPCS类型。而对于汇编语言程序来类型。而对于汇编语言程序来说,完全要依赖用户来保证各子程序满足选定的说,完全要依赖用户来保证各子程序满足选定的ATPCS类型。具体来说,汇编语言子程序必须满类型。具体来说,汇编语言子程序必须满足下面足下面3个条件:个条件:在子程序编写时必须遵守相应

4、的ATPCS规则。数据栈的使用要遵守相应的ATPCS规则。在汇编编译器中使用-apcs选项。46.2 基本基本ATPCS基本基本ATPCS规定了在子程序调用时的一些基本规规定了在子程序调用时的一些基本规则,包括下面则,包括下面3方面的内容:方面的内容:各寄存器的使用规则及其相应的名称。数据栈的使用规则。参数传递的规则。相对于其他类型的相对于其他类型的ATPCS,满足基本,满足基本ATPCS的程的程序的执行速度更快,所占用的内存更少。但是它不序的执行速度更快,所占用的内存更少。但是它不能提供以下的支持:能提供以下的支持:ARM程序和Thumb程序相互调用。数据以及代码的位置无关的支持。子程序的可

5、重入性。数据栈检查的支持。56.2.1 寄存器的使用规则寄存器的使用规则寄存器的使用必须满足下面的规则:寄存器的使用必须满足下面的规则:子程序间通过寄存器R0R3来传递参数。这时,寄存器R0R3可以记作A0A3。被调用的子程序在返回前无须恢复寄存器R0R3的内容。在子程序中,使用寄存器R4R11来保存局部变量。这时,寄存器R4R11可以记作V1V8。如果在子程序中使用到了寄存器V1V8中的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值;对于子程序中没有用到的寄存器则不必进行这些操作。在Thumb程序中,通常只能使用寄存器R4R7来保存局部变量。寄存器R12用作子

6、程序间的scratch 寄存器,记作ip。在子程序间的连接代码段中常有这种使用规则。 在函数返回时使用该寄存器出栈66.2.1 寄存器的使用规则寄存器的使用规则寄存器R13用作数据栈指针,记作sp。在子程序中,寄存器R13不能用作其他用途。寄存器sp在进入子程序时的值和退出子程序时的值必须相等。寄存器R14称为连接寄存器,记作lr。它用于保存子程序的返回地址。如果在子程序中保存了返回地址,寄存器R14则可以用作其他用途。寄存器R15是程序计数器,记作pc。它不能用作其他用途。7Uboot程序中主程序调用 cpu_init_crit函数,在这个cpu_init_crit函数中有下面的代码:mov

7、 ip, lrbl lowlevel_initmov lr, ipmov pc, lr这个代码在调用lowlevel_init函数之前,先将lr存储在R12,之后在lowlevel_init函数调用返回之后使用mov lr,ip将之前保存的返回地址再一次存储到lr寄存器。86.2.2 数据栈的使用规则数据栈的使用规则栈指针通常可以指向不同的位置。当栈指针指向栈顶元素栈指针通常可以指向不同的位置。当栈指针指向栈顶元素(即最后一个入栈的数据元素即最后一个入栈的数据元素)时,称为时,称为FULL栈;当栈指针栈;当栈指针指向与栈顶元素相邻的一个可用数据单元时,称为指向与栈顶元素相邻的一个可用数据单元时

8、,称为EMPTY栈。栈。数据栈的增长方向也可以不同。当数据栈向内存地址减小的数据栈的增长方向也可以不同。当数据栈向内存地址减小的方向增长时,称为方向增长时,称为DESCENDING栈;当数据栈向内存地址栈;当数据栈向内存地址增加的方向增长时,称为增加的方向增长时,称为ASCENDING栈。栈。综合这两种特点,可以有以下综合这两种特点,可以有以下4种数据栈。种数据栈。FD:Full Descending。ED:Empty Descending。FA:Full Ascending。EA:Empty Ascending。96.2.2 数据栈的使用规则数据栈的使用规则ATPCS规定数据栈为规定数据栈为

9、FD类型,并且对数据栈的操类型,并且对数据栈的操作是作是8字节对齐的。下面是一个数据栈的示例字节对齐的。下面是一个数据栈的示例(如图如图6.1所示所示)及其相关的名词。及其相关的名词。数据栈的栈指针(Stack Pointer)数据栈的基地址(Stack Base)数据栈界限(Stack Limit)已占用的数据栈(Used Stack)未占用的数据栈(Unused Stack)数据栈中的数据帧(Stack Frames)10 栈的基地址 栈指针 栈的上限地址 已使用的 栈空间 未使用的 栈空间 栈中的数据 6.2.2 数据栈的使用规则数据栈的使用规则在在ARMv5TE中,批量传送指令中,批量

10、传送指令LDRD/STRD要求要求数据栈是数据栈是8字节对齐的,以提高数据传送的速度。字节对齐的,以提高数据传送的速度。用用ADS编译器产生的目标文件中,外部接口的数据编译器产生的目标文件中,外部接口的数据栈都是栈都是8字节对齐的,并且编译器将告诉连接器:字节对齐的,并且编译器将告诉连接器:本目标文件中的数据栈是本目标文件中的数据栈是8字节对齐的。而对于汇字节对齐的。而对于汇编程序来说,如果目标文件中包含了外部调用,则编程序来说,如果目标文件中包含了外部调用,则必须满足下列条件:必须满足下列条件:外部接口的数据栈必须是8字节对齐的。也就是要保证在进入该汇编代码后,直到该汇编代码调用外部程序之间

11、,数据栈的栈指针变化偶数个字(如栈指针加2个字,而不能为加3个字)。在汇编程序中使用PRESERVE8伪操作告诉连接器,本汇编程序数据栈是8字节对齐的。116.2.3 参数传递规则参数传递规则1. 参数个数可变的子程序的参数传递规则参数个数可变的子程序的参数传递规则 对于参数个数可变的子程序,但参数不超过对于参数个数可变的子程序,但参数不超过4个时,可以使用寄存器个时,可以使用寄存器R0R3来来传递参数;当参数超过传递参数;当参数超过4个时,还可以使用数据栈来传递参数。个时,还可以使用数据栈来传递参数。 在参数传递时,将所有参数看作是存放在连续的内存单元中的字数据。然在参数传递时,将所有参数看

12、作是存放在连续的内存单元中的字数据。然后,依次将各字数据传送到寄存器后,依次将各字数据传送到寄存器R0、R1、R2、R3中,如果参数多于中,如果参数多于4个,将个,将剩余的字数据传送到数据栈中,入栈的顺序与参数顺序相反,即最后一个字数剩余的字数据传送到数据栈中,入栈的顺序与参数顺序相反,即最后一个字数据先入栈。据先入栈。 按照上面的规则,一个浮点参数可以通过寄存器传递,也可以通过数据栈传按照上面的规则,一个浮点参数可以通过寄存器传递,也可以通过数据栈传递。递。2. 参数个数固定的子程序的参数传递规则参数个数固定的子程序的参数传递规则各个浮点参数按顺序处理。为每个浮点参数分配FP寄存器。分配的方

13、法是,满足该浮点参数需要的且编号最小的一组连续的FP寄存器。1213146.2.3 参数传递规则参数传递规则3. 子程序结果返回规则子程序结果返回规则结果为一个32位的整数时,可以通过寄存器R0返回。结果为一个64位整数时,可以通过寄存器R0和R1返回,依次类推。结果为一个浮点数时,可以通过浮点运算部件的寄存器f0、d0或者s0来返回。结果为复合型的浮点数(如复数)时,可以通过寄存器f0fN或者d0dN来返回。对于位数更多的结果,需要通过内存来传递。156.3 几种特定的几种特定的ATPCS几种特定的几种特定的ATPCS是在遵守基本的是在遵守基本的ATPCS同同时,增加一些规则以支持一些特定的

14、功能。时,增加一些规则以支持一些特定的功能。166.3.1 支持数据栈限制检查的支持数据栈限制检查的ATPCS1. 支持数据栈限制检查的支持数据栈限制检查的ATPCS的基本原理的基本原理2. 编写遵守支持数据栈限制检查的编写遵守支持数据栈限制检查的ATPCS的汇编的汇编语言程序语言程序(1)数据栈小于256字节的叶子子程序(2)数据栈小于256字节的非叶子子程序(3)数据栈大于256字节的子程序176.3.2 支持只读段位置无关支持只读段位置无关(ROPI)的的ATPCS1. 支持只读段位置无关支持只读段位置无关(ROPI)的的ATPCS的应用场合的应用场合程序在运行期间动态加载到内存中。程序

15、在不同的场合,与不同的程序组合后加载到内存中。在运行期间映射到不同的地址。在一些嵌入式系统中,将程序发在ROM中,运行时再加载到RAM中不同的地址。2. 遵守支持只读段位置无关遵守支持只读段位置无关(ROPI)的的ATPCS的程序设计的程序设计当ROPI段中的代码引用同一个ROPI段中的符号时,必须是基于PC的。当ROPI段中的代码引用另一个ROPI段中的符号时,必须是基于PC的,并且两个ROPI段的位置关系必须固定。其他被ROPI段中的代码引用的必须是绝对地址,或是基于sb的可写数据。ROPI段移动后,对ROPI中符号的引用要做相应的调整。186.3.3 支持可读写段位置无关支持可读写段位置

16、无关(RWPI)的的ATPCS如果一个程序中所有的可读写段都是位置无关,则如果一个程序中所有的可读写段都是位置无关,则称该程序遵守支持可读写段位置无关称该程序遵守支持可读写段位置无关(RWPI)的的ATPCS。使用支持可读写段位置无关。使用支持可读写段位置无关(RWPI)的的ATPCS可以避免必须将程序存放到特定的位置。可以避免必须将程序存放到特定的位置。这时寄存器这时寄存器R9通常用作静态基址寄存器,记作通常用作静态基址寄存器,记作sb。可重入的子程序可以在内存中同时有多个实例,各可重入的子程序可以在内存中同时有多个实例,各个实例拥有独立的可读写段。在生成一个新的实例个实例拥有独立的可读写段

17、。在生成一个新的实例时,时,sb指向该实例的可读写段。指向该实例的可读写段。RWPI段中的符号段中的符号的计算方法为:连接器首先计算出该符号相对于的计算方法为:连接器首先计算出该符号相对于RWPI段中某一特定位置的偏移量,通常该特定位段中某一特定位置的偏移量,通常该特定位置选为置选为RWPI段的第一个字节处;在程序运行时,段的第一个字节处;在程序运行时,将该偏移量加到将该偏移量加到sb上,即可生成该符号的地址。上,即可生成该符号的地址。196.3.4 支持支持ARM程序和程序和Thumb程序混合使用的程序混合使用的ATPCS在编译或者汇编时,使用在编译或者汇编时,使用/interwork告诉编

18、译器告诉编译器(或或汇编器汇编器)生成的目标代码遵守支持生成的目标代码遵守支持ARM程序和程序和Thumb程序混合使用的程序混合使用的ATPCS。它用在以下场。它用在以下场合:合:程序中存在ARM程序调用Thumb程序的情况。程序中存在Thumb程序调用ARM程序的情况。需要连接器来进行ARM状态和Thumb状态切换的情况。在下述情况下,使用选项/nointerwork。程序中不包含Thumb程序。用户自己进行ARM状态和Thumb状态切换。其中,选项/nointerwork是默认的选项。206.3.5 处理浮点运算的处理浮点运算的ATPCSATPCS支持支持VFP体系和体系和FPA体系两种不同的浮点硬体系两种不同的浮点硬件体系和指令集。两种体系对应的代码不兼容。件体系和指令集。两种体系对应的代码不兼容。相应地,相应地,ADS的编译器和汇编器有下面的编译器和汇编器有下面6种与浮点种与浮点数相关的选项:数相关的选项:-fpu VFP-fpu FPA-fpu softVFP-fpu softVFP+VFP-

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论