ARM体系结构与编程

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体系结构与编程

时间: 2024-10-03 13:23:14

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

ARM体系结构与编程-5

GET通常用于包含定义常量的源文件. 例如:GET 2440addr.inc 用AREA定义一个段,ENTRY用于指定程序的入口点,END用于告诉汇编器源文件已经结束. 例如: AREA init, CODE, READONLY ENTRY ...... END EQU用于定义常量,提醒:在每条ARM指令前必须有空格,但是用EQU定义常量时,必须顶格写,否则编译器报错. LTORG用于声明一个文字池,所谓文字池就是一个数据缓存区. ALIGN伪操作通过调整地址指针,使得当前地址满足一定的对齐方式

【嵌入式Linux+ARM】ARM体系结构与编程(ARM概述)

ARM体系结构与编程 本文章记录一些看<ARM体系结构与编程>这一本书的记录: 个人觉得,学习ARM体系时,不需要死记硬背,只要把某些关键的大致记住,比如ARM寄存器(通用寄存器.PC.LR.SP.CPSR.SPSR).ARM中断处理体系.常用的ARM汇编指令等. 本文基本都是从书上截图,都是一些关键的知识,需要我们时常去复习的. 一.ARM概述 ARM处理器的7种工作模式: ARM处理器寄存器: ARM中PC(R15)寄存器: ARM中CPSR寄存器: ARM异常处理模式--响应过程和返回过

ARM体系结构与编程-4

ARM异常中断处理: ARM体系异常中断种类:按中断的处理优先级从高到低依次为:复位.数据访问中止.快速中断请求.外部中断请求.预取指中止.未定义指令.软件中断. ARM体系中的异常中断向量表: 0x0 复位 0x4 未定义指令 0x8 软件中断(SWI) 0x0c 预取指中止 0x10 数据访问中止 0x14 保留 0x18 外部中断请求(IRQ) 0x1c 快速中断请求(FIQ) 各异常中断对应着一定的处理器模式,不同处理器模式下有各自的物理寄存器.如果异常中断处理程序中使用它自己的物理寄存

ARM体系结构与编程-第五章

第5章 ARM存储系统 5.1 ARM存储系统概述 存储系统: 包含多种类型的存储器件,如FLASH.ROM.SRAM和SDRAM 通过使用CACHE及WRITE BUFFER技术缩小处理器和存储系统得速度差别 内存管理不见使用内存映射技术实现虚拟空间到物理空间的映射. 引入存储保护机制 引入一些机制保证将I/O操作映射成内存操作后,各种I/O操作能够得到正确的结果 5.2 ARM中用于存储管理的系统控制协处理器CP15 在基于ARM的嵌入式应用系统中,存储系统通常是通过系统控制协处理器CP15

【嵌入式Linux+ARM】ARM体系结构与编程(ARM汇编指令)

自己的一些简单的总结,也是最常用的ARM汇编指令,之后也会不断的补充完善. 1. 汇编系统预定义的段名 .text    @代码段 .data   @初始化数据段 .bss    @未初始化数据段 需要注意的是,源程序中.bss段应该在.text之前. 2.定义入口点 汇编程序的缺省入口是 start标号,用户也可以在连接脚本文件中用ENTRY标志指明其它入口点. .text .global _start _start: 3 .word用法 word expression就是在当前位置放一个wo

ARM体系结构与编程-3

passport.baidu.com/?business&un=%E5%92%B8%E9%98%B3%5F%E6%A8%A1%E7%89%B9%5F%E6%89%BE#0 passport.baidu.com/?business&un=%E8%A5%BF%E5%AE%89%5F%E6%A8%A1%E7%89%B9%5F%E6%89%BE#0 passport.baidu.com/?business&un=%E5%92%B8%E9%98%B3%5F%E5%AD%A6%E5%A6%B9

ARM体系结构和汇编指令

第一节 可编程器件的编程原理 1. 可编程器件的特点 1 . CPU在固定频率的时钟控制下节奏运行 2 . CPU可以通过总线读取外部存储设备中的二进制指令集,然后解码执行 3 . 这些可以被CPU解码执行的二进制指令集是CPU设计的时候确定的,是CPU的设计者(ARM公司)定义的,本质上是一串由1和0组成的数字.这就是CPU的汇编指令集 2. 从源代码到cpu执行过程 第二节 指令集对cpu的意义 1. 汇编语言与C等高级语言的差异 汇编无移植性,c语言有一定可移植性,jave等更高级的语言移

ARM体系结构调试系统

预计会有几篇较大篇幅的文章大体描述下ARM体系结构调试系统方面的软硬件接口设计. 简述 经历过软件开发基本上都知道调试的重要性,能一次写好,并且没有BUG的软件毕竟少之又少. ARM体系结构从ARMv4开始硬件支持各种调试特性,随着系统的复杂度提升,到现今的ARMv7,甚至ARMv8,ARM从硬件层面也提供了更多的调试方式. 本文从大方向上概述ARM调试系统的组成,包括其中的debug,trace,profiling等方面 ,又着重在调试系统的软硬件接口配合. 调试分类 从大方向上看,我们基本可

嵌入式Linux ARM汇编(七)——C语言与ARM汇编混合编程

嵌入式Linux ARM汇编(七)--C语言与ARM汇编混合编程 在嵌入式系统开发中,目前使用的主要编程语言是C和汇编.在大规模的嵌入式软件中,例如含有OS,大部分的代码都是用C编写的,主要是因为C语言的结构比较好,便于人的理解,而且有大量的支持库.但是很多地方还是要用到汇编语言,例如开机时硬件系统的初始化,包括CPU状态的设定,中断的使能,主频的设定,以及RAM的控制参数及初始化,一些中断处理方面也可能涉及汇编.另外一个使用汇编的地方就是一些对性能非常敏感的代码块,这是不能依靠C编译器的生成代