[ARM裸机程序][7]ARM 指令分类学习

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

MOV传送

MOV{条件}{S}  <dest>, <op 1>
dest = op_1

MOV从另一个寄存器、被移位的寄存器或者一个立即数装载一个值到目的寄存器。还可以指定相同的寄存器来实现 NOP 指令。如:MOV R0,R0。移位后传送指令:MOV R0, R0, LSL#3

如果 R15 是目的寄存器,将修改程序计数器或标志。这用于返回到调用代码,方法是把连接寄存器的内容传送到 R15:
退出到调用者:MOV PC, R14
退出到调用者并恢复标志位:MOVS PC, R14
指令中后缀有S说明该指令会改变CPSR。

MVN传送取反

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

MVN在传送的之前位被反转了,把被取反的值传送到一个寄存器中。这是逻辑非操作而不是算术操作,这个取反的值加1才是它的取负的值:

MVN R0, #4 ; R0 = -5
MVN R0, #0 ; R0 = -1

SUB减法

SUB{条件}{S} <dest>, <op 1>, <op 2>
dest = op_1 - op_2

SUB用操作数1减去操作数2,把结果放置到目的寄存器中。操作数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加法

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逻辑与

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 的真值表:

    Op_1 Op_2 结果
    0    0    0
    0    1    0
    1    0    0
    1    1    1

BIC位清除

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

比较指令

CMP : 比较

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

TST : 测试位指令

 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章