首页 > 代码库 > ARM指令集的概述

ARM指令集的概述

ADC  addition Carry 带进位的加法指令  数据处理类算术运算指令

ADD addition 加法指令 数据处理类算术运算指令

AND logic and 逻辑与数据处理类算术运算指令

BBranch B 是最简单的分支。一旦遇到一个B 指令,ARM 处理器将立即跳转到给定的地址,从那里继续执行。注意存储在分支指令中的实际的值是相对当前的 R15 的值的一个偏移量;而不是一个绝对地址。它的值由汇编器来计算,它是 24 位有符号数,左移两位后有符号扩展为 32 位,表示的有效偏移为 26 位(+/- 32 M)。 

BICbit clear 位清零 是在一个字中清除位的一种方法,与 OR 位设置是相反的操作。操作数 2 是一个 32 位位掩码(mask)。如果如果在掩码中设置了某一位,则清除这一位。未设置的掩码位指示此位保持不变

BIC     R0, R0, #%1011          ; 清除 R0 中的位 0、1、和 3。保持其余的不变。
BKPT   break point  断点中断指令

CMN compare Negative  比较取负的值

ERO  异或指令

LDC  存储器到协处理器的数据集传送指令

LDM 加载多个存储器指令

LDR 存储器到寄存器的数据传送指令

MCR  从寄存器到协处理器寄存器的数据传送指令

MLA  乘加运算指令

MOV  数据传送指令

MRC 从协处理器寄存器到寄存器的数据穿送指令

  MRS     R0, CPSR_all            ; 复制 PSR
  BIC     R0, R0, #&1F            ; 清除模式位
  ORR     R0, R0, #new_mode       ; 把模式位设置为新模式
  MSR     CPSR_all, R0            ; 写回 PSR,变更模式

MUL : 乘法

(Multiplication)

  MUL{条件}{S}  <dest>, <op 1>, <op 2>

                dest = op_1 * op_2
MUL 提供 32 位整数乘法。如果操作数是有符号的,可以假定结果也是有符号的。 


MLA : 带累加的乘法

(Multiplication withAccumulate)

  MLA{条件}{S}  <dest>, <op 1>, <op 2>, <op 3>

                dest = (op_1 * op_2) + op_3
MLA 的行为同于 MUL,但它把操作数 3 的值加到结果上。这在求总和时有用。 

MVN : 传送取反的值

(Move Negative)

  MVN{条件}{S}  <dest>, <op 1>

                dest = !op_1
MVN 从另一个寄存器、被移位的寄存器、或一个立即值装载一个值到目的寄存器。不同之处是在传送之前位被反转了,所以把一个被取反的值传送到一个寄存器中。这是逻辑非操作而不是算术操作,这个取反的值加 1 才是它的取负的值:
  MVN     R0, #4                  ; R0 = -5

  MVN     R0, #0                  ; R0 = -1
 

ORR : 逻辑或

(logical OR)

  ORR{条件}{S}  <dest>, <op 1>, <op 2>

                dest = op_1 OR op_2
OR 将在两个操作数上进行逻辑或,把结果放置到目的寄存器中;对设置特定的位有用。操作数 1 是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即值:
  ORR     R0, R0, #3              ; 设置 R0 中位 0 和 1
OR 真值表(二者中存在 1 则结果为 1):
  Op_1   Op_2   结果

  0      0      0
  0      1      1
  1      0      1
  1      1      1

RSB : 反向减法

(Reverse Subtraction)

  RSB{条件}{S}  <dest>, <op 1>, <op 2>

                dest = op_2 - op_1
SUB 用操作数 two 减去操作数 one,把结果放置到目的寄存器中。操作数 1 是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即值:
  RSB     R0, R1, R2              ; R0 = R2 - R1
  RSB     R0, R1, #256            ; R0 = 256 - R1
  RSB     R0, R2, R3,LSL#1        ; R0 = (R3 << 1) - R2
反向减法可以在有符号或无符号数上进行。 

RSC : 带借位的反向减法

(Reverse Subtraction withCarry)

  RSC{条件}{S}  <dest>, <op 1>, <op 2>

                dest = op_2 - op_1 - !carry
同于 SBC,但倒换了两个操作数的前后位置。 


SBC : 带借位的减法

(Subtraction withCarry)

  SBC{条件}{S}  <dest>, <op 1>, <op 2>

                dest = op_1 - op_2 - !carry
SBC 做两个操作数的减法,把结果放置到目的寄存器中。它使用进位标志来表示借位,这样就可以做大于 32 位的减法。SUBSBC 生成进位标志的方式不同于常规,如果需要借位则清除进位标志。所以,指令要对进位标志进行一个操作 - 在指令执行期间自动的反转此位。 



传送多个数据

使用多数据传送指令(LDM 和 STM)来装载和存储多个字的数据从/到内存。

LDM/STM 的主要用途是把需要保存的寄存器复制到栈上。如我们以前见到过的 STMFD R13!, {R0-R12, R14}

指令格式是:

  xxM{条件}{类型}  Rn{!}, <寄存器列表>{^}

‘xx’是 LD 表示装载,或 ST 表示存储。

再加 4 种‘类型’就变成了 8 个指令:

  栈        其他
  LDMED     LDMIB     预先增加装载
  LDMFD     LDMIA     过后增加装载
  LDMEA     LDMDB     预先减少装载
  LDMFA     LDMDA     过后减少装载 

  STMFA     STMIB     预先增加存储
  STMEA     STMIA     过后增加存储
  STMFD     STMDB     预先减少存储
  STMED     STMDA     过后减少存储

TST : 测试位

(Test bits)

  TST{条件}{P}  <op 1>, <op 2>

                Status = op_1 AND op_2
TST 类似于 CMP,不产生放置到目的寄存器中的结果。而是在给出的两个操作数上进行操作并把结果反映到状态标志上。使用TST 来检查是否设置了特定的位。操作数 1 是要测试的数据字而操作数 2 是一个位掩码。经过测试后,如果匹配则设置 Zero 标志,否则清除它。象CMP 那样,你不需要指定 S 后缀。
  TST     R0, #%1                 ; 测试在 R0 中是否设置了位 0。 

  

SWP : 单一数据交换

(Swap)

  SWP{条件}{B}  <dest>, <op 1>, [<op 2>]
指令格式

SWP 将:

  • 从操作数 2 所指向的内存装载一个字并把这个字放置到目的寄存器中。
  • 把寄存器操作数 1 的内容存储到同一个地址中。
如果目的和操作数 1 是同一个寄存器,则把寄存器的内容和给定内存位置的内容进行交换。
如果提供了 B 后缀,则将传送一个字节,否则传送一个字。 



ARM指令集的概述