算术移位寄存器和逻辑指令
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