指令集概述
现阶段有四个不同的指令集
名称 | 概述 |
---|---|
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
标志位决定