3.5. AMR寄存器的别名 + APCS

此处简单介绍一下,ARM寄存器的别名,以及什么是APCS。

用文字解释之前,先看这个版本的解释,显得很直观,很好理解:

图 3.8. ARM Application Procedure Call Standard (AAPCS)

ARM Application Procedure Call Standard (AAPCS)

3.5.1. ARM中的寄存器的别名

默认的情况下,这些寄存器只是叫做r0,r1,...,r14等,而APCS 对其起了不同的别名。

使用汇编器预处理器的功能,你可以定义 R0 等名字,但在你修改其他人写的代码的时候,最好还是学习使用 APCS 名字。

一般编程过程中,最好按照其约定,使用对应的名字,这样使得程序可读性更好。

关于不同寄存器所对应的名字,见下表:

表 3.2. ARM寄存器的别名

寄存器名字
Reg# APCS 意义
R0 a1 工作寄存器
R1 a2 "
R2 a3 "
R3 a4 "
R4 v1 必须保护
R5 v2 "
R6 v3 "
R7 v4 "
R8 v5 "
R9 v6 "
R10 sl 栈限制
R11 fp 桢指针
R12 ip 内部过程调用寄存器
R13 sp 栈指针
R14 lr 连接寄存器
R15 pc 程序计数器

更加详细一点,见下:

Predeclared register names

The following register names are predeclared:

  1. r0-r15 and R0-R15
  2. a1-a4 (argument, result, or scratch registers, synonyms for r0 to r3)
  3. v1-v8 (variable registers, r4 to r11)
  4. sb and SB (static base, r9)
  5. ip and IP (intra-procedure-call scratch register, r12)
  6. sp and SP (stack pointer, r13)
  7. lr and LR (link register, r14)
  8. pc and PC (program counter, r15).

Predeclared extension register names

The following extension register names are predeclared:

  1. d0-d31 and D0-D31(VFP double-precision registers)
  2. s0-s31 and S0-S31(VFP single-precision registers)

Predeclared coprocessor names

The following coprocessor names and coprocessor register names are predeclared:

  1. p0-p15 (coprocessors 0-15)
  2. c0-c15 (coprocessor registers 0-15).

3.5.2. 什么是APCS

APCS,ARM 过程调用标准(ARM Procedure Call Standard),提供了紧凑的编写例程的一种机制,定义的例程可以与其他例程交织在一起。最显著的一点是对这些例程来自哪里没有明确的限制。它们可以编译自 C、 Pascal、也可以是用汇编语言写成的。

APCS 定义了:

  • 对寄存器使用的限制。
  • 使用栈的惯例。
  • 在函数调用之间传递/返回参数。
  • 可以被"回溯"的基于栈的结构的格式,用来提供从失败点到程序入口的函数(和给予的参数)的列表。