《Procedure Call Standard for the ARM® Architecture》之(5.1)

来源:互联网 发布:麦夸特算法 编辑:程序博客网 时间:2024/06/05 15:07

本文基于以下版本

Document number:  ARM IHI 0042F, current through ABI release 2.10

Date of Issue:  24th November 2015

声明:以下翻译限于个人学识水平,个别语句也加入了个人理解。原文参见:

http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042f/IHI0042F_aapcs.pdf

5 基本过程调用规范

        本节定义一种机器级别的(machine-level)、核心寄存器(core-registers-only)相关的过程调用规范。此规范同时适用于ARM和Thumb指令集。此规范可用于没有浮点硬件部分,或者需要与Thumb指令高度交互的系统。

5.1 寄存器

       ARM架构定义了一套核心指令集,外加协处理器相关的指令集。核心指令集可以访问核心寄存器。协处理器提供了更多的寄存器,这些寄存器可以完成特定的操作。

5.1.1 核心寄存器

        ARM和Thumb指令集中包含16个32bit的核心寄存器,标号依次是r0-r15或者R0-R15。这些寄存器名称以大写或者小写形式出现在汇编语言中。此规范约定:若在过程调用中,寄存器功能固定(has a fixed role),那么使用大写形式。下表概括了核心寄存器的使用。除此之外,还有一个程序状态寄存器(CPSR)。

r0-r3用于向跳转过程传递参数,并存储返回结果。它们也用于暂存运算的中间结果。

r12(IP)可以记录对子程序调用的调用。也可以用来保存一个程序在调用子程序的中间结果。其使用详细参见5.3.1.1。

r9的使用与平台有关。某个平台可以将它作任何用途,同时要有对这些用途的说明文档。例如,在位置无关的数据模型中,可以把它指定位静态基准(static base, SB)。也可以在本地线程存储(thread-local storage)环境中,把它指定作线程寄存器(thread register)。在某些时候,在所有调用过程中,我们期望r9的值固定不变。若不需要r9包含不变的值,可以仅仅把用它存储变量的值(别名v6)。

r4-r8,r10和r11典型用途是存储函数体中的局部变量。其中,只有r1-r4能够用于所有的Thumb指令集。但是AAPCS并不限定Thumb只能使用这些寄存器。

子程序必须保存r4-r8,r10,r11和SP的内容(若r9用于v6,也必须被保存起来)。

r12-r15均作特殊的用途,分别是IP,SP,LR和PC。

CPSR是一个全局寄存器,特性如下:

a) N,Z,C,V和Q比特位(bits 27-31),以及GE(3:0)(bits 16-19)在调用发生时和从调用返回时没有被定义。在程序执行时出现对应状态时,Q和GE(3:0)可能会被修改。

b) ARM6体系中,little-endian或者big-endian-8模式(临时改变字节存储顺序)下使用比特位E(bit8)。任何程序都需要被指定字节序。发生过程调用或者从过程调用中返回时,E的设置值需要与程序的字节序保持一致。

c) 比特T(bit5)和比特J(比特24)是程序执行状态位。只有特定的指令可以修改它们。

d) 比特A, I, F 和 M[4:0] bits (bits 0-7)是权限标志位,只能被特权模式下的程序修改。

e) 其他的比特位被保留且不能被修改。它们的状态没有被定义。

5.1.1.1 bit数多于32的数据处理

        一个函数的参数可能是多于32bits的基本数据类型数据。也可能一个函数返回数据类型多于32bits。这种情况下作如下处理:

a) 双字在两个连续的寄存器中保存。此时寄存器中的值相当于使用LDM指令从存储器中加载出来的值。

b) 128 bits的矢量数据保存在连续4个寄存器中。此时寄存器中的值相当于使用LDM指令从存储器中加载出来的值。

5.1.2 协处理器寄存器

        协处理指令空间可以操作更多的寄存器。从某种程度上来说,这些寄存器不用于传递参数或者保存返回参数。协处理器寄存器的使用与此标准是兼容的。每一个协处理器都应该提供如何操作这些寄存器的规范。

        注意:虽然协处理器寄存器不用于传递函数参数或者返回函数值,但是运行时的某些元素需要知道一个程序中所有使用的协处理器,以正确执行。

5.1.2.1 VFP寄存器规范

        VFP-V2协处理器有32个单精度寄存器,s0-s31。也可以被当做16个双精度寄存器d0-d14使用(d0对应s0+s1;d1对应s2+s3,以此类推)。此外,根据不同的实现,还包含3个或者更多系统寄存器。VFP-V3扩充16个双精度寄存器d16-d31。但是并没有对应扩充单精度寄存器。SIMD扩展使用VFP寄存器组。64bits数据类型时使用双精度寄存器。对于128bits类型数据,使用四字寄存器(q0对应d0和d1;q1对应d2和d3,以此类推)。

发生过程调用时s16-s31 (d8-d15, q4-q7)必须被保存。 s0-s15 (d0-d7, q0-q3)则不需要被保存(这些寄存器可用来保存传递参数和函数返回值)。d16-d31 (q8-q15)在函数调用时也不需要被保存。

FPSCR是协处理器的状态寄存器。它是全局寄存器。特性如下:

a) 条件码比特(bits (28-31),cumulative saturation (QC) bit (27) 和cumulative exception-status bits (0-4)不需要再调用发生时保存。

b) exception-control bits (8-12), rounding mode bits (22-23) 和flush-to-zero bits (24),当调用某些影响全局状态的函数时,可能会被修改。

c)  length bits (16-18) 和 stride bits (20-21),调用函数时和从子程序返回时,必须是全0。

d) 其他bits被保留没有被使用。对于它们的状态,spec没有定义。

0 0
原创粉丝点击