正在加载
请稍等

菜单

红楼飞雪 梦

15526773247

文章

arm指令集

android 嵌入式开发 by

    一、指令集概述

所有 ARM 指令的长度都是 32 位。 这些指令按字对齐方式进行存储,因此在ARM 状态下,指令地址的两个最低有效位始终为零。

Thumb、Thumb-2 和 Thumb-2EE 指令的长度是 16 位或 32 位。 这些指令按半字对齐方式进行存储。 其中有些指令使用地址的最低有效位来确定跳转到的对象代码是 Thumb 代码还是 ARM 代码。
在引入 Thumb-2 之前,Thumb 指令集只是 ARM 指令集功能的一个限定的子集。几乎所有 Thumb 指令都是 16 位。 Thumb-2 指令集的功能与 ARM 指令集的功能几乎完全相同。

在 ARMv6 及更高版本中,所有 ARM 和 Thumb 指令都是小端的。

ARM 和 Thumb 指令可划分为多个功能组:

  • 跳转和控制指令
  • 数据处理指令
  • 寄存器加载和存储指令
  • 多个寄存器加载和存储指令
  • 状态寄存器访问指令
  • 协处理器指令

跳转和控制指令

此类指令用于:

  • 跳转到子例程
  • 向后跳转以构成循环
  • 在条件结构中向前跳转
  • 使后续指令成为条件指令而不跳转
  • 在 ARM 状态和 Thumb 状态之间转换处理器状态

数据处理指令

此类指令用于对通用寄存器执行运算。 它们可对两个寄存器的内容执行加法、减法或按位逻辑等运算,并将结果存放到第三个寄存器中。 此外,它们还可以对单个寄存器中的值执行运算,或者对寄存器中的值与指令中提供的常数(立
即值)执行运算。

长乘指令用两个寄存器提供 64 位的结果。

寄存器加载和存储指令

此类指令用于从内存加载单个寄存器的值,或者在内存中存储单个寄存器的值。 它们可加载或存储 32 位字、16 位半字或 8 位无符号字节。 可以用符号或零扩展字节和半字加载以填充 32 位寄存器。此外,还定义了几个可将 64 位双字值加载或存储到两个 32 位寄存器的指令。

多个寄存器加载和存储指令

此类指令可从内存加载通用寄存器的任何子集,或者在内存中存储这样的子集。

状态寄存器访问指令

此类指令向通用寄存器或者从通用寄存器往外移动状态寄存器的内容。

协处理器指令

此类指令支持一种用于扩展 ARM 体系结构的通用方式。

二、指令功能

条件执行

可以根据 APSR 中 ALU 状态标记的值,有条件地执行几乎所有 ARM 指令。 虽然不一定要使用跳转来跳过条件指令,但当一系列指令依赖于同一条件时,这样做的效果会更好。
在 Thumb-2 之前的处理器上的 Thumb 状态下,条件跳转是提供条件执行的唯一机制。 大多数数据处理指令会更新 ALU 标记。 通常不能指定指令是否更新 ALU标记的状态。
Thumb-2 通过使用 IT (If-Then) 指令和同样的 ALU 标记为条件执行提供了另一种机制。IT 是一个 16 位指令,最多可为后面的四个指令提供条件执行。 此外,还有其他几个指令为条件执行提供了其他机制。

在 ARM 和 Thumb-2 代码中,可以指定数据处理指令是否更新 ALU 标记。 可以使用一个指令所设置的标记来控制其他指令的执行,即使在它们之间有很多非标记设置指令也是如此。

寄存器访问

在 ARM 状态下,所有指令都可访问 r0 到 r14,并且大多数指令也可访问 pc(r15)。 MRS 和 MSR 指令可将状态寄存器的内容移到通用寄存器中,在通用寄存器中可以用普通的数据处理操作来处理这些内容。
Thumb-2 处理器上的 Thumb 状态提供了同样的功能,但会禁止一些对 sp 和 pc的不太有用的访问。
Thumb-2 以前的处理器上的大多数 Thumb 指令只能访问 r0 到 r7。 只有少数指令能够访问 r8 到 r15。 寄存器 r0 到 r7 称为低位寄存器。 寄存器 r8 到 r15 称为高位寄存器。

访问内联的滚筒式移位器

ARM 算术逻辑单元有一个 32 位滚筒式移位器,可执行移位和循环操作。 对于许多 ARM 和 Thumb-2 数据处理指令和单寄存器数据传送指令的第二个操作数,可以在执行数据处理或数据传送之前,将该操作数作为指令的一部分执行移位操作。 此操作支持(但不限于):

  • 比例寻址
  • 乘以一个常数
  • 构造常数

Thumb-2 指令与 ARM 指令对滚筒式移位器的访问方式几乎相同。
Thumb2 以前的指令集只允许使用单独的指令来访问滚筒式移位器。

 

 

21 2015-08

 

我要 分享

 

 

本文 作者

 

相关 文章