ARM指令基本分类:
1. 算数和逻辑指令
2. 比较指令
3. 跳转指令
4. 移位指令
5. 程序状态字访问指令
6. 存储器访问指令
1. 算术和逻辑指令
1) mov--数据传送指令
它的传送指令只能是把一个寄存器的值(要能用立即数表示)赋给另一个寄存器,或将一个常量赋给寄存器,将后边的量赋给前边的量,比如
mov r1,r2
mov r1,#4096
这个立即数是小于0xff(65535)的数,如果大于65535,则用ldr指令赋值
2) mvn:传送取反的值
mvn R0, #4 ; R0 = -5 (-5,加上1才是4的负数)
mvn R0, #0 ; R0 = -1 (11111111 11111111 11111111,最高位为1表示负)
3) sub:减法
sub 用操作数 one 减去操作数 two,把结果放置到目的寄存器中。操作数 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)
4) add:加法
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)
5) and:逻辑与
and 将在两个操作数上进行逻辑与,把结果放置到目的寄存器中;对屏蔽你要在上面工作的位很有用。 操作数 1 是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即值:
and R0, R0, #3 ; R0 = 保持 R0 的位 0和 1,丢弃其余的位。
6) bic:位清除
bic 是在一个字中清除位的一种方法,与 OR 位设置是相反的操作。操作数 2 是一个 32 位位掩码(mask)。如果如果在掩码中设置了某一位,则清除这一位。未设置的掩码位指示此位保持不变。
bic R0, R0, #%1011 ; 清除 R0 中的位 0、1、和 3。保持其余的不变。
bic r0, r0, #0x00000007
2. 比较指令
1) cmp
cmp op1,op2
实际上两数在做减法运算,根据比较的三种结果(>0,=0,<0),决定了序状态寄存器CPSR的N,Z两位。
如果比较结果小于零,上述N位置1,如果结果相等,Z位置1,大于零则NZ位均为零。
2) tst:测试位
tst op1,op2
op1和op2将进行按位与操作,按位与的结果同样会影响到CPSR寄存器的Z位,按位与结果不等于零时,Z位就不会置1,如果按位与的结果为零,则Z位置1。
3. 跳转指令
1) b:分支指令
b {条件} <地址>
cmp r1,r2 #比较r1和r2,如果r1>r2,执行branch分支。
bgt branch
sub r1,r2,r3 #如果r1不大于r2,不会执行branch分支,而是该减法操作。
b end #继而跳到end分支,执行nop空操作,从而忽略以下branch。
branch:
add r1,r2,r3
end:
nop
无条件时,自动执行;有条件时,条件成立则执行。
条件: EQ : 等于,GT : 大于,LT : 小于。
2) bl:带连接的分支
bl func1
add r1, r1, #3
func1:
add r1,r1,#2
mov pc lr #func1执行完成后,跳转到func1的调用处上面(add r1, r1, #3)
b只是跳转,而bl除跳转外还将返回地址(bl的下一条指令的地址)保存到lr寄存器中。其中跳转范围是当前指令的前后32M。
4. 移位指令
1) lsl:逻辑或算术左移
mov r0, r1, lsl#2 #r1将会左移两位放入r0中
2) ror:循环右移
mov r1, #0b11
mov ,r1,r1,ror#1 #最后一个1移到最高位上去了,实现了循环
5. 程序状态字访问指令 (CPSR 和SPSR)
1) msr:复制 PSR 到一个寄存器中
mrs r1,CPSR #CPSR的值搬移到r1中
orr r1,#0b100 #对r1的值进行修改
msr CPSR,r1 #最后将r1的中重新搬移回CPSR中
程序状态寄存器不能直接使用上述的mov等指令来访问,需要通用寄存器间接访问
2) mrs:复制一个寄存器到 PSR 中
6. 存储器访问指令 (前5类操作属于CPU核里的寄存器)
1) ldr: 内存值---->寄存器
ldr r0, [r1] #将内存值(地址是r1的值)保存到r0寄存器中
2) str: 寄存器---->内存值
str Rd, [Rbase] # 存储 Rd(寄存器的值) 到 Rbase 所包含的有效地址
mov r1, #0x30001000 #内存地址
mov r0 ,#0xff
str r0,[r1]