ARM体系结构课件_第1页
ARM体系结构课件_第2页
ARM体系结构课件_第3页
ARM体系结构课件_第4页
ARM体系结构课件_第5页
已阅读5页,还剩103页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ARM体系结构

2.1ARM体系结构简介

ARM(AdvancedRISCMachines)公司1991年成立于英国剑桥,是专门从事基于RISC技术芯片设计开发的公司,主要出售芯片设计技术的授权,作为知识产权供应商,本身不直接从事芯片生产,靠转让设计许可由合作公司生产各具特色的芯片,半导体生产商从ARM公司购买其设计的ARM微处理器核,根据各自不同的应用领域,加入适当的外围电路,从而形成自己的ARM微处理器芯片进入市场。据最新统计,全球有103家巨型IT公司在采用ARM技术,20家最大的半导体厂商中有19家是ARM的用户,包括德州仪器,意法半导体,Philips,Intel等。ARM系列芯片已经被广泛的应用于移动电话、手持式计算机以及各种各样的嵌入式应用领域,成为世界上销量最大的32位微处理器。

ARM授权费IPARM创造和设计IPPartner产品,例如:芯片Partner把ARMIP和其他IP集成进产品OEMCustomer版权费单价OEM用来自ARMPartner的芯片设计制造最终用户产品业务拓展/市场格局

采用RISC架构的ARM微处理器一般具有如下特点:●支持Thumb(16位)/ARM(32位)双指令集,能很好的兼容8位/16位器件。Thumb指令集比通常的8位和16位CISC/RISC处理器具有更好的代码密度;●指令执行采用3级流水线/5级流水线技术;●带有指令Cache和数据Cache,大量使用寄存器,指令执行速度更快。大多数数据操作都在寄存器中完成。寻址方式灵活简单,执行效率高。指令长度固定(在ARM状态下是32位,在Thumb状态下是16位);●支持大端格式和小端格式两种方法存储字数据;●支持Byte(字节,8位)、Halfword(半字,16位)和Word(字,32位)三种数据类型。●支持用户、快中断、中断、管理、中止、系统和未定义等7种处理器模式,除了用户模式外,其余的均为特权模式;●处理器芯片上都嵌入了在线仿真ICE-RT逻辑,便于通过JTAG来仿真调试ARM体系结构芯片,可以避免使用昂贵的在线仿真器。另外,在处理器核中还可以嵌入跟踪宏单元ETM,用于监控内部总线,实时跟踪指令和数据的执行;具有片上总线AMBA(AdvancedMicro-controllerBusArchitecture)。AMBA定义了3组总线:先进高性能总线AHB(AdvancedHighperformanceBus);先进系统总线ASB(AdvancedSystemBus);先进外围总线APB(AdvancedPeripheralBus)。通过AMBA可以方便地扩充各种处理器及I/O,可以把DSP、其他处理器和I/O(如UART、定时器和接口等)都集成在一块芯片中;

ARM微处理器包括ARM7、ARM9、ARM9E、ARM10E、SecurCore、Cortex系列以及Intel的StrongARM、XScale和其它厂商基于ARM体系结构的处理器,除了具有ARM体系结构的共同特点以外,每一个系列的ARM微处理器都有各自的特点和应用领域。

2.2ARM微处理器结构

经过近20年的发展,ARM体系结构发展日趋成熟,功能越来越强,应用领域越来越广泛;从最初到现在,已经有七个主要的版本:ARMv1,ARMv2,ARMv3,ARMv4,ARMv5,ARMv6,ARMv7;

ARMv1系列的CPU主要还是作为研究之用,后面几种都得到了较为广泛的应用;特别是ARMv4系列的CPU目前仍然是ARM芯片的主要开发版本;

ARM公司开发了很多系列的ARM处理器核,目前最新的系列已经是ARM11了,而ARM6核以及更早的系列已经很罕见了。目前应用比较广泛的系列是:ARM7ARM9ARM9EARM10SecurCoreXscaleARM7微处理器系列

该系列包括ARM7TDMI、ARM7TDMI-S、带有高速缓存处理器宏单元的ARM720T和扩充了Jazelle的ARM7EJ-S。

ARM7系列广泛应用于多媒体和嵌入式设备,包括Internet设备、网络和调制解调器设备,以及移动电话、PDA等无线设备。

ARM7TDMI基于体系结构V4版本,支持32位寻址范围;

ARM7TDMI的后缀意义为:支持高密度16位的Thumb指令集;支持片上调试;支持64位乘法;支持EmbededICE观察硬件;ARM7TDMI的可综合(synthesizable)版本(软核),对应用工程师来说其编程模型与ARM7TDMI一致;ARM7TDMI-SARM7芯片示例

ARM9微处理器系列

ARM9系列微处理器在高性能和低功耗特性方面提供最佳的性能,具有以下特点:5级整数流水线,指令执行效率更高;基于体系结构V4版本提供1.1MIPS/MHZ的哈佛结构,支持数据Cache和指令Cache,具有更高的的指令和数据处理能力;全性能的MMU支持WindowsCE、Linux、PalmOs等多种主流嵌入式操作系统;

应用领域:无线设备、仪器仪表、安全系统、机顶盒等

ARM10系列微处理器

该系列包括ARM1020E和ARM1022E处理器核,其核心在于使用向量浮点(VFP)单元VFP10提供高性能的浮点解决方案,从而极大提高了处理器的整型和浮点运算性能。可以用于视频游戏机和高性能打印机等场合。SecurCore内核系列

该系列涵盖了SC100、SC110、SC200和SC210处理器核。该系列处理器主要针对新兴的安全市场,以一种全新的安全处理器设计为智能卡和其它安全IC开发提供独特的32位系统设计,并具有特定反伪造方法,从而有助于防止对硬件和软件的盗版。StrongARM微处理器系列

InterStrongARMSA-1100处理器是采用ARM体系结构高度集成的32位RISC微处理器;它融合了Inter公司的设计和处理技术以及ARM体系结构的电源效率,采用在软件上兼容ARMv4体系结构、同时采用具有Intel技术优点的体系结构;已成功应用于多家公司的掌上电脑系列产品;Xscale处理器

Scale处理器是基于ARMv5TE体系结构的解决方案,是一款全性能、高性价比、低功耗的处理器;Xscale

处理器是Intel目前主要推广的一款ARM微处理器;2.3ARM微处理器的寄存器结构ARM处理器共有37个寄存器,被分为若干个组(BANK),这些寄器包括:31个通用寄存器,包括程序计数器(PC指针),均为32位的寄存器。6个状态寄存器,用以标识CPU的工作状态及程序的运行状态,均为32位,目前只使用了其中的一部分。2.3.1处理器运行模式ARM微处理器支持7种运行模式,分别为:usr(用户模式):ARM处理器正常程序执行模式。fiq(快速中断模式):用于高速数据传输或通道处理irq(外部中断模式):用于通用的中断处理svc(管理模式):操作系统使用的保护模式abt(数据访问终止模式):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护。sys(系统模式):运行具有特权的操作系统任务。und(未定义指令中止模式):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真。

注:大多数的应用程序运行在用户模式下,当处理器运行在用户模式下时,某些被保护的系统资源是不能被访问的。

特权模式

异常模式

用户与系统模式2.3.2处理器工作状态

ARM处理器有32位ARM和16位Thumb两种工作状态。在32位ARM状态下执行字对齐的ARM指令在16位Thumb状态下执行半字对齐的Thumb指令在Thumb状态下,程序计数器PC(ProgramCounter)使用位[1]选择另一个半字。

注意:

两个状态之间的切换并不影响处理器模式或寄存器内容。

使用BX指令将ARM内核的操作状态在ARM状态和Thumb状态之间进行切换,程序如下所示。;从Arm状态切换到Thumb状态

LDRR0,=Lable+1BXR0;从Thumb状态切换到ARM状态

LDRR0,=LableBXR0地址最低位为1,表示切换到Thumb状态地址最低位为0,表示切换到ARM状态跳转地址标号2.3.3ARM处理器的寄存器组织

ARM处理器的37个寄存器被安排成部分重叠的组,不能在任何模式都可以使用,寄存器的使用与处理器状态和工作模式有关。如图2.3.1所示,每种处理器模式使用不同的寄存器组。其中15个通用寄存器(R0~R14)、1或2个状态寄存器和程序计数器是通用的。31个通用32位寄存器,包括程序计数器PC:未分组寄器R0-R7;分组寄存器R8-R14;程序计数器PC(R15);6个状态寄存器;可访问的寄存器取决于处理器的模式寄存器类别寄存器在汇编中的名称各模式下实际访问的寄存器用户系统管理中止未定义中断快中断通用寄存器和程序计数器R0(a1)R0R1(a2)R1R2(a3)R2R3(a4)R3R4(v1)R4R5(v2)R5R6(v3)R6R7(v4)R7R8(v5)R8R8_fiqR9(SB,v6)R9R9_fiqR10(SL,v7)R10R10_fiqR11(FP,v8)R11R11_fiqR12(IP)R12R12_fiqR13(SP)R13R13_svcR13_abtR13_undR13_irqR13_fiqR14(LR)R14R14_svcR14_abtR14_undR14_irqR14_fiqR15(PC)R15状态寄存器CPSRCPSRSPSR无SPSR_abtSPSR_abtSPSR_undSPSR_irqSPSR_fiq一般的通用寄存器

寄存器R13、R14分别有6个分组的物理寄存器。一个用于用户和系统模式,其余5个分别用于5种异常模式。R14_fiqR14_irqR14_undR14_abtR14_svcR14R13_fiqR13_irqR13_undR13_abtR13_svcR13Lable程序A程序BR14R14寄存器与子程序调用:BLLable地址A???MOVPC,LRR14(地址A)Lable???1.程序A执行过程中调用程序B;操作流程2.程序跳转至标号Lable,执行程序B。同时硬件将“BLLable”指令的下一条指令所在地址存入R14;3.程序B执行最后,将R14寄存器的内容放入PC,返回程序A;读R15的限制

正常操作时,从R15读取的值是处理器正在取指的地址,即当前正在执行指令的地址加上8个字节(两条ARM指令的长度)。LDRR0,PC??????PCPC-4PC-8正在执行正在译码正在取指流水线状态地址程序代码程序状态寄存器(CPSR)

ARM内核包含1个CPSR和5个供异常处理程序使用的SPSR。CPSR反映了当前处理器的状态,其包含:4个条件代码标志(负(N)、零(Z)、进位(C)和溢出(V);2个中断禁止位,分别控制一种类型的中断;5个对当前处理器模式进行编码的位;1个用于指示当前执行指令(ARM还是Thumb)的位。

每个异常模式还带有一个程序状态保存寄存器(SPSR),它用于保存在异常事件发生之前的CPSR。CPSR和SPSR通过特殊指令进行访问。注意:如果通过程序修改CPSR寄存器中的模式位进入异常模式,那么硬件将不会把CPSR保存至SPSR中.条件代码标志

大多数“数值处理指令”可以选择是否影响条件代码标志位。通常如果指令带S后缀,则该指令的执行会影响条件代码标志;但有一些指令的执行总是会影响条件代码标志(比如CMP、TST、TEQ等)。

N、Z、C和V位都是条件代码标志。通过算术操作、逻辑操作、MSR或者LDM指令可以对这些位进行设置。所有ARM指令都可按条件来执行,而Thumb指令中只有分支指令可按条件执行。举例:

ADDR0,R0,R1ADDSR0,R0,R1ADDEQSR0,R0,R1控制位

CPSR的最低8位为控制位,当发生异常时,这些位被硬件改变。当处理器处于一个特权模式时,可用软件操作这些位。

它们分别是:中断禁止位;T位;模式位。中断禁止位包括I和F位:当I位置位时,IRQ中断被禁止;当F位置位时,FIQ中断被禁止。T位反映了正在操作的状态:当T位置位时,处理器正在Thumb状态下运行;当T位清零时,处理器正在ARM状态下运行。模式位包括M4、M3、M2、M1和M0,这些位决定处理器的操作模式。程序状态寄存器

条件位:N=1-结果为负,0-结果为正或0Z=1-结果为0,0-结果不为0C=1-进位,0-借位V=1-结果溢出,0结果没溢出Q位:仅ARM5TE/J架构支持指示增强型DSP指令是否溢出J位仅ARM5TE/J架构支持J=1:处理器处于Jazelle状态中断禁止位:I=1:禁止IRQ.F=1:禁止FIQ.TBit仅ARMxT架构支持T=0:处理器处于ARM状态T=1:处理器处于Thumb状态Mode位(处理器模式位):0b10000 User0b10001 FIQ0b10010 IRQ0b10011 Supervisor0b10111 Abort0b11011 Undefined0b11111 System2731NZCVQ2867IFTmode1623

815

54024fsxc

UndefinedJ2.4ARM微处理器的异常处理

在一个正常的程序流程执行过程中,由内部或外部源产生的一个事件使正常的程序产生暂时的停止时,称之为异常。在处理异常之前,当前处理器的状态必须保留,当异常处理完成之后,恢复保留的当前处理器状态,继续执行当前程序。多个异常同时发生时,处理器将会按固定的优先级进行处理。2.4.1ARM体系结构的异常类型

ARM体系结构支持7种类型的异常,异常类型、异常处理模式和优先级如表2.4.1所示。异常出现后,强制从异常类型对应的固定存储器地址开始执行程序。这些固定的地址称为异常向量(ExceptionVectors)。异常类型异常进入模式地址(异常向量)优先级复位复位管理模式0x0000,00001(最高)未定义指令未定义指令未定义模式0x0000,00046(最低)软件中断软件中断管理模式0x0000,00086(最低)指令预取中止中止(预取指令)中止模式0x0000,000C5数据中止中止(数据)中止模式0x0000,00102IRQ(外部中断请求)IRQIRQ0x0000,00184FIQ(快速中断请求)FIQFIQ0x0000,001C3表2.4.1ARM体系结构的异常类型和异常处理模式2.4.2异常类型的含义(1)复位当处理器的复位电平有效时,产生复位异常,ARM处理器立刻停止执行当前指令。复位后,ARM处理器在禁止中断的管理模式下,程序跳转到复位异常处理程序处执行(从地址0x00000000或0xFFFF0000开始执行指令)。(2)未定义指令异常当ARM处理器或协处理器遇到不能处理的指令时,产生未定义指令异常。当ARM处理器执行协处理器指令时,它必须等待任一外部协处理器应答后,才能真正执行这条指令。若协处理器没有响应,就会出现未定义指令异常。若试图执行未定义的指令,也会出现未定义指令异常。未定义指令异常可用于在没有物理协处理器(硬件)的系统上,对协处理器进行软件仿真,或在软件仿真时进行指令扩展。(3)软件中断异常(SoftWareInterrupt,SWI)软件中断异常由执行SWI指令产生,可使用该异常机制实现系统功能调用,用于用户模式下的程序调用特权操作指令,以请求特定的管理(操作系统)函数。(4)指令预取中止若处理器预取指令的地址不存在,或该地址不允许当前指令访问,存储器会向处理器发出存储器中止(Abort)信号,但当预取的指令被执行时,才会产生指令预取中止异常。(5)数据中止(数据访问存储器中止)若处理器数据访问指令的地址不存在,或该地址不允许当前指令访问时,产生数据中止异常。存储器系统发出存储器中止信号。响应数据访问(加载或存储)激活中止,标记数据为无效。在后面的任何指令或异常改变CPU状态之前,数据中止异常发生。(6)外部中断请求(IRQ)异常当处理器的外部中断请求引脚有效,且CPSR中的I位为0时,产生IRQ异常。系统的外设可通过该异常请求中断服务。IRQ异常的优先级比FIQ异常的低。当进入FIQ处理时,会屏蔽掉IRQ异常。(7)快速中断请求(FIQ)异常当处理器的快速中断请求引脚有效,且CPSR中的F位为0时,产生FIQ异常。FIQ支持数据传送和通道处理,并有足够的私有寄存器。2.4.3异常的响应过程当一个异常出现以后,ARM微处理器会执行以下几步操作:①将下一条指令的地址存入相应连接寄存器LR,以便程序在处理异常返回时能从正确的位置重新开始执行。若异常是从ARM状态进入,LR寄存器中保存的是下一条指令的地址(当前PC+4或PC+8,与异常的类型有关);若异常是从Thumb状态进入,则在LR寄存器中保存当前PC的偏移量。②将CPSR状态传送到相应的SPSR中。③根据异常类型,强制设置CPSR的运行模式位。④强制PC从相关的异常向量地址取下一条指令执行,跳转到相应的异常处理程序。还可以设置中断禁止位,以禁止中断发生。注:异常总是在ARM状态中进行处理。如果异常发生时,处理器处于Thumb状态,则当异常向量地址加载入PC时,处理器自动切换到ARM状态。

异常处理完毕之后,ARM微处理器会执行以下几步操作从异常返回:①将连接寄存器LR的值减去相应的偏移量后送到PC中。②将SPSR内容送回CPSR中。③若在进入异常处理时设置了中断禁止位,要在此清除。可以认为应用程序总是从复位异常处理程序开始执行的,因此复位异常处理程序不需要返回。注:恢复CPSR的动作会将T、F和I位自动恢复为异常发生前的值。程序AIRQ服务程序系统模式IRQ模式程序寄存器组图示进入异常过程1.程序在系统模式下运行用户程序,假定当前处理器状态为Thumb状态、允许IRQ中断;2.用户程序运行时发生IRQ中断,硬件完成以下动作:LR_sysSPSR_irqLR_irqLRPCCPSRSPSRSYS1?0...????MODTFI...NZCV置位I位(禁止IRQ中断)清零T位(进入ARM状态)设置MOD位,切换处理器模式至IRQ模式将下一条指令的地址存入IRQ模式的LR寄存器将CPSR寄存器内容存入IRQ模式的SPSR寄存器将跳转地址存入PC,实现跳转IRQ0?1...????BackAddrJumpAddrJumpSYS1?0...????“?”表示对该位不关心在异常处理结束后,异常处理程序完成以下动作:程序AIRQ服务程序系统模式IRQ模式程序寄存器组图示退出异常过程LR_sysSPSR_irqLR_irqLRPCCPSRSPSRSYS1?0...????MODTFI...NZCV将SPSR寄存器的值复制回CPSR寄存器;将LR寄存的值减去一个常量后复制到PC寄存器,跳转到被中断的用户程序。IRQ0?1...????BackAddrJumpAddrreturnSYS1?0...????SYS1?0...????BackAddr-4Jump“?”表示对该位不关心

当多个异常同时发生时,一个固定的优先级系统决定它们被处理的顺序:异常优先级异常类型优先级复位1(最高优先级)数据中止2FIQ3IRQ4预取中止5未定义指令6SWI7(最低优先级)优先级降低2.4.4应用程序中的异常处理

在应用程序的设计中,异常处理采用的方式是在异常向量表中的特定位置放置一条跳转指令,跳转到异常处理程序。当ARM处理器发生异常时,程序计数器PC会被强制设置为对应的异常向量,从而跳转到异常处理程序,当异常处理完成以后,返回到主程序继续执行。2.5ARM微处理器指令系统

2.5.1基本寻址方式

寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。ARM处理器具有9种基本寻址方式。1.寄存器寻址; 2.立即寻址;3.寄存器移位寻址; 4.寄存器间接寻址;5.基址寻址; 6.多寄存器寻址;7.堆栈寻址; 8.块拷贝寻址;9.相对寻址。操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值来操作。寄存器寻址指令举例如下:MOVR1,R2 ;将R2的值存入R1SUBR0,R1,R2;将R1的值减去R2的值,结果保存到R0

0xAA0x55R2R11.寄存器寻址MOVR1,R20xAA立即寻址指令中的操作码字段后面的地址码部分即是操作数本身,也就是说,数据就包含在指令当中,取出指令也就取出了可以立即使用的操作数(这样的数称为立即数)。立即寻址指令举例如下:SUBS R0,R0,#1;R0减1,结果放入R0,并且影响标志位MOV R0,#0xFF000;将立即数0xFF000装入R0寄存器

0x55R0MOVR0,#0xFF00程序存储2.立即寻址MOVR0,#0xFF000xFF00从代码中获得数据寄存器移位寻址是ARM指令集特有的寻址方式。当第2个操作数是寄存器移位方式时,第2个寄存器操作数在与第1个操作数结合之前,选择进行移位操作。寄存器移位寻址指令举例如下:MOV R0,R2,LSL#3

;R2的值左移3位,结果放入R0, ;即是R0=R2×8ANDS R1,R1,R2,LSLR3

;R2的值左移R3位,然后和R1相 ;“与”操作,结果放入R1,并影响标志位0x55R0R20x013.寄存器移位寻址MOVR0,R2,LSL#30x080x08逻辑左移3位寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。寄存器间接寻址指令举例如下:LDR R1,[R2] ;将R2指向的存储单元的数据读出,保存在R1中

SWP R1,R1,[R2] ;将寄存器R1的值和R2指定的存储

;单元的内容交换

0x55R0R20x400000000xAA0x400000004.寄存器间接寻址LDRR0,[R2]0xAA

基址寻址就是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址。基址寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能部件寄存器访问等。基址寻址指令举例如下:LDR R2,[R3,#0x0C];读取R3+0x0C地址上的存储单元的内容,放入R2STR R1,[R0,#-4]! ;先R0=R0-4,然后把R1的值寄存

;到保存到R0指定的存储单元5.基址寻址0x55R2R30x400000000xAA0x4000000CLDRR2,[R3,#0x0C]0xAA将R3+0x0C作为地址装载数据

多寄存器寻址一次可传送几个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器。多寄存器寻址指令举例如下:LDMIA R1!,{R2-R7,R12};将R1指向的单元中的数据读出到

R2~R7、R12中(R1自动加1)STMIA R0!,{R2-R7,R12};将寄存器R2~R7、R12的值保

;存到R0指向的存储单元中

;(R0自动加1)注:使用多寄存器寻址指令时,寄存器子集的顺序是由小到大排列,连续的寄存器用“-”连接,否则用“,”分隔书写。0x40000000R1R20x??0x010x400000000x??R3R40x??R60x??0x020x030x040x400000040x400000080x4000000C存储器6.多寄存器寻址LDMIAR1!,{R2-R4,R6}0x010x020x030x040x40000000

堆栈是一个按特定顺序进行存取的存储区,操作顺序为“后进先出”和“先进后出”。堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存储单元即是堆栈的栈顶。存储器堆栈可分为两种:向上生长:向高地址方向生长,称为递增堆栈向下生长:向低地址方向生长,称为递减堆栈7.堆栈寻址栈底栈顶栈区SP

堆栈存储区栈顶栈底栈区

SP向下增长向上增长0x123456780x12345678堆栈压栈堆栈压栈栈顶SP

栈顶SP

栈底空堆栈栈底满堆栈

堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个待压入数据的空位置,称为空堆栈。0x123456780x12345678栈顶SP

0x12345678栈顶SP

压栈压栈所以可以组合出四种类型的堆栈方式:满递增:堆栈向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA、STMFA等;空递增:堆栈向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA、STMEA等;满递减:堆栈向下增长,堆栈指针指向内含有效数据项的最低地址。指令如LDMFD、STMFD等;空递减:堆栈向下增长,堆栈指针向堆栈下的第一个空位置。指令如LDMED、STMED等。

快拷贝寻址指令用于将一块数据从存储器的某一位置拷贝到另一位置。如:STMIA R0!,{R1-R7} ;将R1~R7的数据保存到存储器中。

;存储指针在保存第一个值之后增加,增长方向为向上增长;STMIB R0!,{R1-R7} ;将R1~R7的数据保存到存储器中。

;存储指针在保存第一个值之前增加,增长方向为向上增长

8.块拷贝寻址相对寻址是基址寻址的一种变通。由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。相对寻址指令举例如下:

BL SUBR1 ;调用到SUBR1子程序

BEQ LOOP ;条件跳转到LOOP标号处

...LOOP MOV R6,#1 ...SUBR1 ...9.相对寻址简单的ARM程序:;文件名:TEST1.S

;功能:实现两个寄存器相加;说明:使用ARMulate软件仿真调试

AREA Example1,CODE,READONLY ;声明代码段Example1 ENTRY ;标识程序入口,相当于main() CODE32 ;声明32位ARM指令START MOV R0,#0 ;设置参数

MOV R1,#10LOOP BL ADD_SUB ;调用子程序ADD_SUB B LOOP ;跳转到LOOPADD_SUB

ADDS R0,R0,R1 ;R0=R0+R1 MOV PC,LR ;子程序返回

END ;文件结束,必须与entry配合使用使用“;”进行注释标号顶格写实际代码段声明文件结束2.5.2ARM指令集1.指令格式(1)基本格式

ARM指令的基本格式如下:<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}

其中<>号内的项是必须的,{}号内的项是可选的。各项的说明如下:opcode:指令助记符; cond:执行条件;S:是否影响CPSR寄存器的值;Rd:目标寄存器; Rn:第1个操作数的寄存器;operand2:第2个操作数;

ARM指令的基本格式如下:ARM指令集——第2个操作数:<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}

灵活的使用第2个操作数“operand2”能够提高代码效率。它有如下的形式:Rm——寄存器方式;Rm,shift——寄存器移位方式;Rm——寄存器方式在寄存器方式下,操作数即为寄存器的数值。例如:SUB R1,R1,R2MOV PC,R0Rm,shift——寄存器移位方式将寄存器的移位结果作为操作数,但Rm值保持不变,移位方法如下:操作码说明操作码说明ASR#n算术右移n位ROR#n循环右移n位LSL#n逻辑左移n位RRX带扩展的循环右移1位LSR#n逻辑右移n位TypeRsType为移位的一种类型,Rs为偏移量寄存器,低8位有效。Rm,shift——寄存器移位方式例如:

ADD R1,R1,R1,LSL#3 ;R1=R1+R1*8=9R1SUB R1,R1,R2,LSRR3 ;R1=R1-(R2/2R3)(2)条件码几乎所有的ARM指令都包含一个可选择的条件码,即{<cond>}。使用指令条件码,可实现高效的逻辑操作,提高代码效率。当处理器工作在ARM状态时,几乎所有的指令均根据CPSR中条件码的状态和指令的条件域有条件的执行。当指令的执行条件满足时,指令被执行,否则指令被忽略。每一条ARM指令包含4位的条件码,位于指令的最高4位[31:28]。条件码共有16种,每种条件码可用两个字符表示,这两个字符可以添加在指令助记符的后面和指令同时使用。例如,跳转指令B可以加上后缀EQ变为BEQ表示“相等则跳转”,即当CPSR中的Z标志置位时发生跳转。ARM条件码如表2.5.1所示。表2.5.1ARM条件码操作码条件助记符标志含义0000EQZ=1相等0001NEZ=0不相等0010CS/HSC=1无符号数大于或等于0011CC/LOC=0无符号数小于0100MIN=1负数0101PLN=0正数或零0110VSV=1溢出0111VCV=0没有溢出1000HIC=1,Z=0无符号数大于1001LSC=0,Z=1无符号数小于或等于1010GEN=V有符号数大于或等于

1011LTN!=V有符号数小于

1100GTZ=0,N=V有符号数大于

1101LEZ=1,N!=V有符号数小于或等于

1110AL任何无条件执行

(指令默认条件)1111NV任何从不执行(不要使用)条件码应用举例比较两个值大小,并进行相应加1处理C代码为:If(a>b)a++;Elseb++;对应的ARM指令为(其中R0为a,R1为b)CMPR0,R1ADDHIR0,R0,#1ADDLSR1,R1,#1若两个条件均成立,则将这两个数相加C代码为:If((a!=10)&&(b!=20))a=a+b;对应ARM指令为:CMPR0,#10CMPNER1,#20ADDNER0,R0,R12.ARM存储器访问指令

ARM微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储指令则完成相反的操作。

ARM的加载/存储指令是可以实现字、半字、,无符/有符字节操作;批量加载/存储指令可实现一条指令加载/存储多个寄存器的内容.SWP指令是一条寄存器和存储器内容交换的指令,可用于信号量操作等。

ARM存储访问指令表如表2.5.2所示。助记符说明操作条件码位置LDRRd,addressing

加载字数据

Rd←[addressing],addressing

索引

LDR{cond}LDRBRd,addressing

加载无符字节数据

Rd←[addressing],addressing

索引

LDR{cond}B

LDRTRd,addressing以用户模式加载字数据

Rd←[addressing],addressing

索引

LDR{cond}T

LDRBTRd,addressing以用户模式加载无符号字数据

Rd←[addressing],addressing

索引LDR{cond}BT

LDRHRd,addressing加载无符半字数据

Rd←[addressing],addressing

索引

LDR{cond}H

表2.5.2ARM存储访问指令表STRBRd,addressing存储字节数据

[addressing]←Rd,addressing

索引

STR{cond}B

STRTRd,addressing以用户模式存储字数据

[addressing]←Rd,addressing

索引

STR{cond}T

SRTBTRd,addressing以用户模式存储字节数据

[addressing]←Rd,addressing

索引

STR{cond}BT

STRHRd,addressing存储半字数据

[addressing]←Rd,addressing

索引

STR{cond}H

LDM{mode}Rn{!},reglist

批量(寄存器)加载

reglist←[Rn…],Rn

回存等

LDM{cond}{more}STM{mode}Rn{!},rtglist

批量(寄存器)存储

[Rn…]←reglist,Rn

回存等

STM{cond}{more}SWPRd,Rm,Rn

寄存器和存储器字数据交换

Rd←[Rd],[Rn]←[Rm](Rn≠Rd

或Rm)SWP{cond}SWPBRd,Rm,Rn

寄存器和存储器字节数据交换

Rd←[Rd],[Rn]←[Rm](Rn≠Rd

或Rm)SWP{cond}B

LDR和STR单寄存器加载/存储指令

LDR指令用于从内存中读取单一字或字节数据存入寄存器中,STR指令用于将寄存器中的单一字或字节数据保存到内存。指令格式如下:

LDR{cond}{T} Rd,<地址>;将指定地址上的字数据读入RdSTR{cond}{T} Rd,<地址>;将Rd中的字数据存入指定地址

LDR{cond}B{T} Rd,<地址>;将指定地址上的字节数据读入RdSTR{cond}B{T} Rd,<地址>;将Rd中的字节数据存入指定地址

其中,T为可选后缀。若指令有T,那么即使处理器是在特权模式下,存储系统也将访问看成是在用户模式下进行的。T在用户模式下无效,不能与前索引偏移一起使用T。

LDR/STR指令寻址非常灵活,它由两部分组成,其中一部分为一个基址寄存器,可以为任一个通用寄存器;另一部分为一个地址偏移量。地址偏移量有以下3种格式:立即数。立即数可以是一个无符号的数值。这个数据可以加到基址寄存器,也可以从基址寄存器中减去这个数值。如:LDRR1,[R0,#0x12]寄存器。寄存器中的数值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。如:LDRR1,[R0,R2]

寄存器及移位常数。寄存器移位后的值可以加到基址寄存器,也可以从基址寄存器中减去这个数值。如:LDRR1,[R0,R2,LSL#2]

从寻址方式的地址计算方法分,加载/存储指令有以下4种格式:

零偏移,Rn的值作为传送数据的地址,即地址偏移量为0。

如:LDRRd,[Rn]前索引偏移。在数据传送前,将偏移量加到Rn中,其结果作为传送数据的存储地址。若使用“!”号,则结果写回Rn中。

如:LDRRd,[Rn,#0x04]!程序相对偏移。汇编器由PC计算偏移量,并将PC作为Rn生成前索引指令。如:LDRRd,labe1

后索引偏移。Rn的值用作传送数据的存储地址。在数据传送后,将偏移量与Rn相加,结果写回Rn中。 如:LDRRd,[Rn],#0x04LDM和STM多寄存器加载/存储指令格式如下:LDM{cond}<模式>Rn{!},reglist{^}STM{cond}<模式>Rn{!},reglist{^}Rn:基址寄存器,装有传送数据的初始地址;模式:控制地址的增长方式,一共有8种模式;!:表示在操作结束后,将最后的地址写回Rn中;reglist

:表示寄存器列表,可以包含多个寄存器,它们使用“,”隔开,如{R1,R2,R6-R9},寄存器由小到大排列;^:加入该后缀后,进行数据传送且寄存器列表不包含PC时,加载/存储的寄存器是用户模式下的,而不是当前模式的寄存器。若在LDM指令且寄存器列表中包含有PC时使用,那么除了正常的多寄存器传送外,还将CPSR也拷贝到SPSR中,这可用于异常处理返回。注意:该后缀不允许在用户模式或系统模式下使用。

多寄存器加载/存储指令的8种模式如下表所示,右边四种为堆栈操作、左边四种为数据传送操作。模式说明模式说明IA每次传送后地址加4FD满递减堆栈IB每次传送前地址加4ED空递减堆栈DA每次传送后地址减4FA满递增堆栈DB每次传送前地址减4EA空递增堆栈数据块传送操作堆栈操作助记符说明操作条件码位置SWPRd,Rm,Rn

寄存器和存储器字数据交换Rd←[Rn],[Rn]←Rm(Rn≠Rd或Rm)SWP{cond}SWPBRd,Rm,Rn

寄存器和存储器字节数据交换Rd←[Rn],[Rn]←Rm(Rn≠Rd或Rm)SWP{cond}B

SWP指令用于将一个内存单元(该单元地址放在寄存器Rn中)的内容读取到一个寄存器Rd中,同时将另一个寄存器Rm的内容写入到该内存单元中。使用SWP可实现信号量操作。指令格式如下:SWP{cond}{B}Rd,Rm,[Rn]

其中,B为可选后缀,若有B,则交换字节,否则交换32位字;Rd用于保存从存储器中读入的数据;Rm的数据用于存储到存储器中,若Rm与Rn相同,则为寄存器与存储器内容进行交换;Rn为要进行数据交换的存储器地址,Rn不能与Rd和Rm相同。

指令示例:

LDRR0,[R1];将存储器地址为R1的字数据读入寄存器R0。

LDRR0,[R1,R2];将存储器地址为R1+R2的字数据读入寄存器R0。

LDRR0,[R1,#8];将存储器地址为R1+8的字数据读入寄存器R0。

LDRR0,[R1,R2]!;将存储器地址为R1+R2的字数据读入寄存器R0,并将新地址R1+R2写入R1。

LDRR0,[R1,#8]!;将存储器地址为R1+8的字数据读入寄存器R0,并将新地址R1+8写入R1。

LDRR0,[R1],R2;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2写入R1。

LDRR0,[R1,R2,LSL#2]!;将存储器地址为R1+R2×4的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。

LDRBR0,[R1,#8];将存储器地址为R1+8的字节数据读入寄存器R0,并将R0的高24位清零。

LDRHR0,[R1,R2];将存储器地址为R1+R2的半字数据读入寄存器R0,并将R0的高16位清零。STRR0,[R1],#8;将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。

STRBR0,[R1,#8];将寄存器R0中的字节数据写入以R1+8为地址的存储器中。

STRHR0,[R1];将寄存器R0中的半字数据写入以R1为地址的存储器中

STMFDR13!,{R0,R4-R12,LR};将寄存器列表中的寄存器(R0,R4到R12,LR)存入堆栈。

LDMFDR13!,{R0,R4-R12,PC};将堆栈内容恢复到寄存器(R0,R4到R12,LR)。

SWPR0,R1,[R2];将R2所指向的存储器中的字数据传送到R0,同时将R1中的字数据传送到R2所指向的存储单元。3.ARM数据处理指令数据处理指令可分为数据传送指令、算术逻辑运算指令和比较指令等。数据传送指令用于在寄存器和存储器之间进行数据的双向传输。所有ARM数据处理指令均可选择使用S后缀,以影响状态标志。比较指令不需要后缀S,它们会直接影响状态标志。算术逻辑运算指令完成常用的算术与逻辑的运算,该类指令不但将运算结果保存在目的寄存器中,同时更新CPSR中的相应条件标志位。比较指令不保存运算结果,只更新CPSR中相应的条件标志位。数据处理指令如表2.5.3所示。注意:数据处理指令只能对寄存器的内容进行操作,不能对内存中的数据进行处理。助记符号说明操作条件码位置MOVRd,operand2数据传送

Rd←operand2MOV{cond}{S}MVNRd,operand2数据取反传送

Rd←(operand2)MVN{cond}{S}ADDRd,Rnoperand2加法运算指令

Rd←Rn+operand2ADD{cond}{S}SUBRd,Rnoperand2减法运算指令

Rd←Rn-operand2SUB{cond}{S}RSBRd,Rnoperand2逆向减法指令

Rd←operand2-RnRSB{cond}{S}ADCRd,Rnoperand2带进位加法

Rd←Rn+operand2+carryADC{cond}{S}SBCRd,Rnoperand2带进位减法指令

Rd←Rn-operand2-(NOT)CarrySBC{cond}{S}RSCRd,Rnoperand2带进位逆向减法指令

Rd←operand2-Rn-(NOT)CarryRSC{cond}{S}表2.5.3数据处理指令表ANDRd,Rnoperand2逻辑与操作指令

Rd←Rn&operand2AND{cond}{S}ORRRd,Rnoperand2逻辑或操作指令

Rd←Rn|operand2ORR{cond}{S}EORRd,Rnoperand2逻辑异或操作指令

Rd←Rn^operand2EOR{cond}{S}BICRd,Rnoperand2位清除指令

Rd←Rn&(~operand2)BIC{cond}{S}CMPRn,operand2比较指令

标志N、Z、C、V←Rn-operand2CMP{cond}CMNRn,operand2负数比较指令

标志N、Z、C、V←Rn+operand2CMN{cond}TSTRn,operand2位测试指令

标志N、Z、C、V←Rn&operand2TST{cond}TEQRn,operand2相等测试指令

标志N、Z、C、V←Rn^operand2TEQ{cond}位清除指令——BIC指令将寄存器Rn的值与operand2的值的反码按位作逻辑“与”操作,结果保存到Rd中。BIC{cond}{S}Rd,Rn,operand2比较指令——CMP指令将寄存器Rn的值减去operand2的值,根据操作的结果更新CPSR中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。CMP{cond} Rn,operand2位测试指令——TST指令将寄存器Rn的值与operand2的值按位作逻辑“与”操作,根据操作的结果更新CPSR中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。TST{cond}Rn,operand2

指令示例:

MOVR1,R0;将寄存器R0的值传送到寄存器R1MOVPC,R14;将寄存器R14的值传送到PC,常用于子程序返回MOVR1,R0,LSL#3;将寄存器R0的值左移3位后传送到R1MVNR0,#0xff;将立即数ff取反传送到寄存器R0中,完成后R0=oxffffff00CMPR1,R0;将寄存器R1的值与寄存器R0的值相减,并根据结果设置CPSR的标志位CMNR1,R0;将寄存器R1的值与寄存器R0的值相加,并根据结果设置CPSR的标志位TSTR1,#0xffe;将寄存器R1的值与立即数0xffe按位与,并根据结果设置CPSR的标志位TEQR1,R2;将寄存器R1的值与寄存器R2的值按位异或,并根据结果设置CPSR的标志位

ADDR0,R1,R2;R0=R1+R2ADCSR1,R5,R9;加第二个字,带进位SUBR0,R1,#256;R0=R1-256RSBR0,R1,R2;R0=R2–R1RSCR0,R1,R2;R0=R2–R1-!CANDR0,R0,#3;该指令保持R0的0、1位,其余位清零。ORRR0,R0,#3;该指令设置R0的0、1位,其余位保持不变。EORR0,R0,#3;该指令反转R0的0、1位,其余位保持不变BICR1,R1,#0x0F

;将R1的低4位清零,其它位不变

4.ARM跳转指令

在ARM中有两种方式可以实现程序的跳转,一种是使用分支指令直接跳转,另一种则是直接向PC寄存器赋值实现跳转。分支指令有以下三种:分支指令B;带链接的分支指令BL;带状态切换的分支指令BX。助记符说明操作条件码位置Blabel分支指令PC←labelB{cond}BLlabel带链接的分支指令LR←PC-4,PC←labelBL{cond}BXRm带状态切换的分支指令PC←label,切换处理器状态BX{cond}分支指令——B指令,该指令跳转范围限制在当前指令的±32M字节地址内。一旦遇到一个B指令,ARM处理器直接跳转到给定的地址。指令格式如下:

B{cond}Label

应用示例:

B WAITA ;跳转到WAITA标号处

B 0x1234 ;跳转到绝对地址0x1234处

助记符说明操作条件码位置Blabel分支指令PC←labelB{cond}BLlabel带链接的分支指令LR←PC-4,PC←labelBL{cond}BXRm带状态切换的分支指令PC←label,切换处理器状态BX{cond}带链接的分支指令——BL指令适用于子程序调用,使用该指令后,下一条指令的地址被拷贝到R14(即LR)链接寄存器中,然后跳转到指定地址运行程序。跳转范围限制在当前指令的±32M字节地址内。指令格式如下:BL{cond}LabelBLLabelxxxxxxLabelxxxMOVPC,LRAddr1Addr2xxxxxxLRPCAddr1LabelAddr2Addr21.当程序执行到BL跳转指令时,硬件将下一条指令的地址Addr2装入LR寄存器,并把跳转地址装入程序计数器(PC)2.程序跳转到目标地址Label继续执行,当子程序执行结束后,将LR寄存器内容存入PC,返回调用函数继续执行助记符说明操作条件码位置Blabel分支指令PC←labelB{cond}BLlabel带链接的分支指令LR←PC-4,PC←labelBL{cond}BXRm带状态切换的分支指令PC←label,切换处理器状态BX{cond}带状态切换的分支指令——BX指令,该指令可以根据跳转地址(Rm)的最低位来切换处理器状态。其跳转范围限制在当前指令的±32M字节地址内。指令格式如下:BX{cond}Rm跳转地址Rm[0]跳转后CPSR标志T位处理器状态00ARM11Thumb6.ARM杂项指令

ARM指令集中有三条指令作为杂项指令,实际上这三条指令非常重要。它们如下所示:助记符说明操作条件码位置SWIimmed_24软中断指令产生软中断,处理器进入管理模式SWI{cond}MRSRd,psr读状态寄存器指令Rd←psr,psr为CPSR或SPSRMRS{cond}MSRpsr_fields,Rd/#immed_8r写状态寄存器指令psr_fields←Rd/#immed_8r,psr为CPSR或SPSRMSR{cond}

SWI指令用于产生软中断,从而实现由用户模式变换到管理模式,并且将CPSR保存到管理模式的SPSR中,然后程序跳转到SWI异常入口。在其它模式下也可使用SWI指令,处理器同样地切换到管理模式。该指令主要用于用户程序调用操作系统的系统服务,操作系统在SWI异常处理程序中进行相应的系统服务。SWI{cond} immed_24SWI

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论