ARM处理器的7中执行模式:usr、fiq、irq、svc、abt、und、sys。





ARM处理器共37个寄存器:31个通用寄存器(未备份寄存器R0-R7,在全部模式下指的都是同一个物理寄存器;备份寄存器R8-R12,每一个寄存器相应两个不同的物理寄存器。对于R13[sp]和R14[lr]来说,每一个寄存器相应6个不同的寄存器;程序计数器R15[pc]),6个状态寄存器(当前程序状态寄存器[cpsr];5个备份状态寄存器[spsr])。





ARM体系的异常中断:复位、没有定义指令、软件中断、指令预取中止、数据訪问中止、外部中断请求、高速中断请求。

ARM处理器响应异常中断的过程:

1.保存CPSR到将要运行的异常中断相应的SPSR。

2.设置CPSR,使处理器进入对应的模式。

3.将寄存器R14[lr_mode]设置成返回地址

4.将寄存器R15[PC]设置成该异常中断的中断向量地址。

从异常中断处理程序中返回的过程:

1.恢复SPSR_mode到CPSR。

2.复制R14[lr_mode]到R15[PC]。





ARM体系的存储系统:单一的平板地址空间,空间大小为2^32个8位,即2^32B,空间地址为0 到 2^32-1。存储格式分big-endian和little-endian。





ARM指令:ARM指令字长为固定的32位。一般编码格式例如以下:

|cond|001|opcode|S|Rn|Rd|shifter_operand|

cond:指令运行的条件编码

opcode:指令操作符的编码

S:决定指令的操作是否影响CPSR的值

Rn:目标寄存器编码

Rd:包括第一个操作数的寄存器编码

shifter_operand:第二个操作数的编码

ARM指令的寻址方式:数据处理指令的操作数的寻址方式、字及无符号字节的Load/Store指令的寻址方式[Load指令从内存中读取数据到寄存器中,Store指令将寄存器中的数据保存到内存]、杂类Load/Store指令的寻址方式、批量Load/Store指令的寻址方式[实如今一组寄存器和一块连续的内存单元之间数据传输]、协处理器Load/Store指令的寻址方式[实如今ARM处理器和协处理器之间传输批量数据]。





ARM指令集:

1.跳转指令:B、BL、BLX、BX。

<1>.B及BL:用于实现子程序调用,可跳转的地址范围大致为-32MB 至 32MB。B指令仅跳转,BL指令同一时候还将PC寄存器的值保存到LR寄存器,子程序的返回能够通过将LR寄存器的值拷贝到PC寄存器中来实现。

<2>.BLX:语法1:BLX target_address。

操作的伪代码:LR = address of the instruction after the BLX instruction

    T Flag = 1 (即表示切换到Thumb指令集)

    PC = PC + 跳转地址

语法2:BLX{<cond>} <Rm>。

操作的伪代码:if cond  then

            LR = address of the instruction after the BLX instruction

        T Flag = Rm[0] (是否切换指令集取决于寄存器Rm中的目标地址的bit[0])

        PC = Rm AND 0xfffffffe

<3>BX:语法:BX{<cond>} <Rm>。

操作的伪代码:if cond  then

        T Flag = Rm[0] (是否切换指令集取决于寄存器Rm中的目标地址的bit[0])

        PC = Rm AND 0xfffffffe

2.数据处理指令:数据传送MOV、比較CMP、位測试TST、相等測试TEQ、加法ADD、减法SUB、位清除BIC、异或EOR、或ORR等。

3.乘法指令:32位乘法MUL等。

4.状态寄存器訪问指令:通常改动状态寄存器是通过“读取-改动-写回”的操作来实现的。

<1>MRS:状态寄存器 到 通用寄存器 的传送指令。语法:MRS{<cond>} <Rd>, CPSR 

<2>MSR:通用寄存器 到 状态寄存器 的传送指令。语法:MSR{<cond>} CPSR,<Rm> 或 MSR{<cond>} CPSR,#马上数

比如将处理器的模式切换到特权模式:

MRS R0, CPSR
;读取CPSR

BIC R0, R0, #0x1F
;改动,去除当前处理器模式

ORR R0, R0, #0x13
;改动,设置特权模式

MSR CPSR_c, R0
;写回,只改动CPSR中的控制位域

5.Load/Store内存訪问指令:字数据读取指令LDR(从内存将一个32位的字读取到目标寄存器),字数据写入STR(将一个32位的字写入到指定的内存单元)等。

6.批量Load/Store内存訪问指令:批量内存字数据读取指令LDM,批量内存字数据写入指令STM。

7.信号量操作指令:信号量用于进程间的同步和相互排斥,对信号量的操作要求是一个原子操作,不可被打断。ARM提供SWP(字交换指令)和SWPB(字节交换指令)来完毕信号量的操作。

语法为:SWP{<cond>} <Rd>, <Rm>, [Rn]

功能:将一个内存单元[Rn]的内容读取到一个寄存器<Rd>中,同一时候将还有一个寄存器<Rm>的内容写入到该内存单元[Rn]中。

8.异常中断产生指令:软中断指令SWI(ARM通过软中断实如今用户模式下对操作系统中特权模式的程序调用即系统调用)

语法为:SWI{<cond>} <immed_24>

功能:用于用户程序调用操作系统的系统服务,操作系统在SWI的中断服务程序中提供相关的系统服务,并定义了參数传递的方法,通常參数传递方法例如以下两种<1>指令中的24为马上数用于指定用户请求的服务类型,參数通过通用寄存器传递。<2>指令中的24位马上数被忽略,用户请求的服务类型由寄存器R0的数值来决定,參数通过其它的通用寄存器来传递。

9.ARM协处理器指令:ARM支持16个协处理器。ARM协处理器指令包含下面3类:<1>用于ARM处理器初始化ARM协处理器的数据处理操作<2>用于ARM处理器的寄存器和ARM协处理器的寄存器间的数据传送操作<3>用于在ARM协处理器的寄存器和内存单元之间传送数据。一共五条指令例如以下:

<1>CDP:协处理器数据操作指令

比如:CDP p5, 2, c12, c10, c3, 4
;协处理器p5的操作初始化。当中,操作码1为2,操作码2为4,目标寄存器为c12,源操作数寄存器为c10和c3。

<2>LDC:协处理器数据读取指令

比如:LDC p6, CR4, [R2, #4]
;R2为ARM寄存器,指令读取内存单元[R2, #4]的字数据,传送到协处理器p6的CR4寄存器中。

<3>STC:协处理器数据写入指令

比如:STC p8, CR8, [R2, #4]!
;R2为ARM寄存器,指令将协处理器p8的CR8寄存器中的字数据写入到内存单元[R2, #4]中,指令运行后R2=R2+4。

<4>MCR:ARM寄存器到ARM协处理器的数据传送指令

比如:MCR p14, 3, R7, c7, c11, 6
;指令从ARM寄存器中将数据传送到协处理器p14的寄存器中。当中R7为ARM寄存器,存放源操作数;c7和c11为协处理器寄存器,为目标寄存器;操作码1为3,;操作码2为6。

<5>MRC:ARM协处理器到ARM寄存器的数据传送指令

比如:MRC p15, 2, R5, c0, c2, 4
;指令将协处理器p15寄存器中的数据传送到ARM寄存器中。当中R5为ARM寄存器,是目标寄存器;c0和c2为协处理器寄存器,存放源操作数;操作码1为2,操作码2为4。

ARM体系结构与编程的更多相关文章

  1. ARM体系结构与编程-3

    ARM存储系统:ARM中用于存储管理的系统控制协处理器CP15:包括16个32位寄存器,其编号为0到15.实际上对于某些编号的寄存器可能相应有多个物理寄存器. 訪问CP15寄存器的指令:MRC.MCR ...

  2. ARM体系结构与编程-5

    GET通经常使用于包括定义常量的源文件. 比如:GET 2440addr.inc 用AREA定义一个段.ENTRY用于指定程序的入口点,END用于告诉汇编器源文件已经结束. 比如: AREA init ...

  3. ARM体系结构与编程读书笔记——处理器的寄存器

    ARM处理器共有37个寄存器,其中包括: 31个通用寄存器,包括程序计数器(PC)在内,寄存器都是32位: 6个状态寄存器,这些寄存器都是32位的,目前只使用了其中12位: 通用寄存器 可以分为下面3 ...

  4. ARM体系结构与编程读书笔记——处理器的运行模式

    ARM处理器共有7种运行模式,如下表: 处理器模式 描述 用户模式(User, usr) 正常程序执行的模式 快速中断模式(FIQ, fiq) 用于高速数据传输和通道处理 外部中断模式(IRQ, ir ...

  5. ARM的体系结构与编程系列博客——ARM体系版本

    ARM体系版本前言 很多人都知道,ARM有许多版本,口中最长说的就是ARM7\ARM9\ARM11,诚然,这个的确是ARM处理器的版本,但绝对不是ARM的版本,其实ARM到迄今为止经历了6代版本,随着 ...

  6. ARM的体系结构与编程系列博客——ARM处理器系列介绍

    ARM处理器系列介绍 现在到了3月,过年过得过于舒服了.系列博客也停更了近半月,我果然是个慢(lan)性(gui)子,那么趁着到校的第一天晚上,就写一篇博客来继续我的系列博客了!众所周知,ARM处理器 ...

  7. ARM体系结构和汇编指令

    第一节 可编程器件的编程原理 1. 可编程器件的特点 1 . CPU在固定频率的时钟控制下节奏运行 2 . CPU可以通过总线读取外部存储设备中的二进制指令集,然后解码执行 3 . 这些可以被CPU解 ...

  8. ARM体系结构简介

    ARM体系结构简介 新一代的ARM9处理器,能达到两倍ARM7的处理能力,它们的区别如下: ARM微处理器的工作状态(可切换): 第一种为ARM状态,此时处理器执行32位的字对齐的ARM指令 第二种为 ...

  9. ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(2)- 寄存器

    1. 前言 2. 指令运行与异常处理寄存器 ARM体系结构的寄存器分为两类: (1)系统控制和状态报告寄存器 (2)指令处理寄存器,如累加.异常处理 本部分将主要介绍如上第(2)部分的寄存器,分为AA ...

随机推荐

  1. CSS中的!important属性用法

    关于CSS的运用技巧有很多, 今天主要探讨一下CSS中 !important 这个属性的用法.在CSS的使用中,遇到最多的问题就是不同浏览器之间的兼容问题. 由于IE并不严格执行W3C标准, 而又几乎 ...

  2. poj 2777 Count Color(线段树区区+染色问题)

    题目链接:  poj 2777 Count Color 题目大意:  给出一块长度为n的板,区间范围[1,n],和m种染料 k次操作,C  a  b  c 把区间[a,b]涂为c色,P  a  b 查 ...

  3. cocos2dx3.2 异步载入和动态载入

    半个月没有更新博客,从这个项目開始学习了非常多细节的东西,都不太成系统.可是却是开发上线中必须经历的东西.比方超级玛丽系列(一)中的正确的异步载入,正确的分层.正确的合成和载入plist.及时的移除未 ...

  4. CWnd中PreCreateWindow、PreSubclassWindow、SubclassWindow的区别

    http://blog.csdn.net/swimmer2000/archive/2007/10/30/1856213.aspx MFC(VC6.0)的CWnd及其子类中,有如下三个函数:     / ...

  5. IdHttpServer实现webservice(130篇DataSnap文章)

    IdHttpServer实现webservice   朋友有个项目,通信协议使用HTTP,数据序列使用BIN(二进制).他不知道要选用何种技术方案. REST webservice是http+json ...

  6. uva 699

    #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #i ...

  7. Python 生成的页面中文乱码问题

    第一 保证 程序源文件里的中文的编码格式,如我们把 源文件的编码设置成utf8的. reload(sys) sys.setdefaultencoding('utf-8') 第二, 告诉浏览器,我们须要 ...

  8. OO alv report

    DATA: gr_alvgrid TYPE REF TO cl_gui_alv_grid ,"ALV对象 gt_fieldcat TYPE lvc_t_fcat , "ALV字段控 ...

  9. Makefile条件推断 ——————————【Badboy】

    使用条件推断,能够让make依据执行时的不同情况选择不同的执行分支. 条件表达式能够是比較变量的值,或是比較变量和常量的值. 一.演示样例 以下的样例,推断$(CC)变量是否"gcc&quo ...

  10. java反射机制 + Method.invoke解释 getMethod + 反射理解

    功能: 通过读取另一个Dll去创建一个控件(Form,Button,TextBox,DataGridView),然后对当中一些属性进行检查. 创建控件的大致流程是,Assembly->Modul ...