14CHAPTERARM指令集25.1引言--ARM指令与Thumb指令ARM处理器是基于精简指令集计算机(RISC)原理设计的,指令集和相关译码机制较为简单。一些ARM核具有32位ARM指令集和16位Thumb指令集。ARM指令集效率高,但是代码密度低;而Thumb指令集具有较高的代码密度,却仍然保持ARM的大多数性能上的优势,它是ARM指令集的子集。所有的ARM指令都是可以有条件执行的,而Thumb指令仅有一条指令具备条件执行功能。ARM程序和Thumb程序可相互调用,相互之间的状态切换开销几乎为零。3ARM指令集与Thumb指令集的关系Thumb指令集具有灵活、小巧的特点ARM指令集支持ARM核所有的特性,具有高效、快速的特点45.1引言—数据类型ARM微处理器的指令长度可以是32位(在ARM状态下),也可以为16位(在Thumb状态下)。ARM微处理器中支持三种数据类型:字节(8位有符号和无符号字节)半字(16位有符号和无符号半字)字(32位有符号和无符号字)其中,字需要4字节对齐(地址的低两位为0)、半字需要2字节对齐(地址的最低位为0)。55.1引言--存储器组织Little-andbig-endianmemoryorganizationshalf-word4word1601234567891011byte0byte121314151617181920212223byte1byte2half-word14byte3byte6half-word6word1632107654111098byte3byte151413121918171623222120byte2byte1half-word12byte0byte5addressaddress(a)Little-endianmemory(b)Big-endianmemoryorganizationorganizationbit31bit0bit31bit0half-word12half-word14word8word865.1引言—特权模式ARMoperatingmodesandregisterusage.CPSR[4:0]ModeUseRegisters10000UserNormalusercodeuser10001FIQProcessingfastinterrupts_fiq10010IRQProcessingstandardinterrupts_irq10011SVCProcessingsoftwareinterrupts(SWIs)_svc10111AbortProcessingmemoryfaults_abt11011UndefHandlingundefinedinstructiontraps_und11111SystemRunningprivilegedoperatingsystemtasksuserSPSR----每一种特权模式(系统模式除外)都有一个与之相关的程序状态保存寄存器SPSR75.2—ARM异常(Exceptions)当正常的程序执行流程发生暂时的停止时,称之为异常,例如处理一个外部的中断请求。在处理异常之前,当前处理器的状态必须保留,这样当异常处理完成之后,当前程序可以继续执行。处理器允许多个异常同时发生,它们将会按固定的优先级进行处理。ARM体系结构中的异常,与8位/16位体系结构的中断有很大的相似之处,但异常与中断(interrupt)的概念并不完全等同。8ARM体系结构所支持的异常类型异常类型具体含义复位当处理器的复位电平有效时,产生复位异常,程序跳转到复位异常处理程序处执行。未定义指令当ARM处理器或协处理器遇到不能处理的指令时,产生未定义指令异常。可使用该异常机制进行软件仿真。软件中断该异常由执行SWI指令产生,可用于用户模式下的程序调用特权操作指令。可使用该异常机制实现系统功能调用。指令预取中止若处理器预取指令的地址不存在,或该地址不允许当前指令访问,存储器会向处理器发出中止信号,但当预取的指令被执行时,才会产生指令预取中止异常。数据中止若处理器数据访问指令的地址不存在,或该地址不允许当前指令访问时,产生数据中止异常。IRQ(外部中断请求)当处理器的外部中断请求引脚有效,且CPSR中的I位为0时,产生IRQ异常。系统的外设可通过该异常请求中断服务。FIQ(快速中断请求)当处理器的快速中断请求引脚有效,且CPSR中的F位为0时,产生FIQ异常。95.2—异常的进入对异常的响应:当一个异常出现以后,ARM微处理器会执行以下几步操作:1、将下一条指令的地址存入相应连接寄存器LR,以便程序在处理异常返回时能从正确的位置重新开始执行。若异常是从ARM状态进入,LR寄存器中保存的是下一条指令的地址(当前PC+4或PC+8,与异常的类型有关);若异常是从Thumb状态进入,则在LR寄存器中保存当前PC的偏移量,这样,异常处理程序就不需要确定异常是从何种状态进入的。例如:在软件中断异常SWI,指令MOVPC,R14_svc总是返回到下一条指令,不管SWI是在ARM状态执行,还是在Thumb状态执行。2、将CPSR复制到相应的SPSR中。3、根据异常类型,强制设置CPSR的运行模式位。4、强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处。还可以设置中断禁止位,以禁止中断发生。如果异常发生时,处理器处于Thumb状态,则当异常向量地址加载入PC时,处理器自动切换到ARM状态。10ARM微处理器对异常的响应过程用伪码可以描述为:R14_Exception_Mode=ReturnLinkSPSR_Exception_Mode=CPSRCPSR[4:0]=ExceptionModeNumberCPSR[5]=0;当运行于ARM工作状态时IfException_Mode==ResetorFIQthenCPSR[6]=1;当响应FIQ异常时,禁止新的FIQ异常CPSR[7]=1;禁止新的IRQ异常PC=ExceptionVectorAddress11ExceptionvectoraddressesExceptionModeVectoraddressResetSVC0x00000000UndefinedinstructionUND0x00000004Softwareinterrupt(SWI)SVC0x00000008Prefetchabort(instructionfetchmemoryfault)Abort0x0000000CDataabort(dataaccessmemoryfault)Abort0x00000010IRQ(normalinterrupt)IRQ0x00000018FIQ(fastinterrupt)FIQ0x0000001C12异常返回异常处理完毕之后,ARM微处理器会执行以下几步操作从异常返回:1、将连接寄存器LR的值减去相应的偏移量后送到PC中。2、将SPSR复制回CPSR中。3、若在进入异常处理时设置了中断禁止位,要在此清除。可以认为应用程序总是从复位异常处理程序开始执行的,因此复位异常处理程序不需要返回。13FIQ(FastInterruptRequest)FIQ异常是为了支持数据传输或者通道处理而设计的。在ARM状态下,系统有足够的私有寄存器,从而可以避免对寄存器保存的需求,并减小了系统上下文切换的开销。若将CPSR的F位置为1,则会禁止FIQ中断,若将CPSR的F位清零,处理器会在指令执行时检查FIQ的输入。注意只有在特权模式下才能改变F位的状态。可由外部通过对处理器上的nFIQ引脚输入低电平产生FIQ。不管是在ARM状态还是在Thumb状态下进入FIQ模式,FIQ处理程序均会执行以下指令从FIQ模式返回:SUBSPC,R14_fiq,#4该指令将寄存器R14_fiq的值减去4后,复制到程序计数器PC中,从而实现从异常处理程序中的返回,同时将SPSR_mode寄存器的内容复制到当前程序状态寄存器CPSR中。14IRQ(InterruptRequest)IRQ异常属于正常的中断请求,可通过对处理器的nIRQ引脚输入低电平产生,IRQ的优先级低于FIQ,当程序执行进入FIQ异常时,IRQ可能被屏蔽。若将CPSR的I位置为1,则会禁止IRQ中断,若将CPSR的I位清零,处理器会在指令执行完之前检查IRQ的输入。注意只有在特权模式下才能改变I位的状态。不管是在ARM状态还是在Thumb状态下进入IRQ模式,IRQ处理程序均会执行以下指令从IRQ模式返回:SUBSPC,R14_irq,#4该指令将寄存器R14_irq的值减去4后,复制到程序计数器PC中,从而实现从异常处理程序中的返回,同时将SPSR_mode寄存器的内容复制到当前程序状态寄存器CPSR中。15ABORT(中止)产生中止异常意味着对存储器的访问失败。ARM微处理器在存储器访问周期内检查是否发生中止异常。中止异常包括两种类型:指令预取中止:发生在指令预取时。数据中止:发生在数据访问时。当指令预取访问存储器失败时,存储器系统向ARM处理器发出存储器中止(Abort)信号,预取的指令被记为无效,但只有当处理器试图执行无效指令时,指令预取中止异常才会发生,如果指令未被执行,例如在指令流水线中发生了跳转,则预取指令中止不会发生。若数据中止发生,系统的响应与指令的类型有关。当确定了中止的原因后,Abort处理程序均会执行以下指令从中止模式返回,无论是在ARM状态还是Thumb状态:SUBSPC,R14_abt,#4;指令预取中止SUBSPC,R14_abt,#8;数据中止以上指令恢复PC(从R14_abt)和CPSR(从SPSR_abt)的值,并重新执行中止的指令。16SoftwareInterupt(软件中断)软件中断指令(SWI)用于进入管理模式,常用于请求执行特定的管理功能。软件中断处理程序执行以下指令从SWI模式返回,无论是在ARM状态还是Thumb状态:MOVSPC,R14_svc以上指令恢复PC(从R14_svc)和CPSR(从SPSR_svc)的值,并返回到SWI的下一条指令。17UndefinedInstruction(未定义指令)当ARM处理器遇到不能处理的指令时,会产生未定义指令异常。采用这种机制,可以通过软件仿真扩展ARM或Thumb指令集。在仿真未定义指令后,处理器执行以下程序返回,无论是在ARM状态还是Thumb状态:MOVSPC,R14_und以上指令恢复PC(从R14_und)和CPSR(从SPSR_und)的值,并返回到未定义指令后的下一条指令。18异常进入/退出小节下表总结了进入异常处理时保存在相应R14中的PC值,及在退出异常处理时推荐使用的指令。返回指令以前的状态备注ARMR14_xThumbR14_xBLMOVPC,R14PC+4PC+21SWIMOVSPC,R14_svcPC+4PC+21UDEFMOVSPC,R14_undPC+4PC+21FIQSUBSPC,R14_fiq,#4PC+4PC+42IRQSUBSPC,R14_irq,#4PC+4PC+42PABTSUBSPC,R14_abt,#4PC+4PC+41DABTSUBSPC,R14_abt,#8PC+8PC+83RESETNA--4备注:1--在此PC应是具有预取中止的BL/SWI/未定义指令所取的地址。2--在此PC是从FIQ或IRQ取得不能执行的指令的地址。3--在此PC是产生数据中止的加载或存储指令的地址。4--系统复位时,保存在R14_svc中的值是不可预知的。19异常优先级(ExceptionPriorities)当多个异常同时发生时,系统根据固定的优先级决定异常的处理次序。异常优先级由高到低的排列次序如下表所示。优先级异常1(最高)复位2数据中止3FIQ4IRQ5预取指令中止6(最低)未定义指令、SWI205.3指令