CM4_ 3、ARM指令集

版权声明:本文为博主原创文章,转载请声明原文出处: https://blog.csdn.net/lucky534528795/article/details/88980372



一、导引

何为指令

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

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
  • {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指令(待完善)

分支指令:

用于改变程序的执行流程,实现跳转。主要有B、BL、BX、BLX、CBNZ、CBZ、IT、TBB、TBH(后面这三个仅作了解)

猜你喜欢

转载自blog.csdn.net/lucky534528795/article/details/88980372