第3章4 ARM指令集及程序设计

上传人:豆浆 文档编号:3580048 上传时间:2017-08-05 格式:PPT 页数:24 大小:220.50KB
返回 下载 相关 举报
第3章4 ARM指令集及程序设计_第1页
第1页 / 共24页
第3章4 ARM指令集及程序设计_第2页
第2页 / 共24页
第3章4 ARM指令集及程序设计_第3页
第3页 / 共24页
第3章4 ARM指令集及程序设计_第4页
第4页 / 共24页
第3章4 ARM指令集及程序设计_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《第3章4 ARM指令集及程序设计》由会员分享,可在线阅读,更多相关《第3章4 ARM指令集及程序设计(24页珍藏版)》请在金锄头文库上搜索。

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

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

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

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

5、个数据栈的示例(如图6.1所示)及其相关的名词。,9,1.2.2 数据栈使用规则,数据栈栈指针(stack pointer) 是指最后一个写入栈的数据的内存地址。数据栈的基地址(stack base) 指数据栈的最高地址。由于ATPCS中数据栈是FD类型的,实际上数据栈中最早入栈的数据占据的内存单元是基地址的下一个内存单元。数据栈界限(stack limit) 是指数据栈中可以使用的最低的内存单元的地址。,10,1.2.2 数据栈使用规则(续),已占用的数据栈(used stack) 是指数据栈的基地址和数据栈栈指针之间的区域。其中包括数据栈栈指针对应的内存单元,但不包括数据栈的基地址对应的内

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

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

8、2位整数时,可以通过寄存器R0返回;结果为一个64位整数时,可以通过寄存器R0和R1返回;结果为一个浮点数时,可以通过浮点运算部件的寄存器f0、d0或s0来返回;结果为复合型浮点数(如复数)时,可以通过寄存器f0fn或d0dn来返回;对于位数更多的结果,需要通过内存来传递。,调用ARM汇编语言子程序,在ARM汇编语言中,子程序调用是通过BL指令完成的BL指令的语法格式如下:BL subname其中,subname是调用的子程序的名称。BL指令完成两个操作:将子程序的返回地址放在LR寄存器中,同时将PC寄存器值设置成目标子程序的第一条指令地址。在子程序返回时可以通过将LR寄存器的值传送到PC寄存

9、器中来实现。子程序调用时通常使用寄存器R0R3来传递参数和返回结果。,调用汇编子程序举例,子程序DOADD完成加法运算,操作数放在R0和R1寄存器中,结果放在R0中。AREA EXAMPLE2, CODE, READONLYENTRYstartMOV r0, #10 ;R0设置输入参数MOV r1, #3 ;R1设置输入参数BLdoadd;调用子程序doadd.doaddADD r0, r0, r1 ;子程序实体MOVpc,lr ;从子程序中返回END,int func1(int a, int b, int c, int d) return a+b+c+d;int caller1(void)

10、return func1(1,2,3,4);,func1 0x000000 : ADD r0,r0,r1 0x000004 : ADD r0,r0,r2 0x000008 : ADD r0,r0,r3 0x00000c : MOV pc,lr caller1 0x000014 : MOV r3,#4 0x000018 : MOV r2,#3 0x00001c : MOV r1,#2 0x000020 : MOV r0,#1 0x000024 : BL func1,参数传递举例 (4 parameters),18,1.3 几种特定的ATPCS,几种特定的ATPCS是在遵守基本的ATPCS同时,增

11、加一些规则以支持一些特定的功能:支持数据栈限制检查的ATPCS。支持只读段位置无关(ROPI)的ATPCS。支持可读写段位置无关(RWPI)的ATPCS。支持ARM程序和Thumb程序混合使用的ATPCS。处理浮点运算的ATPCS。,19,1.3.1 支持数据栈限制检查的ATPCS,1. 支持数据栈限制检查的ATPCS基本原理在进行数据栈的检查时,使用寄存器r10作为数据栈限制指针,这是寄存器r10记作sl,用户在程序中不能控制该寄存器。2. 编写遵守支持数据栈限制检查的ATPCS的汇编语言程序对于C/C+,在编译时指定选项/swst,生产的目标代码将遵守支持数据栈限制检查的ATPCS。对于汇

12、编程序,用户在编写程序时必须满足支持数据栈限制检查的ATPCS所要求的规则,然后在汇编时指定选项/swst。,20,1.3.2 支持只读段位置无关(ROPI)的ATPCS,1. 支持只读段(代码或数据)位置无关(ROPI)的ATPCS的应用场合程序在运行期间动态加载到内存中;在不同的场合,与不同的程序组合后加载到内存中;在运行期间映射到不同的地址;2. 遵守支持只读段位置无关(ROPI)的ATPCS的程序设计(ADR/ADRL伪指令)引用同一个ROPI段中的符号时必须是基于pc的;ROPI段对其它段的引用必须是绝对地址,或基于sb的可写数据;,21,1.3.3 支持可读写段位置无关(RWPI)

13、的ATPCS,如果一个程序中所有的可读写段都是位置无关,则称该程序遵守支持可读写段位置无关(RWPI)的ATPCS。使用支持可读写段位置无关(RWPI)的ATPCS可以避免必须将程序存放到特定的位置。这时寄存器R9通常用作静态基址寄存器,记作sb。可重入的子程序可以在内存中同时有多个实例,各个实例拥有独立的可读写段。在生成一个新的实例时,sb指向该实例的可读写段。RWPI段中的符号的计算方法为:连接器首先计算出该符号相对于RWPI段中某一特定位置的偏移量,通常该特定位置选为RWPI段的第一个字节出;在程序运行时,将该偏移量加到sb上即可生成该符号的地址。,22,1.3.4 支持ARM程序和Th

14、umb程序混合使用的ATPCS,在编译或者汇编时,使用/interwork告诉编译器(或汇编器)生成的目标代码遵守支持ARM程序和Thumb程序混合使用的ATPCS。它用在以下场合:程序中存在ARM程序调用Thumb程序的情况。程序中存在Thumb程序调用ARM程序的情况。需要连接器来进行ARM状态和Thumb状态切换的情况。在下述情况下,使用选项/nointerwork。程序中不包含Thumb程序。用户自己进行ARM状态和Thumb状态切换。其中,选项/nointerwork是默认的选项。,23,1.3.5 处理浮点运算的ATPCS,ATPCS支持VFP体系和FPA体系两种不同的浮点硬件体系

15、和指令集。两种体系对应的代码不兼容相应地,ADS的编译器和汇编器有下面6种与浮点数相关的选项:fpu VFPfpu FPAfpu softVFPfpu softVFP+VFPfpu softFPAfpu none,24,1.3.5 处理浮点运算的ATPCS,当系统中包含有浮点运算部件时,可以选择选项fpu VFP、fpu softVFP+VFP或者 f pu FPA。当系统中包含有浮点运算部件,并且想在Thumb程序中使用浮点数子程序,可以选择选项fpu softVFP+VFP。当系统中没有浮点运算部件时,分3种情况考虑:如果程序要与FPA体系兼容,应选择选项fpu softFPA。如果程序中没有浮点算术运算,并且程序要和FPA体系和VFP体系都兼容,应选择选项fpu none。其他情况下选择选项fpu softVFP。,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号