ARM汇编
ARM简介
架构
- ARMv1: ARM1处理器
- ARMv2: ARM2/ARM3
- ARMv3: ARM6/ARM7
- ARMv4: StrongARM/ARM7TDMI/ARM9TDMI
- ARMv5: ARM7EJ/ARM9E/ARM10E/XScale
- ARMv6: ARM11/Cortex-M
- ARMv7: Cortex-A/Cortex-M/Cortex-R
- ARMv8: Cortex-A30/A50/A70等
大小端与浮点
大端(Big-endian): 最高有效位(MSB)在前
小端(Little-endian): 最低有效位(LSB)在前
硬件浮点(Hard Float): 通过浮点单元(FPU)实现和专用的浮点寄存器传参,计算精度高、速度快
软件浮点(Soft Float): 通过算法实现,适用于没有浮点运算单元的处理器
ABI (Application Binary Interface):ABI定义了编译后的程序如何与操作系统、库以及硬件进行交互。它包括:
- 数据类型的大小、对齐方式(如
int是4字节)。 - 函数调用的约定:参数如何传递(通过寄存器还是栈?),返回值如何传递,谁负责清理栈。
- 系统调用的方式。
- 浮点运算的处理方式:这是区分
armel和armhf的关键。
例如:
armel(ARM Embedded ABI, Little Endian):软件浮点小端序
armhf(ARM Hard-Float ABI):硬件浮点小端序
arm64:64位ARM默认采用硬件浮点,无需hf后缀
ARM应用场景
Cortex-A系列
- 特点: 高性能、高交互性
- 应用: PC、平板、手机等需要复杂功能的设备
Cortex-M系列
- 特点: 低功耗、低成本
- 应用: 传感器、水表、跑步机等简单工业设备,通常运行RTOS而非完整Linux系统
Cortex-R系列
- 特点: 实时高性能
- 应用: 硬盘控制器等对实时性要求极高的场景
ARM运行
运行模式
运行模式通过指令操纵特殊寄存器达到模式切换
共有9种运行模式
| 模式类别 | 模式名称 | 模式作用及特点 |
|---|---|---|
| 用户模式 | USR模式 | 基本特性:ARM处理器正常程序执行状态,所有应用程序默认运行在此模式 权限限制:属于非特权模式,对系统资源访问受限 |
| 中断处理模式 | FIQ模式 | 快速中断模式,进入FIQ中断异常,中断也会分类,除了硬件中断还有软件中断,中断的时候也会有消息传过来,这个消息可能数据量比较大,而且要求还很大,还有的消息数据量比较小,它要求就会很小,这种要求大的中断我们就称为快速中断,比较小的我们就称为一般中断 用于高速数据传输或通道处理,配备更多寄存器(R8-R14)以加速大量数据中断处理 |
| IRQ模式 | 一般中断模式 处理通用中断请求,仅使用R13-R14寄存器,适合数据量较少的中断场景 |
|
| 系统管理模式 | SVC(Supervisor)模式 | 操作系统保护模式,具有最高权限,可执行reset等特权操作 超级管理员,它主要是用来管理调用指令被执行或者reset的时候,这个模式的权限级别非常大,所以一般情况下是不能随便用的 |
| ABT(Abort)模式 | 退出模式,通常开始发生了用户级别的开始,就会出现这样的退出,这个时候CPU就会说暂停下面的代码运行,就直接退出 在数据/指令预取终止时触发,支持虚拟存储和存储保护 |
|
| SYS(System)模式 | 系统模式,当系统自己异常的时候,就会发生这样的模式,它有一个特点就是可以进行各个模式的切换,在不同的状态的时候,访问的寄存器就有可能不一样,这个模式用到的寄存器与用户模式是共享的,只是访问级别不一样 运行特权操作系统任务,与用户模式共享寄存器但具有更高权限 |
|
| 异常处理模式 | UND(Undef)模式 | 执行未定义指令时进入,提供错误诊断信息 比如说一条指令是CPU不识别的,就叫做未定义 |
| MON(Monitor)模式 | 安全扩展模式,监控程序异常行为,主要用于虚拟化环境 监视模式,就像后台服务,就像监测网络信号,其实CPU不需要去处理一些用户中断,这个模式主要用来安全扩展模式,只用于安全 |
|
| Hyp模式 | 虚拟化模式,非安全状态下的虚拟化专用模式 是一个超级的监视者,它比超级管理员要稍微低一点,它主要是用来做一些虚拟化的扩展 |
工作状态
ARM状态
32位字对准指令,执行效率更高
进入Thumb状态:
1.执行BX指令,并将操作数寄存器的状态(位[0])为1
2.在Thumb状态进入异常返回时自动转换(所有异常处理默认为ARM状态,当异常处理返回时自动转换Thumb指令)
ARM工作状态寄存器:
| 寄存器类型 | 寄存器 | 作用 |
|---|---|---|
| 通用寄存器 | R0-R7 | 所有模式共享 |
| R8-R12 | FIQ模式独占(R8_fiq-R12_fiq) | |
| 专用寄存器 | R13(SP) | 模式专属栈指针(如R13_abt) |
| R14(LR) | 保存子程序返回地址 | |
| R15(PC) | 程序计数器,所有模式共享 | |
| 状态寄存器 | CPSR | 当前程序状态寄存器,包含条件标志、中断控制等关键位 |
| SPSR | 保存的程序状态寄存器,异常发生时自动备份CPSR内容 |
Thumb状态
16位半字对准指令,代码密度更高
进入ARM状态:
1.执行BX指令,并将操作数寄存器的状态(位[0])为0
2.进入异常时,将PC放入异常模式链接寄存器中,从异常向量地址开始执行也可进入ARM状态
Thumb工作状态寄存器:
寄存器精简:仅使用R0-R7、SP、LR、PC寄存器,不使用R8-R12
ARM流水线操作
CPU流水线是把一条指令分为多个处理阶段
三级流水线(ARMV7)
取指(Fetch):从存储器读取指令
译码(Decode):解析指令操作和操作数
执行(Execute):完成算术逻辑运算
PC指向Fetch
五级流水线(ARMV9)
取指(Fetch)
译码(Decode)
执行(Execute)
存储器访问(Memory)
写回(Writeback)
ARM指令集
格式:指令{条件}{S} 目的寄存器,源操作数1,源操作数2
条件:缺省时无条件执行
B(byte)功能不变,操作长度变为8位
H(half word)功能不变,长度变为16位
S(signed)功能不变,操作数变为有符号
S标志:决定是否影响CPSR标志位,当没有S时指令不更新CPSR标志位的值