ARM编程模型

原文:http://www.eefocus.com/article/08-08/49601s.html

ARM寻址方式与指令系统
ARM编程模型
ARM指令格式和寻址方式
ARM指令集
Thumb指令集

机器指令、伪指令和宏指令
机器指令:能被处理器直接执行,而伪指令宏和宏指令不能。机器指令包括ARM指令集和Thumb指令集 ;
伪指令:在源程序汇编期间,由汇编编译器处理。其作用是为汇编程序完成准备工作;
宏指令:在程序中用于调用宏,宏是一段独立的程序代码;在程序汇编时,对宏调用进行展开,用宏体代替宏指令。

ARM处理器模式
ARM微处理器支持7种工作模式:用户模式、系统模式、快速中断模式、外部中断模式、管理模式、中止模式、未定义指令模式。
除用户模式之外的其余6种称为非用户模式,或特权模式。
在特权模式中,除系统模式之外的其余5种称为异常模式。
处理器的各种工作模式由当前程序状态寄存器CPSR的低5位M[4:0]决定。
工作模式切换:
(1)发生异常,处理器自动改变CPSR中M[4:0]的值,进入相应的工作模式;
(2)处理器处于特权模式时,用指令向CPSR的M[4:0]字段写入特定的值,进入相应的工作模式。
用户模式时,不能改变工作模式,除非发生异常。

ARM处理器7种工作模式

特权模式

异常模式

 用户和系统模式

处理器的工作状态
从编程的角度讲,ARM处理器工作在两种状态:ARM状态或Thumb状态。
(1)ARM状态:处理器执行32位的ARM指令集时,工作在这种状态。
(2)Thumb状态:处理器执行16位的thumb指令集时,工作在这种状态。
状态切换:通过跳转指令实现。

ARM的寄存器组织
37个寄存器:31个通用寄存器,包括程序计数器PC;
6个状态寄存器。
寄存器均为32位,分成7组,各工作模式拥有自己的寄存器组,只能访问自己的寄存器组。
有些寄存器是重叠的,有些是工作模式特有的。
在不同的工作模式和处理器状态下,程序员可以访问的寄存器不尽相同。

ARM状态各模式下的寄存器

ARM寄存器分类

ARM状态各模式下可以访问的寄存器

一般的通用寄存器

R0~R7通用寄存器

R8~R14通用寄存器

R8~R12的两个分组

R13、R14的6个分组

堆栈指针寄存器R13(SP)

链接寄存器R14(LR)

 R14(LR)的作用
作用:保存返回地址
例如:
1.程序A执行过程中调用程序B;
2.程序跳转至标号Lable,执行程序B。同时硬件将“BL Lable”指令的下一条指令所在地址存入R14(LR);
3.程序B执行最后,将R14寄存器的内容放入PC,返回程序A;

程序计数器R15(PC)


程序状态寄存器CPSR

Thumb寄存器在ARM寄存器上的映射


状态寄存器
CPSR:当前程序状态寄存器,可以在任何工作模式下被访问。
SPSR:程序状态保存寄存器,只有在异常模式下,才能被访问;各异常模式拥有自己的SPSR。发生异常时,SPSR保存CPSR的值,格式同CPSR。
状态标志:5个,N符号位,Z零标志,C进位,V溢出位,Q DSP运算溢出位。
控制标志:4个,I中断允许,F快速中断允许,T状态选择,M[4:0] 处理器工作模式

条件标志位

 控制位


异常中断
异常中断:处理器由于外部或内部的原因,停止执行当前任务,转而处理特定的事件,处理完后返回原程序,继续执行。
当异常发生时,处理器首先自动保存当前状态,即返回地址存入寄存器R14,当前寄存器CPSR存入SPSR中,接着进入相应的工作模式,并执行特定地址的指令。
ARM共有7种类型的异常,不同类型的异常将导致处理器进入不同的工作模式,并执行不同特定地址的指令。

7种类型异常中断
复位:复位异常时,处理器立即停止当前程序,进入禁止中断的管理模式,并从地址0x00000000处开始执行。
未定义指令:当前指令未定义时,便产生未定义指令中断。
软件中断:用户模式下使用指令SWI时,处理器便产生软件中断,进入管理模式,以调用特权操作。
指令预取中止:预取指令的地址不存在,或不允许当前指令访问时,存储器会向处理器发出中止信号;预取指令被执行时才会产生该类异常。
数据访问中止:数据访问指令的地址不存在,或不允许当前指令访问时,产生数据中止异常。
外部中断请求:外部中断请求引脚有效,且CPSR中的I位为0时,产生IRQ异常。
快速中断请求:快速中断请求引脚有效,且CPSR中的F位为0时,产生FIQ异常。

异常向量

异常中断的优先级

复位
当nRESET信号由低变为高电平时,ARM处理器执行下列操作:
1. 强制CPSR中的M[4:0]变为b10011(管理模式);
2. 置位CPSR中的I和F位;
3. 清零CPSR中的T位;
4. 强制PC从地址0x00开始对下一条指令进行取指;
5. 返回到ARM状态并恢复执行 。

bootloader源代码外部中断处理实例
从0x00000000开始设置以下指令。
发生外部中断请求,处理器自动保存当前状态(PC→R14,CPSR→SPSR),进入外部中断模式,执行地址0x00000018处的指令。

在IRQ_SVC_HANDLER中,处理器将通用寄存器和返回地址压入堆栈,接着跳转到外部中断请求的中断服务程序中。
IRQ_SVC_Vector为外部中断请求的中断向量。
IRQ_SVC_HANDLER处的代码为:

外部中断包括的26种普通中断的向量空间分配




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章