ARM汇编程序设计解析.ppt
文本预览下载声明
* 4.2 ARM ATPCS 1. 基本ATPCS ATPCS就是ARM程序和Thumb程序中子程序调用的基本规则。ATPCS规定了一些子程序间调用的基本规则。 ◆子程序调用过程中寄存器的使用规则 ◆数据栈的使用规则 ◆ 参数的传递规则。 * 相对于其他类型的ATPCS,满足基本ATPCS的程序的执行速度更快,所占用的内存更少。 它不能提供以下的支持: 1) ARM程序和Thumb程序相互调用; 2) 数据以及代码的位置无关的支持; 3)子程序的可重入性; 4) 数据栈检查的支持。 * 1)寄存器的使用规则 寄存器的使用必须满足下面的规则: ◆子程序间通过寄存器 R0一R3来传递参数 ◆在子程序中,使用寄存器R4~R11来保存局部变量. ◆寄存器R12用作子程序间scratch寄存器(用于保存SP,在函数返回时使用该寄存器出栈),记作ip。在子程序间的连接代码段中常有这种使用规则。 * ◆寄存器R13用作数据栈指针,记作sp。 ◆寄存器R14称为连接寄存器,记作lr。 ◆寄存器R15是程序计数器,记作pc。它不能用作其他用途。 * ATPCS中各寄存器的使用规则及其名称 * 2)数据栈使用规则 栈指针通常可以指向不同的位置。当栈指针指向栈顶元素(即最后一个入栈的数据元素)时,称为FULL栈;当栈指针指向与栈顶元素(即最后一个入栈的数据元素)相邻的一个可用数据单元时,称为EMPTY栈。 数据栈的增长方向也可以不同。当数据栈向内存地址减小的方向增长时,称为DESCENDING栈,当数据栈向内存地址增加的方向增长时,称为ASCENDING栈。 * 综合这两种特点可以有以下4种数据栈。 FD Full Descending ED Empty Descending FA Full Ascending EA Empty Ascending ATPCS规定数据栈为FD类型,并且对数据栈的操作是8字节对齐的。 * 3) 数传递规则 (1)参数个数可变的子程序参数传递规则: 对于参数个数可变的子程序,当参数不超过4个时,可以使用寄存器R0~R3来传递参数;当参数超过4个时,还可以使用数据栈来传递参数。 在参数传递时,将所有参数看作是存放在连续的内存字单元中的宇数据。然后,依次将各字数据传送到寄存器R0、Rl、R2、R3中,如果参数多于4个,将剩余的字数据传送到数据栈中,入栈的顺序与参数顺序相反,即最后一个字数据先入栈。 * (2)参数个数固定的子程序参数传递规则 对于参数个数固定的子程序,参数传递与参数个数可变的子程序参数传递规则不同。如果系统包含浮点运算的硬件部件,浮点参数将按照下面的规则传递: █各个浮点参数按顺序处理。 █为每个浮点参数分配FP寄存器。 █分配的方法是,满足该浮点参数需要的且编号最小的一组连续的FP寄存器。第一个整数参数,通过寄存器R0~R3来传递。其他参数通过数据栈传递。 * (3)子程序结果返回规则 结果为一个32位的整数时,可以通过寄存器R0返回。 结果为一个64位整数时,可以通过寄存器R0和R1返回,依次类推。 结果为一个浮点数时,可以通过浮点运算部件的寄存器f0、d0或者s0来返回。 结果为复合型的浮点数(如复数)时,可以通过寄存器f0~fn或者d0~dn来返回。 对于位数更多的结果,需要通过内存来传递。 * 2.ARM和Thumb程序混合使用 在编译和汇编时,使用/interwork告诉编译器生成的目标代码遵守支持ARM程序和Thumb程序混合使用的ATPCS。它用在以下场合: 1) 程序中存在ARM程序调用Thumb程序的情况。 2) 程序中存在Thumb程序调用ARM程序的情况。 3) 需要连接器来进行ARM状态和Thumb状态切换的情况。 * 例如:进行状态切换的汇编程序 ARM ADR r0,ThumbProg+1 BX r0 ;跳到ThumbProg,程序切换到Thumb状志 THUMB ;THUMB指示编译器后面的为Thumb指令 ThumbProg: ... ADR r0,ARMProg BX r0 ;跳转到ARMProg,程序切换到ARM状
显示全部