一.算术与逻辑指令
mvn r0, #0 将立即数取反送入r0 ff
与ARM标准汇编有区别
sub 指令
SUB{条件}{S} <dest>, <op 1>, <op 2>
dest = op_1 - op_2
dest和op1都不能是立即数(#1)
add和sub一样,op2不能是立即数
bic 位清除
BIC{条件}{S} <dest>, <op 1>, <op 2>
dest = op_1 and (!op_2)
mov r0,#0b101011
Eg: bic r1,r0,0b101011 (二进制数)
二.比较指令
cmp:比较
cmp{条件}{P} <op 1>, <op 2>
status = op_1 - op_2 ;得到状态位
Eg: mov r1,#2 ;C 置1
cmp r1,#1
mov r1,#2 ;N 置1
cmp r1,#3
mov r1,#2 ;Z 置1
cmp r1,#2
根据程序状态寄存器看结果:r15:cpsr的各位数的值
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 快速中断禁用
tst:测试位
tst {条件}{P} <op 1>, <op 2>
Status = op_1 AND op_2 ;按位与
Eg:
mov r1,#0b101
cmp r1,#0b001 ;按位与的结果赋给status
mov r1,#0b101
cmp r1,#0b010
后面也是在程序状态寄存器看结果:r15:cpsr的各位数的值
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 快速中断禁用
三.跳转指令(分支指令)
b 分支
if(a>b)
{
a-b
}
else
{
a+b
}
mov r1,#6
mov r2,#5
cmp r1,r2
bgt branch1 ; gt : 大于(有符号)
add r3,r1,r2
b end
branch1:
sub r3,r1,r2
end
nop
bl 带连接的分支
mov r2,#3
cmp r2,#1
bl func1 //跳转到func1
mov r2,#3
mov r2,#4
mov r2,#5
func1:
mov r2,#1
mov r3,#3
mov pc,lr //回到跳转前的位置往下执行
四.移位指令
lsl 算术左移。
Eg:
mov r1,#0b1
mov r1,r1,lsl#2
ror 循环右移
Eg:
mov r1,#0b111
mov r1,r1,ror#1
五.程序状态字访问指令
mrs r0,cpsr ; 程序状态寄存器
orr r0,#0b100
msr cpsr,r0
六.存储器访问指令
ldr 从内存读出
str 写进内存
mov r0, #0xff
str r0, [r1] ;把r0的值写进地址为r1的内存
str fp, [sp, #-4]!
将sp的值减4赋给sp,将fp的值写进现在sp地址处
加!号,表示将将sp的值减4赋给sp,不加!,sp的值不变
ldr 从内存读出
ldr r2, [r1] ;把r1地址的数据取出赋给寄存器r2