ARM寄存器与ATPCS/AAPCS
ARM寄存器与ATPCS/AAPCS
整理于《ARM体系结构与编程》
为了使单独编译的C语言程序和汇编语言之间能够相互调用,必须为子程序间的调用制定一定规则。
-
ATPCS (ARM-Thumb Procedure Call Standard)
-
AAPCS (ARM Archtecture Procedure Call Standard)
AAPCS ≈ ATPCS plus
零.ARM处理器的运行模式
处理器模式 | 描述 |
---|---|
用户模式 | 正常程序执行模式 |
快速中断模式 | 用于高速数据传输和通道处理 |
外部中断模式 | 用于通常的中断处理 |
特权模式 | 供操作系统使用的一种保护模式 |
数据访问中止模式 | 用于虚拟存存储及存储保护 |
未定义指令中止模式 | 用于支持通过软件仿真硬件的协处理器 |
系统模式 | 用于运行特权级的操作系统任务 |
0.1 Cortex-M 系列来讲
两种操作状态:
- 调试模式
- Thumb状态(无ARM指令集)
两种模式:
- 处理模式:执行中断服务,总是具有特权访问
- 线程模式:执行普通应用程序代码
运行模式:
- 特权访问
- 非特权访问
一. 寄存器
37个寄存器
- 31个通用寄存器
- 未备份寄存器 R0 - R7
- 备份寄存器 R8 - R14
- 通用寄存器 R15 (PC)
- 6个状态寄存器
二.通用寄存器
2.1 未备份寄存器
在所有运行模式下,都是同一个寄存器
2.2 备份寄存器
R8 - R12
仅有两组寄存器,即usr和fiq
R13
习惯上用作Stack寄存器,每种异常模式,都有自己的R13寄存器,在进入异常模式时,可用R13保存栈指针,退出异常模式时,可保存完整的上下文。
R14 :Link Register
- 存放当前子程序的返回地址
- 异常中断发生时,该异常模式的R14用于返回地址
R15:程序指针寄存器
流水线机制,其值为当前指令+N
2.3 通用寄存器
CPSR:当前程序状态寄存器
SPSR:备份程序状态寄存器
-
条件标志位
-
Q标志位
-
CPSR控制位:处理器模式
三. ATPCS
3.1 什么是ATPCS?
ARM程序和Thumb程序中子程序调用规则
- 各寄存器使用规则及相应名称
- 数据栈使用规则
- 参数传递规则
3.2 各寄存器使用规则及相应名称
R0 - R3 : 子程序传递参数
R4 - R11:子程序保存局部变量
R12:子程序间的scratch寄存器,记为IP 暂存寄存器 ?
R13:sp,栈指针寄存器。在进入子程序时,和退出子程序时,值必须相等。
R14:lr,用于保存子程序的返回值
R15:PC
;Uboot程序中主程序调用 cpu_init_crit函数,在这个cpu_init_crit函数中有下面的代码:
mov ip, lr
bl lowlevel_init
mov lr, ip
mov pc, lr
;这个代码在调用lowlevel_init函数之前,先将lr存储在R12,
;之后在lowlevel_init函数调用返回之后使用mov lr,ip
;将之前保存的返回地址再一次存储到lr寄存器。
3.3 数据栈使用规则
FULL栈:
栈指针,始终指向栈顶元素时
入栈时,需要移动栈指针
EMPTY栈:
栈指针,指向栈元素的下一个地址
入栈时,当前地址可直接使用
DESCENDING栈:
数据栈向内存地址减小的方向增长时
初始化栈的时候,从高地址开始存
ASCENDING栈:
数据栈向内存地址增加的方向增长时
初始化栈的时候,从低地址开始存
-
**FD:**FULL DESCENDING ( ATPCS规定 )
-
**ED:**EMPTY DESCENDING
-
FA: FULL ASCENDING
-
EA: EMPTY ASCENDING
几个栈参数:
- Stack Pointer
- Stack Base
- Stack Limit
- Used Stack
- Unuesd Stack
- Stack Frames
3.4 参数传递规则
1.参数个数可变的子程序的参数传递规则
不超过四个用R0 -R4,超过用数据栈
2.参数个数固定的子程序的参数传递规则
浮点运算传递规则 + 同上规则
3.子程序结果返回规则
32bit:R0
64bit:R0 和 R1
浮点数:浮点运算寄存器