嵌入式系统开发-麦子学院(10)——arm汇编基础

1. ARM指令集

MCU使用什么指令集主要由内核决定的,比如Cortex-M3使用的是Thumb-2指令集。
在这里插入图片描述

1)ARM指令集:

编代码全部是 32bits 的,每条指令能承载更多的信息,因此使用最少的指令完成功能, 所以在相同频率下运行速度也是最快的, 但也因为每条指令是32bits 的而占用了最多的程序空间。

2)Thumb指令集:

编代码全部是 16bits 的,每条指令所能承载的信息少,因此它需要使用更多的指令才能完成功能, 因此运行速度慢, 但它也占用了最少的程序空间。

3)Thumb-2指令集:

在前面两者之间取了一个平衡, 兼有二者的优势, 当一个 操作可以使用一条 32bits指令完成时就使用 32bits 的指令, 加快运行速度, 而当一次操作只需要一条16bits 指令完成时就使用16bits 的指令,节约存储空间。

2.CPU组成

在这里插入图片描述

3.处理器工作模式与寄存器

ARM的处理器模式分几种要看是ARM的哪个系列,但是以现在的系列来说,有九种模式,这九种模式就是CPU在运算的时候,本来在读程序,突然系统发生异常,比如说蓝屏,这个时候操作系统肯定有相关的处理,同时我们也需要CPU一些信号,那么我们就可以通话CPU的切换来进行处理,这样实际上是在最低级别上考虑到的方式来完成了安全控制和效率控制,还有节能控制,所以这就是我们为什么要模式切换的原因,它模式与模式之间相对而言是比较独立的。

Cortex-A九种处理器模式

1,user模式:用户模式,大部分程序运行时候的非特权模式。

2,FIQ模式:快速中断模式,进入FIQ中断异常,中断也会分类,除了硬件中断还有软件中断,中断的时候也会有消息传过来,这个消息可能数据量比较大,而且要求还很大,还有的消息数据量比较小,它要求就会很小,这种要求大的中断我们就称为快速中断,比较小的我们就称为一般中断。

3,IRQ模式:一般中断模式。

4,Supervisor(SVC)模式:超级管理员,它主要是用来管理调用指令被执行或者reset的时候,这个模式的权限级别非常大,所以一般情况下是不能随便用的。

5,Monitor(MON)模式:监视模式,就像后台服务,就像监测网络信号,其实CPU不需要去处理一些用户中断,这个模式主要用来安全扩展模式,只用于安全。

6,Abort(ABY)模式:退出模式,通常开始发生了用户级别的开始,就会出现这样的退出,这个时候CPU就会说暂停下面的代码运行,就直接退出。

7,Hyp(HYP)模式:是一个超级的监视者,它比超级管理员要稍微低一点,它主要是用来做一些虚拟化的扩展。

8,Undef(UND)模式:它就是未定义的指令执行的时候,比如说一条指令是CPU不识别的,就叫做未定义。

9,System(SYS)模式:系统模式,当系统自己异常的时候,就会发生这样的模式,它有一个特点就是可以进行各个模式的切换,在不同的状态的时候,访问的寄存器就有可能不一样,这个模式用到的寄存器与用户模式是共享的,只是访问级别不一样。这九种模式里面User模式称为非特权模式,其他的全部称为特权模式。

在这里插入图片描述
ARM的工作模式切换有两种方法:

  • 被动切换:在arm运行的时候产生一些异常或者中断来自动进行模式切换
  • 主动切换:通过软件改变,即软件设置寄存器来经行arm的模式切换,应为arm的工作模式都是可以通过相应寄存器的赋值来切换的。

ARM 片内寄存器
在这里插入图片描述

1)R0 - R12为通用寄存器,放通用数据,32bit。
2)各个模式的R0-R12与`USR模式`是共享的(除了FIQ的R8-R12),PC、CPSR所有模式共享。
3)USR模式没有SPSR寄存器。

在这里插入图片描述
ARM所有工作模式下都可以访问程序状态寄存器CPSR。CPSR包含条件码标志、中断禁止位、当前处理器模式以及其他状态和控制信息。

CPSR在每个异常模式下都有一个对应的物理寄存器——程序状态保存寄存器SPSR。当异常出现时,SPSR用于保存CPSR的值,以便异常返回后恢复异常发生时的工作状态。

在这里插入图片描述
参考博文:https://blog.csdn.net/sandeldeng/article/details/52954781

4. arm汇编寻址

寻址方式在C语言里面也可以称为一个内存操作,说到寻址方式,我们就会想哪里有地址,当然就是存储器,而存储器就包括内存,外存,外存就比如硬盘,内存就比如寄存器。也就是说我们想操作它们要怎么去寻址,现在我把常用的ARM寻址方式做了一个总结。

1,立即数寻址:常量寻址,比如“ADD R0,R0,#0X3F”也就是操作,条件,状态,Rd(目标寄存器),Rn(原寄存器),操作数这六个部分,对比来说就是把R0自己加上0x3F这样一个立即数,并且把加上的值还是给它自己。这是最简单的寻址方式。

2,寄存器寻址:比如“ADD R0,R1,R2”就是R1加R2,然后在把值存给R0。这个时候我们实际上就是去寻找寄存器,所以称为寄存器寻址。

3,寄存器间接寻址:比如“LDR R0,[R1]”“STR R0[R1]”,“LDR”和“STR”就是操作把数据在内存和寄存器之间进行传递的,通过它们我们才能访问内存地址。“LDR R0,[R1]”意思就是把R1里面所指向的内存地址的值赋到R0。比如说R1里面的值是0*00000103,它不会直接拷贝,因为它会把这个值当做内存里面的地址,然后去地址里面找值,然后在给R0。同样STR也是这样一个道理。“STR R0,[R1]”是把R0的值放到R1的内存地址里面去。

4,寄存器移位寻址:这个又设计到位运算,就要记住向左是乘向右是除,“ADD R3,R2,R1,LSL #2”这个指令如果抛开LSL后面这一段,就是把R1加R2给R3,加上LSL #2就表示左移两个立即数。也就表示R1左移两位再加R2然后在给R3。

5,基址地址寻址:“LDR R0,[R1#4]”也就是说把R1里面的值加上4这样的立即数所指向的地址,然后在给它读到它所指向的地址R0。“LDR R0,[R1]#4”这个就是R1所指向的内存地址,取出里面的值,然后再加上这个立即数4,然后再给R0。“LDR R0,[R1,R2]”R1的值加上R2的值,再去找这个所指向的内存然后给R0。

6,多寄存器寻址:“LDMIA R0,{R1,R2,R3,R4}”就是批量操作。

7,相对寻址:与跳转相关“BL NEXT”就表示跳转到NEXT,并且把当前的状态保存到寄存器里面。“MOV PC,LR”当MOV后面跟的是LR,也就表示子函数的返回调用,所以它也有一个跳转的作用,也就是相当于一个子程序的返回。

就是用数值去除以四,然后最后能够整除在0到25之间的就是有效的,因为它是要向右位移偶数位,从进位上看,向左移是乘,向右移就是除。

一步一步写ARM汇编(一)

一步一步写ARM汇编(二)

一步一步写ARM汇编(三)
一步一步写ARM汇编(四)

一步一步写ARM汇编(五)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值