第3章4 ARM指令集及程序设计_第1页
第3章4 ARM指令集及程序设计_第2页
第3章4 ARM指令集及程序设计_第3页
第3章4 ARM指令集及程序设计_第4页
第3章4 ARM指令集及程序设计_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1、3.4 ATPCS介绍1n完全使用汇编语言来编写程序会非常的繁琐,因此通常情况下,只是使用汇编程序来完成少量必须由汇编程序才能完成的工作,而其它工作则由C语言程序来完成。这样一来,我们实际上就是在进行汇编和C的混合编程,甚至同一个程序的汇编源文件和C源文件是由不同的程序员编写的。在这种情况下,要想使不同程序员编写的汇编代码和C代码能耦合的很好,则必须有一个双方都必须遵守的规则,这就是ATPCS规则。n为了使单独编译的C语言程序和汇编程序之间能够相互调用,必须为子程序间的调用规定一定的规则。ATPCS就是ARM程序和Thumb程序中子程序调用的基本规则。什么是什么是ATPCS规则规则231 AT

2、PCS概述nATPCS规定了一些子程序间调用的基本规则。这些基本规则包括子程序调用过程中寄存器、数据栈的使用规则以及参数的传递规则。 n这些特定的调用规则包括:q支持数据栈限制检查的ATPCS。q支持只读段位置无关位置无关(ROPI)的ATPCS。q支持可读写段位置无关(RWPI)的ATPCS。q支持ARM程序和Thumb程序混合使用的ATPCS。q处理浮点运算的ATPCS。41.1 ATPCS概述n使用ADS的C语言编译器编译的C语言子程序满足用户指定的ATPCS类型。n对于汇编语言程序来说,完全要依赖用户来保证各子程序满足选定的ATPCS类型。具体来说,汇编语言子程序必须满足下面3个条件:

3、q在子程序编写时必须遵守相应的ATPCS规则。q数据栈的使用要遵守相应的ATPCS规则。q在汇编编译器中使用apcs选项。51.2 基本ATPCSn基本ATPCS规定了在子程序调用时的一些基本规则,包括下面3方面的内容:q各寄存器的使用规则及其相应的名称。q数据栈的使用规则。q参数传递的规则。61.2.1 寄存器的使用规则n寄存器的使用必须满足下面的规则。q子程序间通过寄存器R0R3来传递参数传递参数。 q在子程序中,使用寄存器R4R11来保存局部变量保存局部变量。 q寄存器R12用作子程序调用中临时寄存器,记作ip。在子程序之间的连接代码段中常常有这种使用规则。q寄存器R13用作数据栈指针,

4、记作sp。在子程序中寄存器R13不能用作其他用途。寄存器sp在进入子程序时的值和退出子程序时的值必须相等。q寄存器R14称为链接寄存器,记作lr。 q寄存器R15是程序计数器,记作pc。它不能用作其他用途。71.2.2 数据栈使用规则n栈指针通常可以指向不同的位置。当栈指针指向栈顶元素(即最后一个入栈的数据元素)时,称为FULL栈;当栈指针指向与栈顶元素(即最后一个入栈的数据元素)相邻的一个可用数据单元时,称为EMPTY栈。n综合这两种特点可以有以下4种数据栈。qFD Full DescendingqED Empty DescendingqFA Full AscendingqEA Empty

5、Ascending81.2.2 数据栈使用规则n下面是一个数据栈的示例(如图6.1所示)及其相关的名词。 栈基地址 栈指针 栈的上限地址 已使用的 栈空间 未使用的 栈空间 栈中数据 91.2.2 数据栈使用规则q数据栈栈指针(stack pointer) 是指最后一个写入栈的数据的内存地址。q数据栈的基地址(stack base) 指数据栈的最高地址。由于ATPCS中数据栈是FD类型的,实际上数据栈中最早入栈的数据占据的内存单元是基地址的下一个内存单元。q数据栈界限(stack limit) 是指数据栈中可以使用的最低的内存单元的地址。101.2.2 数据栈使用规则(续)q已占用的数据栈(u

6、sed stack) 是指数据栈的基地址和数据栈栈指针之间的区域。其中包括数据栈栈指针对应的内存单元,但不包括数据栈的基地址对应的内存单元。q未占用的数据栈(unused stack) 是指数据栈栈指针和数据栈界限之间的区域。其中包括数据栈界限对应的内存单元,但不包括数据栈栈指针对应的内存单元。q数据栈中的数据帧数据帧(stack frames) 是指在数据栈中,为子程序分配的用来保存寄存器和局部变量的区域。1.2.3 参数传递规则n根据参数个数是否固定,可以将子程序分为参数个数固定的子程序和参数个数可变化的子程序。n这两种子程序的参数传递规则是不一样的。参数个数可变子程序参数传递规则 n对于

7、参数个数可变的子程序,当参数个数不超过4个时,可以使用寄存器R0R3来传递参数;当参数超过4个时,还可以使用堆栈来传递参数。n在传递参数时,将所有参数看作是存放在连续的内存字单元的字数据。然后,依次将各字数据传递到寄存器R0,R1,R2和R3中。如果参数多于如果参数多于4个,则将剩余的字数据传递到堆栈中。个,则将剩余的字数据传递到堆栈中。入栈的顺序与参数传递顺序相反,即最后一个字数据先入栈。参数个数固定子程序参数传递规则n如果系统不包含浮点运算的硬件部件,浮点参数会通过相应的规则转换成整数参数(若没有浮点参数,此步省略),然后依次将各字数据传送到寄存器R0R3中。如果参数多于4个,将剩余的字数

8、据传送堆栈中,入栈的顺序与参数顺序相反,即最后一个字数据先入栈。在参数传递时,将所有参数看作是存放在连续的内存字单元的字数据。子程序结果返回规则n子程序中结果返回的规则如下:q结果为一个32位整数时,可以通过寄存器R0返回;q结果为一个64位整数时,可以通过寄存器R0和R1返回;q结果为一个浮点数时,可以通过浮点运算部件的寄存器f0、d0或s0来返回;q结果为复合型浮点数(如复数)时,可以通过寄存器f0fn或d0dn来返回;q对于位数更多的结果,需要通过内存来传递。 调用ARM汇编语言子程序n在ARM汇编语言中,子程序调用是通过BL指令完成的BL指令的语法格式如下:qBL subnameq其中

9、,subname是调用的子程序的名称。nBL指令完成两个操作:将子程序的返回地址放在LR寄存器中,同时将PC寄存器值设置成目标子程序的第一条指令地址。n在子程序返回时可以通过将LR寄存器的值传送到PC寄存器中来实现。n子程序调用时通常使用寄存器R0R3来传递参数和返回结果。调用汇编子程序举例n子程序DOADD完成加法运算,操作数放在R0和R1寄存器中,结果放在R0中。AREA EXAMPLE2, CODE, READONLYENTRYstartMOV r0, #10 ;R0设置输入参数MOV r1, #3 ;R1设置输入参数BLdoadd;调用子程序doadd.doaddADD r0, r0,

10、 r1 ;子程序实体MOVpc,lr ;从子程序中返回ENDint func1(int a, int b, int c, int d) return a+b+c+d;int caller1(void) return func1(1,2,3,4); func1 0 x000000 : ADD r0,r0,r1 0 x000004 : ADD r0,r0,r2 0 x000008 : ADD r0,r0,r3 0 x00000c : MOV pc,lr caller1 0 x000014 : MOV r3,#4 0 x000018 : MOV r2,#3 0 x00001c : MOV r1,#2

11、 0 x000020 : MOV r0,#1 0 x000024 : BL func1参数传递举例参数传递举例 (4 parameters)181.3 几种特定的ATPCSn几种特定的ATPCS是在遵守基本的ATPCS同时,增加一些规则以支持一些特定的功能:q支持数据栈限制检查的ATPCS。q支持只读段位置无关(ROPI)的ATPCS。q支持可读写段位置无关(RWPI)的ATPCS。q支持ARM程序和Thumb程序混合使用的ATPCS。q处理浮点运算的ATPCS。191.3.1 支持数据栈限制检查的ATPCS1. 支持数据栈限制检查的ATPCSn基本原理q在进行数据栈的检查时,使用寄存器r10

12、作为数据栈限制指针,这是寄存器r10记作sl,用户在程序中不能控制该寄存器。2. 编写遵守支持数据栈限制检查的ATPCS的汇编语言程序q对于C/C+,在编译时指定选项/swst,生产的目标代码将遵守支持数据栈限制检查的ATPCS。q对于汇编程序,用户在编写程序时必须满足支持数据栈限制检查的ATPCS所要求的规则,然后在汇编时指定选项/swst。201.3.2 支持只读段位置无关(ROPI)的ATPCS1. 支持只读段(代码或数据)位置无关(ROPI)的ATPCS的应用场合q程序在运行期间动态加载到内存中;q在不同的场合,与不同的程序组合后加载到内存中;q在运行期间映射到不同的地址;2. 遵守支

13、持只读段位置无关(ROPI)的ATPCS的程序设计(ADR/ADRL伪指令)q引用同一个ROPI段中的符号时必须是基于pc的;qROPI段对其它段的引用必须是绝对地址,或基于sb的可写数据;211.3.3 支持可读写段位置无关(RWPI)的ATPCSn如果一个程序中所有的可读写段都是位置无关,则称该程序遵守支持可读写段位置无关(RWPI)的ATPCS。使用支持可读写段位置无关(RWPI)的ATPCS可以避免必须将程序存放到特定的位置。这时寄存器R9通常用作静态基址寄存器,记作sb。可重入的子程序可以在内存中同时有多个实例,各个实例拥有独立的可读写段。在生成一个新的实例时,sb指向该实例的可读写

14、段。RWPI段中的符号的计算方法为:连接器首先计算出该符号相对于RWPI段中某一特定位置的偏移量,通常该特定位置选为RWPI段的第一个字节出;在程序运行时,将该偏移量加到sb上即可生成该符号的地址。221.3.4 支持ARM程序和Thumb程序混合使用的ATPCSn在编译或者汇编时,使用/interwork告诉编译器(或汇编器)生成的目标代码遵守支持ARM程序和Thumb程序混合使用的ATPCS。它用在以下场合:q程序中存在ARM程序调用Thumb程序的情况。q程序中存在Thumb程序调用ARM程序的情况。q需要连接器来进行ARM状态和Thumb状态切换的情况。n在下述情况下,使用选项/nointerwork。q程序中不包含Thumb程序。q用户自己进行ARM状态和Thumb状态切换。q其中,选项/nointerwork是默认的选项。231.3.5 处理浮点运算的ATPCSnATPCS支持VFP体系和FPA体系两种不同的浮点硬件体系和指令集。两种体系对应的代码不兼容n相应地,ADS的编译器和汇编器有下面6种与浮点数相关的选项:qfpu VFPqfpu FPAqfpu softVFPqfpu softVFP+VFPqfpu softFPAqfpu none241.3.5 处理浮点运算的ATPCSn当系统中包含有

温馨提示

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

评论

0/150

提交评论