ARM汇编指令基础总结

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),决定了序状态寄存器CPSRN,Z两位


如果比较结果小于零上述N位置1,如果结果相等,Z位置1,大于零则NZ位均为零

2) tst:测试位

tst  op1,op2

op1op2将进行按位与操作按位与的结果同样会影响到CPSR寄存器的Z按位与结果不等于零时,Z位就不会置1,如果按位与的结果为零Z位置1。

 

3. 跳转指令

1) b:分支指令

b {条件}  <地址>

cmp r1,r2       #比较r1r2,如果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]     

猜你喜欢

转载自blog.csdn.net/yemaopi/article/details/78597869