指令集概述
现阶段有四个不同的指令集
| 名称 | 概述 |
|---|---|
| ARM32 | 32位指令集 |
| Thumb | 16位指令集,ARM32子集,提供高密度低功耗 |
| Thumb2 | 32位指令集,ARMv6T2 引入.是thumb超集 |
| ARM64 | 64位指令集 |
note:
ARM某一个时刻只能运行单独ARM指令集或者Thumb指令,通过CPSR的T标志位决定.
如何当前执行ARM函数,想要跳转到thumb函数可以通过调用BX切换状态,需要注意的是Thumb函数跳转地址必须末尾是1才能让CPSR自动切换(thumb实际函数由于字节对齐末尾是0,所以很多跳转到thumb地址函数时往往会手动+1在执行BX指令)。
不同指令集的作用:
(1) 此部分为个人理解不具备权威性,ARM32为固定32位长度指令可以访问(R0-R15),但对于轻量化设备来说期望更大的代码密度从而降低对内存的需求。因为推出了编码长度16位的thumb指令,但是只能访问(R0-R7)。对于同一个功能来说往往thumb需要更多指令才能任务(且通用寄存器访问受限),因此整体效率会较低。
(2) 部分功能thumb指令尚未提供的需要切换到ARM模式下执行ARM指令。但是频繁切换ARM与thumb模式成本过高,因为推出了thumb-2指令集。thumb-2指令集兼容16位的thumb指令,也扩展了需要32位指令且可以访问所有寄存器。
(3) ARM64 也是固定长度为32位编码指令集,但是支持64位内存下的执行环境。
条件执行
多架构
其中ARMv7开始提供了三个版本的架构主要提供不同目的:
| 名称 | 概述 |
|---|---|
| ARMv7-A | 官方文档 |
| ARMv7-R | 官方文档 |
| ARMv7-M | 官方文档 |
其中ARMv7-A一般用于手机。
状态寄存器
在ARMv7中有三个存储当前程序状态的寄存器。
| 名字 | 简述 | 参考链接 |
|---|---|---|
| APSR | 这个是CPSR在用户模式下的视图 | 链接 |
| CPSR | 用于保存当前程序执行的状态信息。它包括程序状态、条件码、控制标志和一些其他控制位。CPSR中的位表示了当前的程序状态,例如,是否处于特权模式、是否允许中断等。它还包括条件码,用于条件执行指令,根据执行结果决定是否跳转。 | 链接 |
| SPSR | 当程序触发异常/中断时需要跳转特定函数进行处理,需要保存当前CPSR那么SPSR将作为备份使用。 | 链接 |
CPSR和SPSR寄存器位域图

APSR寄存器位域图

ARM中的状态寄存器
特性
ARM既支持大端也支持小端,由其CPSR的E标志位决定
通用寄存器



















