ARM体系结构综述
- 格式:doc
- 大小:555.00 KB
- 文档页数:22
ARM嵌入式系统第2章ARM体系结构ARM微处理器的编程模型♦ARM徴处理器的工作状态♦ARM体系结构的存储器格式♦ARM体系结构的指令长度及数据宽度♦ARM微处理器的处理器模式♦ARM体系结构的寄存器组织♦ARM微处理器的异常状态字、半字、字节字(Word)在ARM体系结构中,字的长度为32位半字(Half-Word)在ARM体系结构中,半字的长度为16位字节(Byg)在ARM体系结构中,字节的长度为8位。
ARM微处理器的工作状态(1)字对齐:四字节对齐半字对齐:两字节对齐两种状态:♦ARM状态:处理器执行32位的字对齐的令♦Thumb状态:处理器执行16位的、半字对齐的Thumb指令处理器工作状态的转变并不影响处理器的工作模式和相应寄存器中的内容。
I ARM微处理器的工作状态(2 )状态切换:BX {<cond>} <Rm><cond>指令的条件码。
忽略时无条件执行。
<Rm>子存器中为跳转的目标地址,当<Rm><存器的bit[O]为0时, 目标地址处的指令为ARM指令;当<Rm>^存器的bit[O]为1时,目标地址处的指令为Thumb 指令。
伪代码:if ConditionPassed(cond) thenT Flag=Rm[O]PC=Rm AND OxFFFFFFFEARM微处理器在复位或上电时处于ARM状态,发生异常时处于ARM状态。
右ARM体系结构的存储器格式(1)ARM体系结构所支持的最大寻址空间为4GB (2^字节)♦大端格式(Big Endian)字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。
♦小端格式(Little Endian)低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。
字地址字地址右ARM 体系结构的存储器格式(2)(0H)=0123H (4H)=4567H (8H)=89ABHBig Endian(0H)=3210H (4H)=7654H (8H)=BA98HLittle Endian右ARM 体系结构的存储器格式(3)8 9 AB4 5 6 7 0123一 “A ・■ • rO= 0x11223344 I 11 I 22 33 : 44 ILittle endian Big endianR2 =异FI*右 ARM 体系结构的指令长度及数据宽度♦指令长度:32位(在ARM 状态下) 16位(在Thumb 状态下)♦数据宽度: 字节(8位) 半字(16位) 字(32位)三种数据宽度对存储器及外部设备的访问。
ARM体系结构与编程
一、ARM体系结构
ARM(Advanced RISC Machine)是由英国ARM公司开发的一种低功耗、超低成本的处理器架构,是移动设备的首选处理器。
ARM架构的处理器有ARM7、ARM9、ARM11、 Cortex-A8 、Cortex-A15等,它们核心架构特点为以下几点:
1.保护模式。
ARM架构的处理器能够在用户模式和两个高级的保护模式之间来回切换。
2.对齐式存储。
ARM架构的处理器采用对齐方式,其二进制指令必须按照固定的位置排列,以便提高存储空间的利用率。
3.浮点处理单元。
ARM架构的处理器具有浮点数处理功能,使数值运算能够高效率地完成。
4.多级缓存。
ARM架构的处理器将原始数据复制到不同级别的快速缓存中,以便快速访问。
二、ARM程序的编程
1、ARM程序的编写
ARM程序的编写可以使用C语言编写,程序开发者需要掌握ARM架构各种中央处理器扩展指令集的使用方法,以便获得更好的效率。
2、编译ARM程序
ARM程序的编译是使用GNU的gcc编译器进行的,它可以将C语言编写的程序编译成ARM架构的机器码,并可以在ARM架构的处理器上运行。
3、调试ARM程序
ARM程序的调试使用GDB程序调试,它可以提供丰富的调试工具,可以跟踪程序执行的步骤,提供全面的程序反馈信息,可以帮助开发者快速定位程序运行出错的地方。
三、总结。
第一编ARM编程模式1. Thumb指令集是ARM指令集的重编码的子集,相较于ARM指令集,Thumb指令集有两个不足:1)Thumb的代码执行相同的任务需要相较ARM代码更多的指令数,故不适合一些要求最大化执行时间效率的程序;2)Thumb中不包含一些异常处理需要使用的代码,故不适用编写一些高层次的异常处理代码2. ARM是一个RISC(精简指令集计算机),包含以下一些特性:1) 一个大型统一的寄存器表2) load/store结构,即所有数据操作都仅基于寄存器,而非直接基于内存;3) 简单寻址模式,即所有load/store寻址仅依靠寄存器内容和指令域决定;4) 统一和定长的指令格式,简化了指令的解码。
3. ARM有七种处理器模式,分别为:User(用户模式,即正常指令执行模式),FIQ(快速中断模式),IRQ(通用中断处理模式),Supervisor(超级用户模式,即操作系统保护模式),Abort(中止模式,实现内存或虚拟内存的保护),Undefined(未定义模式),System(系统模式,执行特权的系统进程)。
模式之间的切换可以通过软件控制或外部的中断或异常引起。
4. 正常的应用程序均在User(用户模式)下运行,此时无法获取一些受限的系统资源,也不可以任意切换处理器模式,除非有异常发生。
5. 除了User外的其他六个均为特权模式,他们可以获取各类系统资源,并能实现相互切换。
其中除System外的五个为异常模式。
6. ARM总计拥有37个寄存器,其中31个通用的32-bit寄存器,还有6个32-bit状态寄存器。
而在任意时刻,仅有其中的16个通用寄存器是可见的。
7. ARM体系结构中可见的寄存器为R0-R15,可分成三类:未堆积(unbanked)寄存器R0-R7,堆积(banked)寄存器R8-R14和程序计数器R15。
8. R0-R7为所有模式共享,所有模式共用这8个寄存器。
9. R8-R14为堆积寄存器,其又分成两类。
一类是R8-R12,分为两组,一组是FIQ模式专用,另一组是其他六种模式共用。
另一类是R13和R14,分为六组,分别是User和System共用一组,其他五种异常处理器模式各保有一组R13和R14。
R13和R14一般都用来做特殊的用途,其中R13为堆栈指针(SP);R14为链接寄存器,有两种特殊的功能,一种是发生子程序调用时保存子程序返回地址,另一种是异常发生时保存异常返回地址。
10. PC(R15)保存的是程序计数器,为当前指令的地址+8字节。
同时,由于ARM指令是字对齐的,所以PC的最低两个位bit[0:1]一般为0。
一个例外是当STR或者STM指令保存R15时,则保存的即可能是当前指令地址+8字节,也可能是当前指令地址+12字节,至于是保存8字节的offset还是12字节的offset,则是由实现来确定的。
基于这个原因,应该要尽量避免使用STR或STM指令保存R15。
11. 程序状态寄存器分成CPSR(当前程序状态寄存器)和SPSR(备份程序状态寄存器)。
CPSR所有模式共用,而SPSR则是五个异常模式各有一个。
12. 程序状态寄存器中有两类信息,一类是程序控制码标志,一类是程序控制位。
除此两类使用的位外其他为保留位。
13. 程序状态寄存器中的程序控制码标志主要包含有N标志(负数标志)、Z标志(零标志)、C标志(进位标志)、V标志(溢出标志)和Q标志(DSP指令溢出或饱和标志)。
其中C 标志(进位标志)有四种情况:第一种是加法类指令,若产生进位则C标志置1;第二种是减法类指令,若有借位则置0,否则为1;第三种是移位指令,则C标志为被最后移出的位;最后一种是其他指令,C标志不产生变化。
V标志也分成两种情况:一种是加法或减法类指令,如果发生有符号溢出,则V标志置1;另一种是其他指令,V标志不变。
14. 程序状态寄存器中的程序控制位在CPSR或SPSR的最低八位,包含有I标志(IRQ中断使能)、F标志(FIQ中断使能)、T标志(ARM或Thumb指令选择位,T=1时是Thumb 指令模式)和M[4:0]模式位。
15. 异常是由导致处理器去处理某个事务的内部或外部的源产生的。
在异常处理前的处理器状态应该被保存,这样当异常处理完毕后,系统可以回来原来的处理器状态。
在同一时刻,可以有不止一个的异常产生。
16. ARM共支持七种类型的异常。
当异常发生时,系统会条转到对应某类异常的固定存储地址来进行执行。
这些固定的地址被称作异常向量。
一般它们占据了0x00000000-0x0000001C 的地址空间(高向量模式为0xFFFF0000-0xFFFF001C),其中地址0x00000014(高向量模式为0xFFFF0014)被保留做未来扩充使用。
17. ARM支持的异常是有优先级的,其中SWI(软件中断)和未定义指令不会同时发生,故此两种异常有相同的优先级。
中断优先级保证了在多个异常同时发生的情况下,系统将先进入高优先级异常的执行。
18. ARM支持两种不同的异常向量模式,即正常向量模式和高向量模式。
正常向量模式的地址空间是0x00000000-0x0000001C,而高向量模式的地址空间为0xFFFF0000-0xFFFF001C。
高向量模式需要硬件的支持,而ARM的CP15的Register 1的bit[13]提供了对正常向量模式和高向量模式的配置。
19. ARM支持的内存模式有大端和小端两种。
小端是指对齐位置的字节是对应的字节中的最小有效字节。
而大端是指对齐位置的字节是对应的字节中的最大有效字节。
大小端的设置可通过配置CP15的Register 1的bit[7]来实现。
20. ARM架构中要求指令和数据对齐,即ARM指令的地址最低两位bit[1:0]均为0(Thumb 指令bit[1]为0),而取32位数据时最低两位也应对齐。
如果出现非对齐,则可能的情况有非对齐指令预取和非对齐数据获取。
非对齐指令预取即R15中的地址是一个非对齐的地址,如果出现此情况,可能导致两种结果,一个是出现不可预测的情况,另一个则是忽略最低位的地址取指令。
而load/store类的指令读取了一个非对齐的内存地址,可能出现三种结果:第一是不可预测的情况;第二是忽略最低位实现读取;第三是对忽略最低位,取出数据,并将最低位作为控制位,实现对读取出的数据的旋转操作(仅限于LDR和SWP指令)。
21. ARM架构中PC(R15)保存的是当前指令地址+8(Thumb模式下为当前指令地址+4),原因是ARM内核会预取两条指令,因此PC会指向当前指令的后两条指令。
同时ARM架构支持跳转预测,即当发现跳转指令时,下面预取的指令既可能是跳转指令后接的指令,也可能是跳转目标地址的指令。
22. 理论上,存在这样的情况,即当ARM内核预取了指令后,存储中的对应指令却被修改了。
对于这种情况,ARM忽视这种变化,仍然执行已经预取的指令。
如果第二次再运行到此位置,则将执行修改的后的指令。
23. ARM体系结构中标准的实现I/O功能的方式是使用存储映射I/O(memory-mapped I/O)。
这种方式提供了特殊的一些存储地址,当对这些存储地址实施load或store操作,即实现了对应的I/O功能。
第二编ARM指令集1. 一条ARM指令的最高四位bit[31:28]为条件域(condition field),根据其值的不同来确定当前指令对CPSR中的N、Z、C和V标志的设置与否。
2. ARM指令集支持一个向前或向后32M范围内跳转的Branch指令。
如果是Branch and Link 指令,则除了支持向前或向后的32M范围跳转外,还能将跳转指令的下一条指令地址(返回地址)压入R14(LR)。
而在ARMv4以上支持T的版本中,还有Branch and Exchange指令,此指令可以拷贝通用寄存器Rm的值到PC中,而若其bit[0]为0,则进行ARM至Thumb 的切换。
3. ARM指令集中包含了状态寄存器获取指令MSR和MRS用来对CPSR和SPSR进行操作。
同时ARM指令集还提供了对协处理器的操作指令MCR和MRC。
4. SWI提供了软件中断的功能,此指令的bit[23:0]为一个立即数,ARM处理器会忽略这个立即数,但这个立即数可以提供异常处理程序使用。
第三编ARM寻址模式ARM总共支持五大类的寻址模式,分别是:数据处理操作模式(Data-Processing Operands)、加载和保存字或无符号字节模式(Load and Store Word or Unsigned Byte)、混合的加载和保存模式(Miscellaneous Loads and Stores)、多重的加载和保存模式(Load and Store Multiple)以及协处理器的加载和保护模式(Load and Store Coprocessor)。
第一节数据处理操作模式1. 数据处理操作模式的寻址从指令角度可以分为三类:1)立即数寻址,指令格式如下2)立即数位移寻址:3)寄存器位移寻址:2. 通用的数据处理操作模式的语法是:<opcode> {<cond>} {S} <Rd>, <Rn>, <shifter_operand>其中<shifter_operand>有11种可选属性,分别为1)#<immediate>属于立即数寻址类2)<Rm>属于立即数位移寻址类,是其的一种特殊形式,即直接根据<Rm>的值进行寻址,指令中的shift和shift_imm对应位均为03)<Rm>, LSL #<shift_imm>属于立即数位移寻址类,是根据<shift_imm>对<Rm>中的值进行逻辑(不带进位)左移位4)<Rm>, LSL <Rs>属于寄存器位移寻址类,用<Rs>的值乘以<Rm>的值来达到对<Rm>的值进行逻辑左位移的效果5)<Rm>, LSR #<shift_imm>属于立即数位移寻址类,是根据<shift_imm>对<Rm>中的值进行逻辑右移位6)<Rm>, LSR <Rs>属于寄存器位移寻址类,用<Rs>的值除以<Rm>的值来达到对<Rm>的值进行逻辑右位移的效果7)<Rm>, ASR #<shift_imm>属于立即数位移寻址类,是根据<shift_imm>对<Rm>中的值进行算术(带进位)右移位8)<Rm>, ASR <Rs>属于寄存器位移寻址类,用<Rs>的值对<Rm>的值进行算术右移位9)<Rm>, ROR #<shift_imm>属于立即数位移寻址类,根据<shift_imm>对<Rm>中的值进行右旋转10)<Rm>, ROR <Rs>属于寄存器位移寻址类,用<Rs>的值对<Rm>的值进行右旋转11)<Rm>, RRX属于寄存器位移寻址类,是其的一种特殊形式,根据CPSR中的Carry Flag的值来对<Rm>的值进行右旋转第二节加载和保存字或无符号字节模式1. 加载和保存字或无符号字节模式从指令角度可以分为三类:1)立即数偏移/索引2)寄存器偏移/索引3)按比例的寄存器偏移/索引2. 通用的加载和保存字或无符号字节模式的语法是:LDR|STR{<cond>} {B} {T} <Rd>, <addressing_mode>其中<addressing_mode>有九种可选属性,分别为:1)[<Rn>, #+/-<offser_12>]属于立即数偏移/索引类,寻址模式通过计算对基寄存器Rn加上或减去一个12位立即数偏移来计算寻址地址2)[<Rn>, +/-<Rm>]属于寄存器偏移/索引类,寻址模式通过计算对基寄存器Rn加上或减去索引寄存器Rm的值来计算寻址地址3)[<Rn>, +/-<Rm>, <shift> #<shift_imm>]属于按比例的寄存器偏移/索引类,寻址模式通过计算对基寄存器Rn加上或减去对索引寄存器Rm值的偏移或旋转的结果来计算寻址地址4)[<Rn>, #+/-<offset_12>]!属于立即数偏移/索引类,寻址模式通过计算对基寄存器Rn加上或减去一个12位立即数偏移来计算寻址地址,同时如果条件域中的值与CPSR中的对应位匹配,则新产生的地址会被写回Rn中5)[<Rn>, +/-<Rm>]!属于寄存器偏移/索引类,寻址模式通过计算对基寄存器Rn加上或减去索引寄存器Rm的值来计算寻址地址,同时如果条件域中的值与CPSR中的对应位匹配,则新产生的地址会被写回Rn中6)[<Rn>, +/-<Rm>, <shift> #<shift_imm>]!属于按比例的寄存器偏移/索引类,寻址模式通过计算对基寄存器Rn加上或减去对索引寄存器Rm值的偏移或旋转的结果来计算寻址地址,同时如果条件域中的值与CPSR中的对应位匹配,则新产生的地址会被写回Rn中7)[<Rn>], #+/-<offset_12>属于立即数偏移/索引类,寻址模式使用Rn的值作为当前存储获取的地址,同时如果条件域中的值与CPSR中的对应位匹配,则将基寄存器Rn加上或减去一个12位立即数偏移写回Rn中8)[<Rn>], +/-<Rm>属于寄存器偏移/索引类,寻址模式使用Rn的值作为当前存储获取的地址,同时如果条件域中的值与CPSR中的对应位匹配,则将基寄存器Rn加上或减去索引寄存器Rm的值的结果写回Rn中9)[<Rn>], +/-<Rm>, <shift> #<shift_imm>属于按比例的寄存器偏移/索引类,寻址模式使用Rn的值作为当前存储获取的地址,同时如果条件域中的值与CPSR中的对应位匹配,则将基寄存器Rn加上或减去对索引寄存器Rm 值的偏移或旋转的结果写回Rn中第三节混合的加载和保存模式1. 混合的加载和保存模式从指令角度可以分为两类:1)立即数偏移/索引2)寄存器偏移/索引2. 通用的混合的加载和保存模式的语法是:LDR | STR{<cond>}H|SH|SB|D <Rd>, <addressing_mode>其中<addressing_mode>有六种可选属性,分别为:1)[<Rn>, #+/-<offset_8>]属于立即数偏移/索引类,寻址模式通过计算对基寄存器Rn加上或减去一个8位立即数偏移来计算寻址地址2)[<Rn>, +/-<Rm>]属于寄存器偏移/索引类,寻址模式通过计算对基寄存器Rn加上或减去索引寄存器Rm的值来计算寻址地址3)[<Rn>, #+/-<offset_8>]!属于立即数偏移/索引类,寻址模式通过计算对基寄存器Rn加上或减去一个8位立即数偏移来计算寻址地址,同时如果条件域中的值与CPSR中的对应位匹配,则新产生的地址会被写回Rn中4)[<Rn>, +/-<Rm>]!属于寄存器偏移/索引类,寻址模式通过计算对基寄存器Rn加上或减去索引寄存器Rm的值来计算寻址地址,同时如果条件域中的值与CPSR中的对应位匹配,则新产生的地址会被写回Rn中5)[<Rn>], #+/-<offset_8>属于立即数偏移/索引类,寻址模式使用Rn的值作为当前存储获取的地址,同时如果条件域中的值与CPSR中的对应位匹配,则将基寄存器Rn加上或减去一个8位立即数偏移写回Rn 中6)[<Rn>], +/-<Rm>属于寄存器偏移/索引类,寻址模式使用Rn的值作为当前存储获取的地址,同时如果条件域中的值与CPSR中的对应位匹配,则将基寄存器Rn加上或减去索引寄存器Rm的值的结果写回Rn中第四节多重的加载和保存模式1. 多重的加载和保存模式的指令格式是:此类寻址模式会产生一个地址范围,分别为<start_address>和<end_address>。