3.2 ARM指令分类学习

3.2 ARM指令分类学习

1 算术移位寄存器和逻辑指令

1.1 mov 传送(Move)

Mov {条件} {S} <dest>, <op_1>

MOV从另一个寄存器、被移位的寄存器、或者一个立即数装载一个值到目的寄存器。还可以指定相同的寄存器来实 NOP 指令

MOV R0, R0 ; R0 = R0 等于 NOP 指令

MOV R0, R0, LSL#3 ; R0 = R0 * 8

如果 R15 是目的寄存器,将修改程序计数器或标志。这用于返回到调用代码,方法是把连接寄存器的内容传送到 R15:

MOV PC, R14 ; 退出到调用者

MOVS PC, R14 ; 退出到调用者并恢复标志位

(不遵从 32-bit 体系)

1.2 mvn : 传送取反的值

(Move Negative)

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

dest = !op_1

mov 从另一个寄存器、被移位的寄存器、或者一个立即数装载到一个值到目的寄存器。不同的之处是在传送的之前位被反转了,把被取反的值传送到一个寄存器中。这是逻辑非操作而不是算术操作,这个取反的值加1才是它的取负的值:

mvn r0, #4 ; r0 = -5

mvn r0, #0 ; r0 = -1

SUB : 减法

(Subtraction)

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

 

dest = op_1 - op_2

SUB 用操作数 one 减去操作数 two,把结果放置到目的寄存器中。操作数 1 是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即值:

SUB R0, R1, R2 ; R0 = R1 - R2

SUB R0, R1, #256 ; R0 = R1 - 256

SUB R0, R2, R3,LSL#1 ; R0 = R2 - (R3 << 1)

减法可以在有符号和无符号数上进行。

减数不可为立即数

ADD : 加法

(Addition)

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

 

dest = op_1 + op_2

ADD 将把两个操作数加起来,把结果放置到目的寄存器中。操作数 1 是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即值:

ADD R0, R1, R2 ; R0 = R1 + R2

ADD R0, R1, #256 ; R0 = R1 + 256

ADD R0, R2, R3,LSL#1 ; R0 = R2 + (R3 << 1)

AND : 逻辑与

(logical AND)

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

 

dest = op_1 AND op_2

AND 将在两个操作数上进行逻辑与,把结果放置到目的寄存器中;对屏蔽你要在上面工作的位很有用。 操作数 1 是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即值:

AND R0, R0, #3 ; R0 = 保持 R0 的位 0 和 1,丢弃其余的位。

AND 的真值表(二者都是 1 则结果为 1):

Op_1 Op_2 结果

 

0 0 0

0 1 0

1 0 0

BIC : 位清除

(Bit Clear)

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

 

dest = op_1 AND (!op_2)

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

BIC R0, R0, #0b1011 ; 清除 R0 中的位 0、1、和 3。保持其余的不变。

BIC 真值表 :

Op_1 Op_2 结果

 

0 0 0

0 1 0

1 0 1

1 1 0

译注:逻辑表达式为 Op_1 AND NOT Op_2

1

比较指令

CMP : 比较

(Compare)

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

 

                status = op_1 - op_2

CMP 允许把一个寄存器的内容如另一个寄存器的内容或立即值进行比较,更改状态标志来允许进行条件执行。它进行一次减法,但不存储结果,而是正确的更改标志。标志表示的是操作数 1 比操作数 2 如何(大小等)。如果操作数 1 大于操作操作数 2,则此后的有 GT 后缀的指令将可以执行。明显的,你不需要显式的指定 S 后缀来更改状态标志... 如果你指定了它则被忽略。

会影响程序状态字

寄存器 15 (26-bit 模式):

R15 构造如下:

  Bit  31  30  29  28  27  26  25------------2  1  0

 

       N   Z   C   V   I   F    程 序 计 数 器  S1 S0

标志的意义:


N Negative 如果结果是负数则置位

  Z  Zero            如果结果是零则置位

  C  Carry           如果发生进位则置位

  O  Overflow        如果发生溢出则置位

  I  IRQ             中断禁用

  F  FIQ             快速中断禁用

 

  S1 和 S0 是处理器模式标志:

 

           S1   S0   模式

           0    0    USR - 用户模式

           0    1    FIQ - 快速中断模式

           1    0    IRQ - 中断模式

           1    1    SVC - 超级用户模式

在 R15 作为一个指令的第一个操作数的时候,只有程序计数器部分是可以获得的。所以,下列指令把 PC 复制到一个寄存器中并向这个目标寄存器加上 256:
  ADD    R0, R15, #256
(对于 BASIC 汇编器 R15 和 PC 的意思是相同的)

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, #0b1                 ; 测试在 R0 中是否设置了位 0。

 
 

 

上一篇:PHP-----类与对象,成员方法,成员属性,构造方法,析构方法


下一篇:12. Linux在线升级yum