为了使单独编译的C语言程序和汇编程序之间能够相互调用必须为子(共5页).doc
《为了使单独编译的C语言程序和汇编程序之间能够相互调用必须为子(共5页).doc》由会员分享,可在线阅读,更多相关《为了使单独编译的C语言程序和汇编程序之间能够相互调用必须为子(共5页).doc(5页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上为了使单独编译的C语言程序和汇编程序之间能够相互调用,必须为子程序之间的调用规定一定的规则.ATPCS就是ARM程序和THUMB程序中子程序调用的基本规则. 一.ATPCS概述. ATPCS规定了一些子程序之间调用的基本规则.这些基本规则包括子程序调用过程中寄存器的使用规则,数据栈的使用规则,参数的传递规则.为适应一些特定的需要,对这些基本的调用规则进行一些修改得到几种不同的子程序调用规则,这些特定的调用规则包括: 支持数据栈限制检查的ATPCS. 支持只读段位置无关的ATPCS. 支持可读写段位置无关的ATPCS. 支持ARM程序和THUMB程序混合使用的ATPCS
2、. 处理浮点运算的ATPCS. 有调用关系的所有子程序必须遵守同一种ATPCS. 编译器或者汇编器在ELF格式的目标文件中设置相应的属性,标识用户选定的ATPCS类型.对应不同类型的ATPCS规则,有相应的C语言库,连接器根据用户指定的ATPCS类型连接相应的C语言库. 使用ADS的C语言编译器编译的C语言子程序满足用户指定的ATPCS类型. 而对于汇编语言程序来说,完全要依赖用户来保证各子程序满足选定的ATPCS类型. 具体来说,汇编语言子程序必须满足下面三个条件: 在子程序编写时必须遵守相应的ATPCS规则; 数据栈的使用要遵守ATPCS规则; 在汇编编译器中使用-apcs选项.二. 基本
3、ATPCS. 基本ATPCS规定了在子程序调用时的一些基本规则,包括以下三个方面的内容: 各寄存器的使用规则及其相应的名字; 数据栈的使用规则; 参数传递的规则. 相对于其他类型的ATPCS,满足基本ATPCS的程序的执行速度更快,所占用的内存更少. 但是它不能提供以下的支持: ARM程序和THUMB程序相互调用; 数据以及代码的位置无关的支持; 子程序的可重入性; 数据栈检查的支持. 而派生的其他几种特定的ATPCS就是在基本ATPCS的基础上再添加其他的规则而形成的.其目的就是提供上述的功能. 寄存器的使用规则: 1. 子程序通过寄存器R0R3来传递参数. 这时寄存器可以记作: A0A3
4、, 被调用的子程序在返回前无需恢复寄存器R0R3的内容. 2. 在子程序中,使用R4R11来保存局部变量,这时寄存器R4R11可以记作: V1V8 .如果在子程序中使用到V1V8的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值,对于子程序中没有用到的寄存器则不必执行这些操作.在THUMB程序中,通常只能使用寄存器R4R7来保存局部变量. 3.寄存器R12用作子程序间scratch寄存器,记作ip; 在子程序的连接代码段中经常会有这种使用规则. 4. 寄存器R13用作数据栈指针,记做SP,在子程序中寄存器R13不能用做其他用途. 寄存器SP在进入子程序时的值和退出
5、子程序时的值必须相等. 5. 寄存器R14用作连接寄存器,记作lr ; 它用于保存子程序的返回地址,如果在子程序中保存了返回地址,则R14可用作其它的用途. 6. 寄存器R15是程序计数器,记作PC ; 它不能用作其他用途. 7. ATPCS中的各寄存器在ARM编译器和汇编器中都是预定义的. 数据栈的使用规则 栈指针通常可以指向不同的位置.当栈指针指向栈顶元素(即最后一个入栈的数据元素)时,称为FULL栈.当栈指针指向与栈顶元素相邻的一个元素时,称为Empty栈. 数据栈的增长方向也可以不同. 当数据栈向内存减小的地址方向增长时,称为Descending栈; 当数据栈向着内存地址增加的方向增长
6、时,称为Ascending栈. 综合这两种特点可以由以下4种数据栈: FD ED FA EA . ATPCS规定数据栈为FD类型,并对数据栈的操作是8字节对齐的,下面是一个数据栈的示例及相关的名词. 1.数据栈栈指针.stack pointer 指向最后一个写入栈的数据的内存地址. 2.数据栈的基地址.stack base 是指数据栈的最高地址.由于ATPCS中的数据栈是FD类型的,实际上数据栈中最早入栈数据占据的内存单元是基地址的下一个内存单元. 3.数据栈界限.stack limit 是指数据栈中可以使用的最低的内存单元地址. 4.已占用的数据栈.used stack 是指数据栈的基地址和
7、数据栈栈指针之间的区域.其中包括数据栈栈指针对应的内存单元. 5.数据栈中的数据帧(stack frames) 是指在数据栈中,为子程序分配的用来保存寄存器和局部变量的区域. 异常中断的处理程序可以使用被中断程序的数据栈,这时用户要保证中断的程序数据栈足够大. 使用ADS编译器产生的目标代码中包含了DRFAT2格式的数据帧.在调试过程中,调试器可以使用这些数据帧来查看数据栈中的相关信息.而对于汇编语言来说,用户必须使用FRAME伪操作来描述数据栈中的数据帧.ARM汇编器根据这些伪操作在目标文件中产生相应的DRFAT2格式的数据帧. 在ARMv5TE中,批量传送指令LDRD/STRD要求数据栈是
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 为了 单独 编译 语言 程序 汇编程序 之间 能够 相互 调用 必须
限制150内