欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CM4_ 3、ARM指令集

程序员文章站 2022-06-09 08:42:51
...



一、导引

何为指令

指示计算机进行工作的二进制代码

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指令的条件码域

CM4_ 3、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(后面这三个仅作了解)

B、BL



四、伪指令