文章目录
数据处理指令
常见的数据处理指令如下表所示,它们支持相同的寻址方式,详情可见笔记。
助记符 | 说明 | 实现逻辑 |
---|---|---|
MOV | 数据传送 | Rd = Rn(Rn可能需要运算) |
MVN | 数据取反传送 | Rd = ~Rn(Rn可能需要运算) |
ADD | 加 | Rd = Rn + op2 |
ADC | 带进位加 | Rd = Rn + op2 + C |
AND | 逻辑加 | Rd = Rn && op2 |
EOR | 逻辑异或 | Rd = Rn ^ op2 |
SUB | 减 | Rd = Rn - op2 |
SBC | 带进位的减 | Rd = Rn - op2 + C - 1 |
RSB | 反转减 | Rd = op2 - Rn |
RSC | 带进位的反转减 | Rd = op2 - Rn + C - 1 |
TST | 测试 | Rn && op2的结果更新标志位 |
TEQ | 测试相等 | Rn ^ op2的结果更新标志位 |
CMP | 比较 | Rn - op2的结果更新标志位 |
CMN | 符数比较 | Rn + op2的结果更新标志位 |
ORR | 逻辑或 | Rd = Rn || op2 |
BIC | 位清零 | Rd = Rn && ~(op2) |
1. MOV传送指令
MOV指令将第二个操作数传送到目标寄存器中。
MOV{<cond>} {S} <Rd>, <shifter_operand>
if ConditionPassed(cond) then
Rd = shifter_operand
if S == 1 and Rd == R15 then
CPSR = SPSR
elif S == 1 then
N Flag = Rd[31]
Z Flag = if Rd == 0 then 1 else 0
C Flag = shifter_carry_out
V Flag = unaffected
2. MVN传送指令
MVN将第二个操作数的反码传送到目标寄存器中。
MVN{<cond>} {S} <Rd>, <shifter_operand>
if ConditionPassed(cond) then
Rd = NOT shifter_operand
if S == 1 and Rd == R15 then
CPSR = SPSR
elif S == 1 then
N Flag = Rd[31]
Z Flag = if Rd == 0 then 1 else 0
C Flag = shifter_carry_out
V Flag = unaffected
3. ADD加法指令
ADD指令将Rn与第二个操作数相加,然后将结果保存在目标寄存器中。
ADD{<cond>} {S} <Rd>, Rn, <shifter_operand>
if ConditionPassed(cond) then
Rd = Rn + shifter_operand
if S == 1 and Rd == R15 then
CPSR = SPSR
elif S == 1 then
N Flag = Rd[31]
Z Flag = if Rd == 0 then 1 else 0
C Flag = CarrayFrom(Rn + shifter_operand)
V Flag = OverflowFrom(Rn + shifter_operand)
4. ADC带进位加法指令
ADC指令将Rn和第二个操作相加,再加上CPSR中C标志位的值,然后将结果保存在目标寄存器中。
ADC{<cond>} {S} <Rd>, Rn, <shifter_operand>
if ConditionPassed(cond) then
Rd = Rn + shifter_operand + C Flag
if S == 1 and Rd == R15 then
CPSR = SPSR
elif S == 1 then
N Flag = Rd[31]
Z Flag = if Rd == 0 then 1 else 0
C Flag = CarrayFrom(Rn + shifter_operand + C Flag)
V Flag = OverflowFrom(Rn + shifter_operand + C Flag)
5. SUB减法指令
SUB指令用Rn减去第二个操作数,然后将结果保存到目标寄存器中。
SUB{<cond>} {S} <Rd>, Rn, <shifter_operand>
if ConditionPassed(cond) then
Rd = Rn - shifter_operand
if S == 1 and Rd == R15 then
CPSR = SPSR
elif S == 1 then
N Flag = Rd[31]
Z Flag = if Rd == 0 then 1 else 0
C Flag = NOT BorrowFrom(Rn - shifter_operand)
V Flag = OverflowFrom(Rn - shifter_operand)
6. SBC带位减法指令
SBC指令用Rn减去第二个操作数,再减去CPSR寄存器中的C标志位的反码,然后将结果保存在目标寄存器中。
SBC{<cond>} {S} <Rd>, Rn, <shifter_operand>
if ConditionPassed(cond) then
Rd = Rn - shifter_operand + NOT(C Flag)
if S == 1 and Rd == R15 then
CPSR = SPSR
elif S == 1 then
N Flag = Rd[31]
Z Flag = if Rd == 0 then 1 else 0
C Flag = NOT BorrowFrom(Rn - shifter_operand - NOT(C Flag))
V Flag = OverflowFrom(Rn - shifter_operand - NOT(C Flag))
7. RSB逆向减法指令
RSB将第二个操作数减去Rn的结果保存在目标寄存器中。
RSB{<cond>} {S} <Rd>, Rn, <shifter_operand>
if ConditionPassed(cond) then
Rd = shifter_operand - Rn
if S == 1 and Rd == R15 then
CPSR = SPSR
elif S == 1 then
N Flag = Rd[31]
Z Flag = if Rd == 0 then 1 else 0
C Flag = NOT BorrowFrom(shifter_operand - Rn)
V Flag = OverflowFrom(shifter_operand - Rn)
8. RSC带位逆向减法指令
RSC将第二个操作数减去Rn,然后再减去CPSR寄存器中C标志位的反码,最后将结果保存在目标寄存器中。
RSC{<cond>} {S} <Rd>, Rn, <shifter_operand>
if ConditionPassed(cond) then
Rd = shifter_operand - Rn - NOT(C Flag)
if S == 1 and Rd == R15 then
CPSR = SPSR
elif S == 1 then
N Flag = Rd[31]
Z Flag = if Rd == 0 then 1 else 0
C Flag = NOT BorrowFrom(shifter_operand - Rn - NOT(C Flag))
V Flag = OverflowFrom(shifter_operand - Rn - NOT(C Flag))
9. ADD逻辑与指令
ADD指令将Rn与第二个操作数做按位与运算,将结果保存在目标寄存器中。
ADD{<cond>} {S} <Rd>, Rn, <shifter_operand>
if ConditionPassed(cond) then
Rd = Rn & shifter_operand
if S == 1 and Rd == R15 then
CPSR = SPSR
elif S == 1 then
N Flag = Rd[31]
Z Flag = if Rd == 0 then 1 else 0
C Flag = shifter_carry_out
V Flag = unaffected
10. ORR逻辑或指令
ORR指令将Rn与第二个操作数做按位或运算,将结果保存在目标寄存器中。
ORR{<cond>} {S} <Rd>, Rn, <shifter_operand>
if ConditionPassed(cond) then
Rd = Rn | shifter_operand
if S == 1 and Rd == R15 then
CPSR = SPSR
elif S == 1 then
N Flag = Rd[31]
Z Flag = if Rd == 0 then 1 else 0
C Flag = shifter_carry_out
V Flag = unaffected
11. EOR逻辑异或指令
EOR指令将Rn与第二个操作数做异或运算,将结果保存在目标寄存器中。
EOR{<cond>} {S} <Rd>, Rn, <shifter_operand>
if ConditionPassed(cond) then
Rd = Rn ^ shifter_operand
if S == 1 and Rd == R15 then
CPSR = SPSR
elif S == 1 then
N Flag = Rd[31]
Z Flag = if Rd == 0 then 1 else 0
C Flag = shifter_carry_out
V Flag = unaffected
12. BIC位清除指令
BIC将第二个操作数与Rn的反码做按位与运算,将结果保存在目标寄存器中,实现的效果就是如果要让Rn中指定位位0,那么将第二个操作数的指定位设置为1即可。
BIC{<cond>} {S} <Rd>, Rn, <shifter_operand>
if ConditionPassed(cond) then
Rd = Rn & ~shifter_operand
if S == 1 and Rd == R15 then
CPSR = SPSR
elif S == 1 then
N Flag = Rd[31]
Z Flag = if Rd == 0 then 1 else 0
C Flag = shifter_carry_out
V Flag = unaffected
13. CMP比较指令
CMP用Rn减去第二个操作数,根据结果更新CPSR中的标志位。
CMP{<cond>} Rn, <shifter_operand>
if ConditionPassed(cond) then
alu_out = Rn - shifter_operand
N Flag = alu_out[31]
Z Flag = if alu_out== 0 then 1 else 0
C Flag = NOT BorrowFrom(Rn - shifter_operand)
V Flag = OverflowFrom(Rn - shifter_operand)
14. CMN基于相反数的比较指令
CMN将Rn加上第二个操作数,根据结果更新CPSR中的标志位。
CMN{<cond>} Rn, <shifter_operand>
if ConditionPassed(cond) then
alu_out = Rn + shifter_operand
N Flag = alu_out[31]
Z Flag = if alu_out== 0 then 1 else 0
C Flag = CarryFrom(Rn + shifter_operand)
V Flag = OverflowFrom(Rn + shifter_operand)
15. TST位测试指令
TST指令将第二个操作数与Rn按位做逻辑与操作,根据结果更新CPSR寄存器中的相应标志位。
TST{<cond>} Rn, <shifter_operand>
if ConditionPassed(cond) then
alu_out = Rn & shifter_operand
N Flag = alu_out[31]
Z Flag = if alu_out== 0 then 1 else 0
C Flag = shifter_carry_out
V Flag = unaffected
16. TEQ相等测试指令
TST指令将第二个操作数与Rn按位做逻辑异或操作,根据结果更新CPSR寄存器中的相应标志位。
TEQ{<cond>} Rn, <shifter_operand>
if ConditionPassed(cond) then
alu_out = Rn ^ shifter_operand
N Flag = alu_out[31]
Z Flag = if alu_out== 0 then 1 else 0
C Flag = shifter_carry_out
V Flag = unaffected