ARM编程模型及指令集

ARM 79浏览


教材:嵌入式系统及应用,罗蕾、李允、陈丽蓉等,电子工业出版社


编程模型

数据宽度(类型)

ARM 是 32 位读取/存储架构

  • 字节型数据(Byte)
    数据宽度为 8bits

  • 半字数据类型(Half Word)
    数据宽度为 16bits,存取式必须以 2 字节对齐的方式

  • 字数据类型(Word)
    数据宽度为 32bits,存取式必须以 4 字节对齐的方式

工作模式(处理器模式)

  • ARM处理器有七种基本的操作模式:

  • 每一种模式只能访问自己的栈空间和不同的寄存器子集

  • 有一些操作只能在特权模式下执行

  • 1

  • 2

工作状态

  • 执行 BX 指令,并设置操作数寄存器的位[0] 为1,则进入 Thumb 状态

  • Thumb 状态下进入异常,异常处理返回时,自动转换为 Thumb 状态

  • 执行 BX 指令,并设置操作数寄存器的位[0] 为0,则进入 ARM 状态

  • 进入异常时,PC 放入异常模式链接寄存器中,从异常向量地址开始执行也可进入 ARM 状态

  • BX 是分支指令,完成程序跳转的同时,根据操作数位[0]的情况,完成状态的转换

  • 状态的切换不影响处理器的模式

寄存器

在 ARM CPU Core 中,程序员可见的寄存器有 31 个通用寄存器和 6 个状态寄存器

  • ARM寄存器集(ARM State)

    ARM寄存器集

  • ARM寄存器集( Thumb State )

    Thumb State

  • ARM State 与Thumb State寄存器关系

    关系

通用寄存器

  • (31个)是 R0 - R15,分为三类

    • 没有对应影子寄存器的寄存器 R0 - R7
    • 有对应影子寄存器的寄存器 R8 - R14
    • 程序计数器 R15 (或者 PC)
  • 影子寄存器是指该寄存器在不同的模式下对应的物理寄存器

  • 所有模式下,R0-R7 所对应的物理寄存器都是相同的,它们的功能都是等同的,在中断或者异常处理程序中一般都需要对这几个寄存器进行保存

  • R8-R14:访问的物理寄存器取决于当前的处理器模式,若要访问特定的物理寄存器而不依赖当前的处理器模式,则要使用规定的名字

  • R8-R12:各有两组物理寄存器:一组为 FIQ 模式,另一组是除 FIQ 以外的其他模式

  • R13-R14:各有6个分组的物理寄存器,一个用于用户模式和系统模式,其他5个分别用于5种异常模式

  • R13(也被称为SP指针)被用作栈指针,通常在系统初始化时需要对所有模式下的SP指针赋值,当CPU在不同的模式时栈指针会被自动切换成相应模式下的值

  • R14 有两个用途,一是在调用子程序时用于保存调用返回地址,二是在发生异常时用于保存异常返回地址

  • R15 用作程序计数器(PC),可以被读写

    • 读 PC 时,得到的值是当前 PC +8 或者 +12 的值(由于流水线,需根据具体 CPU 的实现来确定),不建议直接读取 PC 的值
    • 写 PC 相当于将程序跳转到指定地址执行
    • ARM state: bits [1:0] 未定义,bits[31:2] 即为 PC(因为指令都是32位宽,按字对齐)
      THUMB state:bit [0] 未定义,bits[31:1] 即为 PC(因为指令都是16位宽,按半字对齐)

程序状态寄存器

  • CPSR(当前程序状态寄存器)在所有的模式下都是可以读写的,它主要包含条件标志、中断使能标志、当前处理器的模式、其它的一些状态和控制标志

  • 1

  • 2

  • 模式控制位 M0 - M4

    模式控制位

数据对齐

  • 在 v6 架构之前,数据访问都必须针对要访问的大小把访问地址进行对齐,没有对齐的地址将会导致无法预料/未定义的结果

    数据对齐

  • 用“数据中止”异常来检测无效的未对齐数据访问(指令预取也可能出现没对齐)

  • 没有对齐的地址数据可以通过多个对齐地址数据移位/掩码操作来实现

  • V6 架构添加了新的硬件来支持未对齐的数据访问

大小端

大小端决定了寄存器的内容和内存内容的格式关联

ARM 支持大端(Big-endian)和小端(Little-endian)的内存数据方式,可以通过硬件的方式设置端模式,也可以通过软件的方式来设置(V6 版本以上)

  • 大端的数据存放

    • 最高有效字节位于最低地址
    • 最高有效字节的地址就是该 word 的地址
  • 小端的数据存放

    • 最低有效字节位于最低地址
    • 最低有效字节的地址就是该 word 的地址

指令集

ARM 指令集

  • 所有的指令长度都是32位 / 许多指令都在一个单独周期内执行

  • 指令是条件执行的

  • Load(加载) / store(存储)架构

Thumb 指令集

  • thumb指令集

Thumb-2 指令集

  • Thumb-2 主要是对 Thumb 指令集架构(ISA)的扩展指令

    • 增加了32位指令,实现了几乎所有的 ARM 指令集架构的功能
    • 保留了完整的16位 Thumb 指令集
    • ARM1156T2-S 和 Cortex 系列支持 Thumb-2
    • Cortex-M3 只支持 Thumb-2
  • 不需要手动选择指令集

    • 减少了剖析代码和理解执行方式的需求
    • 编译器可以自动地选择 16 位和 32 位指令的混合
  • 可以访问ARM态的行为

    • 异常可以直接处理
    • 可以访问协处理器
    • 可以完成 v5TE 的高级数据处理
  • 条件执行可以通过If-Then (IT) 指令,1-4 条紧接指令可以条件性地执行

Jazelle

  • Jazelle 使得 ARM 核可以执行8位的 Java 字节码

    • 95%的字节码可以用硬件执行(典型)
    • 功耗效率显著提高
  • 当处理器在 Jazelle 态执行时

    • 所有的指令都是8位宽
    • 处理器进行字访问一次读4条指令