ARM基础知识

1、基本概念

汇编指令:机器指令(32位的二进制数)的助记符,需要经过编译得到机器指令,由cpu读取执行

伪指令:不是真正的汇编指令,是用来指导编译过程的,由编译器提供

立即数:就类似c语言的常量  1  2,在汇编中:#1

2、数据搬移指令

Mov r0, #1   @将立即数1拷贝到寄存器r0中

Mov r1,r0  @  r1 = r0

汇编指令的格式:

<opcode> {<cond>} {s} <rd>,<rn>,{<operand2>}

其中:<>内的项是必须的,{}是可选的

Opcode:汇编指令

Cond:执行条件

S:是否影响cpsr寄存器的高四位

Rd:目标寄存器

Rn:第一个操作数寄存器,只能是寄存器,mov没有

Operand2:第二操作数,可以是寄存器,也可以是立即数

        为什么mov指令在使用的时候需要考虑立即数是否合法?

        答:因为机器指令是32位,其中要体现出指令+目标寄存器+第二操作数,所以第二操作数肯定小于32位,其所占位数位12位,其中还包含移位指令,所能使用的位数位8位,也就是0到7位,所以立即数需要判断是否合法。             

31-28:条件码

27-26:预留,默认是0

25:1  第二操作数是立即数   0  第二操作数是寄存器

24-21:汇编指令  mov:1101

20:1  影响cpsr的高四位   0  不影响cpsr的高四位

19-16:0000  第一操作数

15-12:目标寄存器

11-0:

         如果是寄存器:3-0  第二操作数寄存器  5-6  移位方式  11-7 移动的位数 

         如果是立即数:0-7  一个立即数  8-11:0-7位的立即数要循环右移的位数

总结:

  1. 如果立即数在0-255之间肯定是合法
  2. 如果超出了255,就要看这个数能不能通过一个0-7位有值其他位为0的这个数循环右移偶数位得到,如果能就是合法,否则就是非法
  3. 非法的立即数可以ldr伪指令,ldr r3,=0x12345678

3、算术指令

Add r2,r1,r0    @r2 = r1+r0

Add r2,r2,r1   @r2 = r2+r1  -->add r2,r1  @r2 += r1

Add r2,r1,lsl #2  @r2 = r2 + r1 << 2;   注意:第二操作数只能是寄存器

Sub r2,r1,r0   @r2 = r1-r0

Mul r2,r1,r0  @r2 = r1 * r0

4、逻辑指令

And r2,r1,r0    @r2 = r1 & r0

Orr r2,r1,r0    @r2 = r1 | r0

Bic r2,#0x11  @将r2的第四位和第0位清0

5、比较指令

不加s都会影响cpsr的高四位

Cmp r0,r1  @比较r0和r1的大小

@判断r0和r1的大小

@r0=r1  r2 = 0xee

@r0 > r1  r2 = 0xdd

@r0 < r1  r2 = 0xcc

cmp r0,r1

moveq r2,#0xee

movhi r2,#0xdd

movcc r2,#0xcc

Tst r0,#0x10   @判断r0的第4位是否为0

ATPS标准规定:如果需要传参r0-r3就是用来传参的,r0是返回值,如果大于4个参数就要用到栈区

6、跳转指令

B 类似c语言的goto

b是无条件跳转指令

B aa

7、内存操作指令

b:将内存的内容(指令或者数据)拷贝到寄存器

Str:将寄存器的内容拷贝到内存

内存和内存拷贝:内存1--》寄存器--》内存2

ldr r0,=0x12345678  --->伪指令

ldr r0,[r1]  -->汇编指令  此时r1寄存器中的值是一个内存地址

                        将r1这个内存地址处的内容拷贝到寄存器r0

                        r0 = *r1

Str r0,[r1] --> *r1 = r0

每次操作2个字节

ldrh r2,[r0]

strh r2,[r1]

每次操作1个字节

ldrb r2,[r0]

strb r2,[r1]

Ldrb r2,[r0,#1]    @r2 = *(r0+1)

Ldrb r2,[r0],#1    @r2 = *r0, r0 = r0+1

8、块存储指令

Ldm:将一整块连续内存空间的内容拷贝到一组寄存器中

Stm:将一组寄存器的内容拷贝到一整块连续的内存空间中

Ia:先访问内存,再增加地址   p++

Ib:先增加地址,再访问内存  ++p

Da:先访问内存,再减小地址  p--

Db:先减小地址,再访问内存  --p

Arm使用的是满减栈

F:满

E:空

A:增

D:减

满减栈:

  sp!, {r0-r12}   入栈    寄存器内容拷贝到栈区

Ldmfd  sp!,  {r0-r12}  出栈    栈区内容拷贝到寄存器

9、种寻址方式

立即数寻址:mov r0,#1

寄存器寻址:mov r1,r0

寄存器间接寻址:ldr r1,[r0]

寄存器移位寻址:mov r0,r1,lsl #1

基址变址寻址:ldr r1,[r0,#4]

多寄存器寻址:ldmia r0, {r1-r3}

相对寻址:b aa

堆栈寻址:mrs sp!,{r0-r12}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值