您现在的位置是:首页 >技术教程 >总线与地址以及ARM的寄存器网站首页技术教程
总线与地址以及ARM的寄存器
2.8.1 地址的本质
地址到底是什么?在一个计算机系统中,计算机是如何给内存RAM,外部设备控制器的寄存器分配地址的?在搞清楚这个问题之前,我们需要先把地址的概念搞清楚。学过数字电路的同学应该记得译码器这样一种组合逻辑电路器件;一组输入信号,通过译码转换,会选中一个输出信号,输出信号可以是高电平,低电平。甚至是 一个脉冲,计算机的内存简单点理解,其实就是将一系列存储单元和译码器组装在一起,内存中包含很多存储单元,为了方便管理,我们需要将这些存储单元进行编号管理,每一个存储单元对应一个编号。当CPU想访问其中一个存储单元时,可以通过CPU管脚发出一组信号,经过译码器译码,选中与这个信号对应的存储单元,然后就可以直接读写这块内存了,CPU管脚发出的这组信号,也就是存储单元对应的编号。
ARM体系结构与汇编语言
3.1 ARM体系结构
计算机的指令集一般可以分为4种,复杂指令集(CISC),精简指令集,显式并行指令集和超长指令字指令集VLIW。我们在嵌入式学习和工作中需要经常打交道的是RISC指令集,RISC指令集相对于CISC指令集,主要有以下特点。
1 Load Store 架构,CPU不能直接处理内存中的数据,需要先将内存中的数据Load到寄存器中才能操作,然后将处理结果Store刀内存中。
2 固定的指令长度,单周期指令
3 倾向于使用更多的寄存器来存储数据,而不是使用内存中的堆栈,效率更高。
4 ARM指令虽然属于RISC,但是和原汁原味RISC相比,还是有一定的差异的,具体如下。
5 并不是所有的ARM指令都是单周期的。
6 ARM有16位的thumb指令集,是32位ARM指令集的压缩形式,提高了代码密度。
7 条件执行,通过指令组合,减少了分支指令数目,提高了代码密度。
8 增加了DSP,SIMD/neon 等指令。
ARM处理器有多种工作模式,应用程序正常运行时,ARM处理器就会切换到对应的特权工作模式,用户模式属于普通模式,有些特权指令是运行不了的。需要切换到特权模式下才能运行,在ARM处理器中,除了用户模式是普通模式,剩下的几种工作模式都属于特权模式。
ARM处理器的不同工作模式
处理器模式 | 模式介绍 |
User Mode | 应用程序正常运行的模式 |
FIQ Mode | 快速中断模式,中断优先级比IRQ高 |
IRQ Mode | 中断模式 |
Supervisor Mode | 管理模式,保护模式 |
Abort Mode | 数据异常,指令读取失败进入该模式 |
Undefined Mode | CPU遇到未识别,未定义的指令会进入这个模式 |
System Mode | 类似用户模式 |
Monitor Mode | 安全扩展 |
在ARM处理器内部,除了基本的算数运算单元,逻辑运算单元,浮点运算单元和控制单元,还有一系列寄存器,包括各种通用寄存器,状态寄存器,控制寄存器。用来控制处理的运行,保存程序运行时各种状态和临时结果。
System/User Mode | FIQ | Supervisor | Abort | IRQ | Undefined |
R0 | R0 | R0 | R0 | R0 | R0 |
R1 | R1 | R1 | R1 | R1 | R1 |
R2 | R2 | R2 | R2 | R2 | R2 |
R3 | R3 | R3 | R3 | R3 | R3 |
R4 | R4 | R4 | R4 | R4 | R4 |
R5 | R5 | R5 | R5 | R5 | R5 |
R6 | R6 | R6 | R6 | R6 | R6 |
R7 | R7 | R7 | R7 | R7 | R7 |
R8 | R8 fiq | R8 | R8 | R8 | R8 |
R9 | R9 fiq | R9 | R9 | R9 | R9 |
R10 | R10 fiq | R10 | R10 | R10 | R10 |
R11 | R11 fiq | R11 | R11 | R11 | R11 |
R12 | R12 fiq | R12 | R12 | R12 | R12 |
R13 | R13 fiq | R13 svc | R13 abt | R13 | R13 |
R14 | R14 fiq | R14 svc | R14 abt | R14 | R14 |
R15(PC) | R15(PC) | R15(PC) | R15(PC) | R15(PC) | R15(PC) |
ARM处理器中的寄存器可以分为通用寄存器和专用寄存器两种,寄存器R0 ~ R12属于通用寄存器,除了FIQ工作模式,在其他工作模式下这些寄存器都是公用,共享的,R0~R3通常用来传递函数参数,R4~R11用来保存程序运算的中间结果或者函数的局部变量等,R12常用来作为函数调用过程中的临时寄存器,ARM处理器有多种工作模式,除了这些在各个模式下通用的寄存器,还有一些寄存器在各自的工作模式下是独立存在的,如R13,R14,R15 CPSP,SPSR寄存器,在每个工作模式下都有自己单独的寄存器,R13寄存器又称为堆栈指针寄存器,用来维护和管理函数调用过程中的栈帧变化,R13总是指向当前正在运行的函数的栈帧,一般不能用做其它用途。R14寄存器称为链接寄存器,LR。在函数调用过程中主要用来保存上一级函数调用者的返回地址,寄存器R15又称为程序计数器PC,CPU从内存取出来指令,就是默认从PC保存的地址中取的,每取一次指令,PC寄存器的地址值自动的增加,CPU一条一条不停的取指令。程序也就一直运行下去,在ARM三级流水线种,PC指针的值等于当前正在运行的指令地址,后续的32位处理器虽然流水线的级数不断增加,但是为了简化编程,PC指针的值继续延续了这种计算方式。