本文脉络
一、导引
何为指令
指示计算机进行工作的二进制代码
1、经典ARM体系架构的指令集—ARM指令集、Thumb指令集
对经典的ARM架构处理器
- 有两种工作状态:ARM状态和Thumb状态
- 支持固定长度的32位ARM指令和16位的Thumb指令
1.1、Thumb指令集
Thumb指令集是添加到ARM指令集之上的独立指令集,是ARM指令集的压缩方案,能够将代码规模减小20%-30%
但是,Thumb指令仅对基本的算术和逻辑运算有用,有不便之处:
- Thumb状态下R8-R12寄存器使用受限
- 无法完成中断处理、长跳转、循环移位、条件执行等操作
1.2、比较ARM指令集和Thumb指令集
Thumb指令的代码密度较高,缓冲使用效率较高,但ARM代码功能较多,使用更灵活
1.3、经典ARM体系架构指令集的缺点
- Thumb代码和ARM代码必须隔离到单独模块中,不能混用,使用时需要切换处理器的工作状态
- 两种状态的切换导致代码运行速度下降,并且增加了代码量,清空了流水线
2、Cortex-M4体系架构的指令集—Thumb-2指令集
Thumb-2指令集集合了ARM指令集和Thumb指令集的优点,可完全替代ARM和Thumb 指令集
Thumb-2指令集不是Thumb指令集的升级,而是另起炉灶,是ARM指令集和Thumb指令集的超集
Thumb-2指令集不需要处理器切换工作状态,就可以执行16位与32位混合代码
Thumb-2指令集的指令有两种
- 16位指令
- 32位指令
Cortex-M4内核使用的是Thumb-2指令集的子集,其处理器状态有两种:
- Thumb状态
- 调试状态
Cortex-M4内核在执行指令时,只有一种状态,那就是Thumb状态
二、指令的格式
指令 = 操作码 + 操作数
操作码:表示计算机所要做的动作
操作数:表示计算机所动作的对象
如 add r0,r1,r2:
add——操作码,表加法;
r0、r1、r2:操作数;
r0:目标操作数;
r1,r2:源操作数。
1、ARM 指令格式
< opcode > {< cond >} {S} < Rd >,< Rn >,< operand2 >
{ }表可有可无
- < opcode >操作码,如ADD、MOV等
- {< cond >}①有条件地执行指令,如:BEQ < Label > ; 仅当 EQ 满足时转移——指令后缀
- {S}②决定指令执行是否影响APSR寄存器的标志位——指令后缀
- < Rd >目的寄存器,用于存储结果(即目标操作数)
- < Rn >第一源操作数寄存器,可以是寄存器、常数
- < operand2 >第二源操作数,可以是:①常数,如#0xab、#’s’等;②寄存器或移位操作的寄存器,如R1,LSL #2
①ARM指令的条件码域
如 mov r0,#1
mov r1,#2
cmp r0,r1
movcc r2,#3 ;当小于时执行mov r2,#3
moveq r2,#1
movcs r2,#2
上述指令执行完后,r2的值为 3
②APSR 中的 5 个标志位:
- N: 负数标志(Negative)
- Z: 零结果标志(Zero)
- C: 进位/借位标志(Carry)
- V: 溢出标志(oVerflow)
- S: 饱和标志(Saturation),它不做条件转移的依据
三、CM4常用的Thumb-2指令
1、分支指令:
用于改变程序的执行流程,实现跳转
主要有B、BL、BX、BLX、CBNZ、CBZ、IT、TBB、TBH(后面这三个仅作了解)