首页 > 代码库 > 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 和 1OR 真值表(二者中存在 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 位的减法。SUB
和SBC
生成进位标志的方式不同于常规,如果需要借位则清除进位标志。所以,指令要对进位标志进行一个非操作 - 在指令执行期间自动的反转此位。 传送多个数据
使用多数据传送指令(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 的内容存储到同一个地址中。
如果提供了
B
后缀,则将传送一个字节,否则传送一个字。 ARM指令集的概述