arm常用指令一览表

原文地址:http://wenku.baidu.com/link?url=vpq6fLW96vV8HPn5a8hs6ilAJsgp-lB3_AIuGw2zXRDlOHYJ1lShZdntS9nncyZadDNDSqj-0UMrBnHBSKW9Z4LCk7ocfj6SzUVMH_hcfGW

指令 功能 实例 注释
mov 给一个寄存器赋值 Mov r0,+#10
Mov ro,r1
R0 = 10
R0 = r1
Movt 给一个寄存器的高16位赋值 Movt r0,#10
Movt r0,r1
把一个16位的op2放到r0的[31 -16],r0的[15-0]不变
注意:op2不能大于16位,但可以不符合立即数规则,如op2可以是0x234,op1必须是可读可写的
Mvn 把一个数值按位取反后赋值给一个寄存器 Mvn r0,#0xff
Mvn r0,r1
R0 = ~0xff
R0 = ~r1
Add 计算两个数值的加法 Add r0,r0,#10
Add r0,r0,r1
R0 = r0 +10
R0 = r0 + r1
Adc 带进位的加法 Adc r0,r0,#10
Adc r0,r0,r1
R0 = r0 + 10 +C
R0 = r0 + r1 + C
Sub 计算两位数值的减法 Sub r0,r0,#10
Sub r0,r0,r1
R0= ro -10
R0 =r0 - r1
Sbc 带错位的减法 Sbc r0,r0,#10
Sbc r0,r0,r1
R0 = r0-10-!C
R0 = r0 -r1 -!C
Rsb 反转减法 Rsb r0,r0,r1
Rsb r0,r0,#10
R0 = r1 - r0
R0 = 10 - r0
Rsc 带错位的反转减法 Rsc r0,r0,r1
Rsc r0,r0,#10
R0 = r1 - r0 - !C
R0 = 10 -r0 - !C
Mul 乘法 Mul r0,r1,r2 R0 = r1 *r2
Mla 乘加 Mla r0,r1,r2,r3 R0 = r1*r2 + r3
Mls 乘减                                     MLs r0,r1,r2,r3 R0 = r3 - r1*r2                                                                                          
Orr 按位或 Orr r0,r1,r2,r3
Orr r0,r0,#10
R0 = r0 | r1
R0 = ro | ro
Eor 按位异或 Eor r0,r0,#10
Eor r0,r0,r1
R0 = r0 ^10
R0 = r0^r1
And 按位与 And r0,r0,r1
And r0,r0,#10
R0 = r0 &r1
R0 = r0 &10
Bic 位取反 Bic r0,r0,r1
Bic r0,r0,#10
R0 = r0 &(~r1)
R0 = r0 &(~10)
Lsr 逻辑右移 R0,1sr,r1
R0,1st,#10
R0 >>>r1
R0>>>1
Ls1 逻辑左移 R0,1s1 r1
R0,1S1 #!
R0 <<<r1
R0<<<1
Asr 算术右移 R0,asr r1
R0,asr #1
R0>>r1
R0>>1
Ror 循环右移 R0,ror r1
R0,ror #1
(R0 >>>r1) (R0<<<(32 -r1))
(R0>>>1) |(R0<<<(32 -1))
Cmp 比较 Cmp ro,r1
Cmp r0,#10
R0 -r1 影响cpsr标志位
R0 -10影响cpsr的标志位
Teq 比较(按位异或) Tep r0,r1
Tep r0,#10
R0 ^r1影响cpsr的标志位
R0 ^10影响cpsr的标志位
Tst 比较(按位与) Tst r0,r1
Tsr r0,#10
R0 &r1影响cpsr的标志位
R0 &10影响cpsr的标志位
Mrs 读cpsr Mrs r0,cpsr R0 = cpsr
Msr 写cpsr Msr cpsr,r0 Cpsr = r0
Swi 软中断 Swi 10 产生软中断异常
Svc 等同于swi Svc 10 产生软中断异常
Ldr 把数据从内存加载到寄存器 Ldr r0 ,addr
ldr r0 ,= addr
ldr r1,[r0]
ldr r1,[r0,#4]!
ldr r1,[r0],#4
R0 = *addr
R0 = addr
R1 = *r0
R1 = *(r0 + 4)
R1 = *(r0 + 4) ;r0 += 4
R1 = *r0;r0 += 4
Str 把数据从寄存器保存在内存 Str r0,addr
Str r1,[r0]
Str r1,[r0,#4]
Str r1,[r0 ,#4]
Str r1,[r0],#4
*addr = r0
*r0 = r1
*(r0 + 4) = r1
*r0 = r1;r0 += 4
Ldm 把数据从内存加载到寄存器 Ldmfd sp!,(r0 - r12,lr) 把寄存器的值放到慢递减栈中
Stm 把数据从寄存器保存的内存 Stmfd sp!,(r0-r12,lr) 从慢递减栈中把值取到寄存器
push 压栈 push {r0-r12,lr} 把寄存器的值放到慢递减栈中
pop 出栈 Pop{r0-r12,lr} 从慢递减栈中把值取到寄存器
b 跳转 B lable 跳到lable处执行
B1 跳转并保存返回地址 B1 lable 保存下一条指令的地址到lr,并跳转到lable处执行
Bx 跳转(可切换状态) Bx,r0 跳转到r0所指的位置执行
Clz 计算一个数值高位数零的个数 Clz r0 ,r1 计算r1中开头的零的个数,把计算结果放到r0
Qadd 饱和加法 Qadd r0,r0,r1 运算结果的饱和到[0x80000000,0x7fffffff]
Qadd8 饱和8位加法 Qadd8 r0,r0,r1 r1和r2的每一个字节分别相加,饱和到[-2^7,2^7-1]
注意:每一个操作数都是寄存器,不影响Q位
Qadd16 饱和16位算法 Qadd16 r0,r0,r1 r1和r2的每一个16位相加,饱和到[-2^15,2^15-1]
注意:每一个操作数都是寄存器,不影响Q位
Qsub 饱和算法 Qsub r0,r0,r1 运算的结果饱和到[0x80000000,0x7fffffff]
Qsub16 饱和16位减法 Qsub16 r0,r0,r1 r1和r2的每一个16位分别相减,饱和到[-2^15,2^15-1]
注意:每一个操作数都是寄存器,不影响Q位
Qsub8 饱和8位减法 Qsub8 r0,r0,r1 r1和r2的每一个字节分别相减,饱和到[-2^7,2^7-1]
注意:每一个操作数都是寄存器,不影响Q位
Ssat 有符号饱和 Ssat r0,#sat,r1 1<=sat<=32
把r1饱和到[-2^(sat-1),2^(sat -1) -1],结果放到r0,如果饱和会置位Q
注意:把r1中的每一个16位饱和到sat个位,饱和后符号不变
Usat 无符号饱和 Usat r0,#sat,r1 0<=sat<=31
把r1中的每一个16位饱和到[0,2^sat-1],结果放到r0,如果饱和后位置为Q
注意:负数饱和到0
Usat16 无符号16位置饱和 Usat16,r0,#sat,r1 usat16 r0,#sat,r1
0<=sat<=31
把r1中的两个16位分别饱和到[0,2^sat-1],结果放到r0,如果饱和会置位Q
注意:负数饱和到0
Rev 大小端转换 Rev r0,r1 把r1进行大小端转换,结果放到r0
玩成      

你可能感兴趣的:(arm常用指令一览表)