3.ARM基本概念
ARM基本概念
-
一、RISC结构特性
-
二、ARM工作模式(USA、UFI、SM八大模式)
-
1、用户模式(USR:User)
-
用户模式是用户程序的工作模式,它运行在操作系统的用户态,它没有权限去操作其它硬件资源。
只能执行处理自己的数据,也不能切换到其它模式下,要想访问硬件资源或切换到其它模式只能通过软中断或产生异常
-
-
2、系统模式(SYS:System)
-
系统模式是特权模式,不受用户模式的限制
用户模式和系统模式共用一套寄存器
操作系统在该模式下可以方便的访问用户模式的寄存器,而且操作系统的一些特权任务可以使用这个模式访问一些受控的资源
-
-
3、中止模式(ABT:Abort)
-
中止模式用于支持虚拟内存或存储器保护
当用户程序访问非法地址,没有权限读取的内存地址时,会进入该模式
linux下编程时经常出现的segment fault通常都是在该模式下抛出返回的
-
-
4、未定义模式(UDF:Undefined)
-
未定义模式用于支持硬件协处理器的软件仿真,CPU在指令的译码阶段不能识别该指令操作时,会进入未定义模式。
-
-
5、快速中断模式(FIQ:Fast Interrupt Request)
-
快速中断模式是相对一般中断模式而言的,它是用来处理对时间要求比较紧急的中断请求,主要用于高速数据传输及通道处理中。
-
-
6、一般中断模式(IRQ:Interrupt Request)
-
一般中断模式也叫普通中断模式,用于处理一般的中断请求,通常在硬件产生中断信号之后自动进入该模式,该模式为特权模式,可以自由访问系统硬件资源。
-
-
7、管理模式(SVC:Supervisor)
-
管理模式是CPU上电后默认模式,因此在该模式下主要用来做系统的初始化,软中断处理也在该模式下。当用户模式下的用户程序请求使用硬件资源时,通过软件中断进入该模式。
说明:系统复位或开机、软中断时进入到SVC模式下
-
-
8、安全监管模式(MON:Monitor)
-
ARM系列有7个基本工作模式,Cortex-A系列有8种基本工作模式;
除用户模式以外,其余的所有6种模式称之为非用户模式,或特权模式(Privileged Modes);
其中除去用户模式和系统模式以外的5种又称为异常模式(Exception Modes),常用于处理中断或异常,以及需要访问受保护的系统资源等情况。
-
-
-
三、寄存器
-
R0-R10:存放用户数据
-
R11:fp:frame-pointer 用来记录一个栈空间的开始地址
-
R12:ip:The Intra-Procedure-Call scratch register 用来临时存储sp
-
R13 :sp:stack pointer 栈指针寄存器,每一种模式有自己的 R13,所以允许每一种异常都有自己的堆栈指针
-
R14:lr: link register 在发生跳转的时候,用来保存R15(PC)寄存器的值,每一种模式有自己的 R14
-
R15:pc:program counter
用来存放CPU将要执行的指令所在的内存地址
通常用作程序计数器
在程序开始执行前,将程序指令序列的起始地址,即程序的第一条指令所在的内存单元地址送入PC,CPU 按照 PC的指示从内存读取第一条指令。
当执行指令时,CPU自动地修改PC 的内容,即每执行一条指令PC增加一个量,使 PC总是指向正在读取的指令地址
-
CPSR:Current Program Status Register 当前程序状态寄存器,用来记录当前CPU状态
if(a > b), CPU怎么判断,看NZCV;a-b N置1 a < ba-b Z置1 a = b2个32位数相加,结果为33位,产生进位 C置1减的时候减不掉 借位来减 借位C置0超过了一个类型范围,char -128~127 超过了 V置1
-
SPSR:Saved Program Status Register 备份程序状态寄存器,异常产生的时候,用来保存CPSR的值
特权模式下,私有的 SPSR (Saved Program StatusRegister) ,当一个异常发生时保存当前的CPSR 值。结合连接寄存器可使处理器返回先前的状态(异常产生会去到其他模式去执行,执行完成后再返回以前的状态,系统模式和用户模式没有,因为其他模式都是异常模式)
共享的寄存器要注意保存
-
-
-
四、Keil4软件
-
更换编译器
-
Keil4自带的编译器识别不了,必须更换,这个是arm平台的gcc编译器,编译出来的指令是arm平台的机器码,Linux上的gcc编译器是x86平台的编译器
-
-
按钮
-
在Keil编程环境下,有三个按钮Translate,Build,Rebuild编译选项。
Translate是编译当前改动的源文件,在这个过程中检查语法错误。但并不生成可执行文件
Build是只编译工程中上次修改的文件及其它依赖于这些修改过的文件的模块,同时重新链接生成可执行文件。如果工程之前没编译链接过,它会直接调用Rebuild All。另外在技术文档中,Build实际上是指Increase Build,即增量编译。
Rebuild是不管工程的文件有没有编译过,会对工程中所有文件重新进行编译生成可执行文件,时间较长。
因此当平时对工程源文件里面main.c之类的文件进行修改时,选择用Build编译链接生成一次可执行文件就行了,不要再进行其他操作,不然仿真会失败。
-
-
代码
-
.global _start 声明一个ARM程序中的全局变量
伪操作:没有对应的机器码的指令
-
_start: 标签
-
@ 注释
-
汇编代码最后空出一行,不然编译会有警告
-
.global _start_start:mov r0,#1 @将数值1赋值给寄存器r0mvn r1,#0 @将数值0按位取反赋值给寄存器r1@mov r2,#12345678 @错误,不是合法立即数ldr r2,=12345678 @将数值12345678加载到寄存器r2ldr r3,=0x12345678 @将十六进制数12345678加载到寄存器r3 stop:b stop
-
-