为了使单独编译的 C 语言程序和汇编程序之间能够相互调用,必须为子程序之间的调用规定一定的规
则.ATPCS 就是 ARM 程序和 THUMB 程序中子程序调用的基本规则...
一.ATPCS 概述...
ATPCS 规定了一些子程序之间调用的基本规则.这些基本规则包括子程序调用过程中寄存器的使用规
则,数据栈的使用规则,参数的传递规则.为适应一些特定的需要,对这些基本的调用规则进行一些修改得到
几种不同的子程序调用规则,这些特定的调用规则包括:
支持数据栈限制检查的 ATPCS. 支持只读段位置无关的 ATPCS. 支持可读写段位置无关的 ATPCS. 支
持 ARM 程序和 THUMB 程序混合使用的 ATPCS. 处理浮点运算的 ATPCS...
有调用关系的所有子程序必须遵守同一种 ATPCS. 编译器或者汇编器在 ELF 格式的目标文件中设置
相应的属性,标识用户选定的 ATPCS 类型.对应不同类型的 ATPCS 规则,有相应的 C 语言库,连接器根据用
户指定的 ATPCS 类型连接相应的 C 语言库...
使用 ADS 的 C 语言编译器编译的 C 语言子程序满足用户指定的 ATPCS 类型. 而对于汇编语言程序
来说,完全要依赖用户来保证各子程序满足选定的 ATPCS 类型. 具体来说,汇编语言子程序必须满足下面
三个条件: 在子程序编写时必须遵守相应的 ATPCS 规则; 数据栈的使用要遵守 ATPCS 规则; 在汇编编译
器中使用-apcs 选项...
二. 基本 ATPCS...
基本 ATPCS 规定了在子程序调用时的一些基本规则,包括以下三个方面的内容: 各寄存器的使用规则
及其相应的名字; 数据栈的使用规则; 参数传递的规则. 相对于其他类型的 ATPCS,满足基本 ATPCS 的程
序的执行速度更快,所占用的内存更少. 但是它不能提供以下的支持: ARM 程序和 THUMB 程序相互调用;
数据以及代码的位置无关的支持; 子程序的可重入性; 数据栈检查的支持. 而派生的其他几种特定的
ATPCS 就是在基本 ATPCS 的基础上再添加其他的规则而形成的.其目的就是提供上述的功能...
寄存器的使用规则:
1. 子程序通过寄存器 R0~R3 来传递参数. 这时寄存器可以记作: A0~A3 , 被调用的子程序在返回前
无需恢复寄存器 R0~R3 的内容.
2. 在子程序中,使用 R4~R11 来保存局部变量,这时寄存器 R4~R11 可以记作: V1~V8 .如果在子程
序中使用到 V1~V8 的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器
的值,对于子程序中没有用到的寄存器则不必执行这些操作.在 THUMB 程序中,通常只能使用寄存器
R4~R7 来保存局部变量.
3.寄存器 R12 用作子程序间 scratch 寄存器,记作 ip; 在子程序的连接代码段中经常会有这种使用规
则.
4. 寄存器 R13 用作数据栈指针,记做 SP,在子程序中寄存器 R13 不能用做其他用途. 寄存器 SP 在进
入子程序时的值和退出子程序时的值必须相等.