版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
高等教育编程模型与指令系统第1页/共113页2023/5/624.1ARM微处理器的工作模式(续)ARM微处理器支持7种工作模式Supervisor-管理模式(svc)操作系统使用的保护模式复位、软中断调用(SWI)Abort-中止模式(abt)当数据或指令预取中止时进入该模式可用于虚拟存储及存储保护Undefined-未定义指令模式(und)当未定义的指令执行时进入该模式可用于支持硬件协处理器的软件仿真第2页/共113页2023/5/634.1ARM微处理器的工作模式(续)特权模式除用户模式以外,其余6种模式称之为特权模式(PrivilegedModes)当处理器运行在用户模式下时,某些被保护的系统资源是不能被访问的异常模式除去用户模式和系统模式以外的5种又称为异常模式(ExceptionModes)常用于处理中断或异常,以及需要访问受保护的系统资源等情况第3页/共113页2023/5/644.1ARM微处理器的工作模式(续)工作模式的改变通过软件改变系统调用通过外部中断或异常处理改变外部中断:IRQ、FIQ来自中断控制器异常处理来自CPU内部第4页/共113页2023/5/654.1ARM微处理器的工作模式(续)工作模式的改变举例SWI软件中断指令SWI0x0 ;调用0号软中断SWI0x12 ;调用12号软中断IRQ外部中断__irqvoidHandlerTIMER5(void){timeval++; //当前时刻递增
pIC->I_ISPC=INT_TIMER5;//清除中断请求位}第5页/共113页2023/5/664.2ARM微处理器的工作状态ARM微处理器的工作状态一般有两种第一种为ARM状态处理器执行32位的ARM指令ARM指令要求字对齐第二种为Thumb状态处理器执行16位的Thumb指令Thumb指令要求半字对齐第6页/共113页2023/5/674.2ARM微处理器的工作状态(续)工作状态切换在程序的执行过程中,处理器可以随时在两种工作状态之间切换处理器工作状态的转变并不影响处理器的工作模式和相应寄存器中的内容ARM微处理器在开始执行代码时总是处于ARM状态也就是复位后进入ARM状态第7页/共113页2023/5/684.2ARM微处理器的工作状态(续)工作状态切换方法进入Thumb状态执行BX指令BX:带状态切换的跳转指令当操作数寄存器的最低位[0]为1时,可以使微处理器从ARM状态切换到Thumb状态BXR0 ;R0的最低位[0]为1处理器工作在Thumb状态,如果发生异常并进入异常处理子程序,则异常处理完毕返回时,自动从ARM状态切换到Thumb状态第8页/共113页2023/5/694.2ARM微处理器的工作状态(续)工作状态切换方法进入ARM状态执行BX指令BX:带状态切换的跳转指令当操作数寄存器的最低位[0]为0时,可以使微处理器从Thumb状态切换到ARM状态BXR0 ;R0的最低位[0]为0处理器工作在Thumb状态,如果发生异常并进入异常处理子程序,则进入时处理器自动从Thumb状态切换到ARM状态第9页/共113页2023/5/6104.2ARM微处理器的工作状态(续)工作状态切换举例B LabelCMP R1,#0BEQ LabelADRL R0,ThumbFun+1BX R0BLX LabelBLX:下一条指令地址送往LR寄存器;Label送往PC,并完成状态切换第10页/共113页2023/5/6114.3ARM体系结构的寄存器组织ARM处理器的寄存器37个32位寄存器31个通用寄存器6个状态寄存器这些寄存器不能被同时访问取决于处理器的工作状态工作模式第11页/共113页2023/5/6124.3ARM体系结构的寄存器组织1ARM状态下的寄存器组织2Thumb状态下的寄存器组织3程序状态寄存器第12页/共113页2023/5/6131ARM状态下的寄存器组织通用寄存器通用寄存器包括R0~R15可以分为三类未分组寄存器R0~R7分组寄存器R8~R14程序计数器R15(PC)第13页/共113页2023/5/6141ARM状态下的寄存器组织(续)未分组寄存器R0~R7在所有的工作模式下,每个未分组寄存器都指向对应的一个物理寄存器在中断或异常处理进行工作模式转换时,由于不同的处理器工作模式均使用相同的物理寄存器,可能会造成寄存器中数据的破坏第14页/共113页2023/5/6151ARM状态下的寄存器组织(续)分组寄存器R8~R14R8~R12每个寄存器对应2个不同的物理寄存器当使用FIQ模式时,访问R8_fiq~R12_fiq当使用其他模式时,访问R8_usr~R12_usrR13、R14每个寄存器对应6个不同的物理寄存器其中一个寄存器是用户模式与系统模式共用另外5个物理寄存器对应于其他5种不同的工作模式第15页/共113页2023/5/6161ARM状态下的寄存器组织(续)不同物理寄存器的区分R13_<mode>R14_<mode>mode为:usr、fiq、irq、svc、abt、und例如:R13_usr、R13_fiq、R13_irqR14_svc、R14_abt、R14_und第16页/共113页2023/5/6171ARM状态下的寄存器组织(续)R13寄存器常用作堆栈指针SP(StackPointer),一种习惯用法也可使用其他的寄存器作为堆栈指针在Thumb指令集中,某些指令强制使用R13作为堆栈指针在应用程序初始化时,一般都要初始化每种模式下的R13,使其指向该工作模式的栈空间第17页/共113页2023/5/6181ARM状态下的寄存器组织(续)R14寄存器也称链接寄存器LR(LinkRegister)当执行BL子程序调用指令时,R14中得到R15(程序计数器PC)的备份BLLabel;下一条指令地址LR,LabelPC当发生中断或异常时,对应的分组寄存器R14_svc、R14_irq、R14_fiq、R14_abt和R14_und用来保存R15的返回值其他情况下,R14用作通用寄存器第18页/共113页2023/5/6191ARM状态下的寄存器组织(续)R14寄存器常用情形1、常用用法(子程序返回)MOV PC,LR BX LR2、在子程序入口处使用以下指令将R14存入堆栈STMFD SP!,{<Regs>,LR}使用以下指令可以完成子程序返回LDMFD SP!,{<Regs>,PC}第19页/共113页2023/5/61ARM状态下的寄存器组织(续)R15寄存器R15寄存器用作程序计数器(PC)在ARM状态下,位[1:0]为0,位[31:2]用于保存PC在Thumb状态下,位[0]为0,位[31:1]用于保存PC由于ARM体系结构采用了多级流水结构,对于ARM指令集而言,PC总是指向当前执行指令的下两条指令的地址,即PC的值为当前执行指令的地址值加8个字节R15也可用作通用寄存器,但一般不这么使用因为对R15的使用有一些特殊的限制,当违反了这些限制时,程序的执行结果是未知的第20页/共113页2023/5/6211ARM状态下的寄存器组织(续)CPSR寄存器用作CPSR(CurrentProgramStatusRegister)CPSR可在任何工作模式下被访问,它包括条件标志位、中断禁止位、当前处理器模式标志位,以及其他一些相关的控制和状态位异常模式下有一个专用的物理状态寄存器,称为SPSR(SavedProgramStatusRegister)当异常发生时,SPSR用于保存CPSR的当前值,从异常退出时则可由SPSR来恢复CPSR用户模式和系统模式不属于异常模式,没有SPSR第21页/共113页2023/5/6©国防科技大学计算机学院601室22第22页/共113页2023/5/6232Thumb状态下的寄存器组织Thumb状态下的寄存器集是ARM状态下寄存器集的一个子集程序可以直接访问8个通用寄存器(R7~R0)程序计数器(PC)堆栈指针(SP)连接寄存器(LR)CPSR在每一种异常模式下都有一组SP、LR和SPSR第23页/共113页2023/5/624第24页/共113页2023/5/6©国防科技大学计算机学院601室25两种工作状态下寄存器比较第25页/共113页2023/5/6263程序状态寄存器程序状态寄存器的构成一个当前程序状态寄存器(CPSR)五个备份程序状态寄存器(SPSR)备份的程序状态寄存器用来进行异常处理程序状态寄存器的功能保存ALU中的当前操作信息控制允许和禁止中断设置处理器的工作模式第26页/共113页2023/5/6273程序状态寄存器(续)第27页/共113页2023/5/6283程序状态寄存器(续)条件码标志(ConditionCodeFlags)N、Z、C、V均为条件码标志位它们的内容可被算术或逻辑运算的结果所改变,并且可以决定某条指令是否被执行在ARM状态下,绝大多数的指令都是有条件执行的在Thumb状态下,仅有分支指令B是有条件执行的第28页/共113页2023/5/6293程序状态寄存器(续)实例C代码: if(a>b)a++;elseb++;Thumb代码: CMP R0,R1
BHI A_ADD
ADD R1,R1,#1
B OVERA_ADD ADD R0,R0,#1OVER ……ARM代码: CMP R0,R1
ADDHI R0,R0,#1
ADDLS R1,R1,#1第29页/共113页2023/5/6303程序状态寄存器(续)标志位N当用两个补码表示的带符号数进行运算时N=1表示运算结果为负数N=0表示运算结果为正数或零标志位ZZ=1表示运算结果为零;Z=0表示运算结果为非零标志位V对于加/减法运算指令,当操作数和运算结果为补码表示的带符号数时,V=1表示符号位溢出对于其他的非加/减运算指令,V的值通常不改变第30页/共113页2023/5/6313程序状态寄存器(续)标志位C加法运算(包括比较指令CMN):当运算结果产生了进位时(无符号数溢出),C=1,否则C=0减法运算(包括比较指令CMP):当运算时产生了借位(无符号数溢出),C=1,否则C=0对于包含移位操作的非加/减运算指令,C为移出值的最后一位对于其他的非加/减运算指令,C的值通常不改变第31页/共113页2023/5/6323程序状态寄存器(续)中断禁止位I和FI=1禁止IRQ中断;I=0允许IRQ中断F=1禁止FIQ中断;F=0允许IRQ中断运行状态控制位T对于ARMv5及以上的T系列处理器,当该位为1时,程序运行于Thumb状态,否则运行于ARM状态对于ARMv5及以上的非T系列处理器,当该位为1时,执行下一条指令以引起未定义指令异常;当该位为0时,表示运行于ARM状态工作模式位M[4:0]这些位决定了处理器的工作模式第32页/共113页2023/5/633M[4:0]处理器模式可访问的寄存器0b10000用户PC,CPSR,R0-R140b10001FIQPC,CPSR,SPSR_fiq,R14_fiq~R8_fiq,R7~R00b10010IRQPC,CPSR,SPSR_irq,R14_irq,R13_irq,R12~R00b10011管理PC,CPSR,SPSR_svc,R14_svc,R13_svc,R12~R00b10111中止PC,CPSR,SPSR_abt,R14_abt,R13_abt,R12~R00b11011未定义PC,CPSR,SPSR_und,R14_und,R13_und,R12~R00b11111系统PC,CPSR(ARMv4及以上版本),R14~R03程序状态寄存器(续)第33页/共113页2023/5/634本讲小结目的与要求掌握ARM处理器的工作模式、工作状态、ARM状态下的寄存器组织熟悉Thumb状态下的寄存器组织、程序状态寄存器重点与难点工作模式寄存器组织第34页/共113页2023/5/6354.4ARM微处理器的数据类型字、半字、字节字(Word):字的长度为32位半字(Half-Word):半字的长度为16位字节(Byte):字节的长度为8位ARM微处理器要求自然对齐字需要4字节对齐地址的低两位为0半字需要2字节对齐地址的最低位为0字节则是任意地址对齐
第35页/共113页2023/5/6364.4ARM微处理器的数据类型(续)边界对齐(数据存储)如果一个数据是从偶地址开始的连续存储,那么它就是半字对齐,否则就是非半字对齐如果一个数据是以能被4整除的地址开始的连续存储,那么它就是字对齐,否则就是非字对齐方式半字对齐字对齐地址0x000000000x000000020x00000004……0x000000000x000000040x00000008……特征Bit0=0Bit1=0,Bit0=0第36页/共113页2023/5/6374.4ARM微处理器的数据类型(续)ARM体系结构的存储结构从零地址开始的以字节为单位的线性组合从零字节到三字节放置第一个存储的字数据,从第四个字节到第七个字节放置第二个存储的字数据,依次排列作为32位的微处理器,ARM体系结构所支持的最大寻址空间为4GB(232字节)受到物理地址线的限制,一般实际嵌入式处理器最大寻址空间为几百兆第37页/共113页2023/5/6384.4ARM微处理器的数据类型(续)ARM体系结构可以用两种方法存储字数据大端格式(Bigendian)字数据的高字节存储在低地址中字数据的低字节存放在高地址中小端格式(Littleendian)与大端存储格式相反低地址中存放的是字数据的低字节高地址中存放的是字数据的高字节第38页/共113页2023/5/639大端格式(Bigendian)第39页/共113页2023/5/640小端格式(Littleendian)第40页/共113页2023/5/641举例1程序LDRR0,=0x11223344LDRR1,=0x00000100STRR0,[R1]LDRBR2,[R1]R2=?答案小端模式:R2=0x44大端模式:R2=0x11LDR伪指令,使用以下项之一加载寄存器:一个32位常数值一个地址LDR伪指令的形式:LDR
Rn,=expr;=而非#第41页/共113页2023/5/6424.5ARM微处理器的异常状态当正常的程序执行流程发生暂时的停止时,称之为异常(Exception)例如处理一个外部的中断请求在处理异常之前,当前处理器的状态必须保留,这样当异常处理完成之后,当前程序可以继续执行处理器允许多个异常同时发生,它们将会按固定的优先级进行处理中断优先级中断嵌套第42页/共113页2023/5/643异常类型具体含义复位当处理器的复位电平有效时,产生复位异常,程序跳转到复位异常处理程序处执行未定义指令当ARM处理器或协处理器遇到不能处理的指令时,产生未定义指令异常。可使用该异常机制进行软件仿真软件中断该异常由执行SWI指令产生,可用于用户模式下的程序调用特权操作指令。可使用该异常机制实现系统功能调用指令预取中止若处理器预取指令的地址不存在,或该地址不允许当前指令访问,存储器会向处理器发出中止信号,但当预取的指令被执行时,才会产生指令预取中止异常数据中止若处理器数据访问的地址不存在,或该地址不允许当前指令访问时,产生数据中止异常IRQ(外部中断请求)当处理器的外部中断请求引脚有效,且CPSR中的I位为0时,产生IRQ异常。系统的外设可通过该异常请求中断服务FIQ(快速中断请求)当处理器的快速中断请求引脚有效,且CPSR中的F位为0时,产生FIQ异常第43页/共113页2023/5/6444.5ARM微处理器的异常状态(续)1对异常的响应2从异常返回3各类异常的具体描述4异常向量5异常优先级6应用程序中的异常处理第44页/共113页2023/5/6451对异常的响应当出现异常后,ARM处理器会执行以下操作1将CPSR复制到相应的SPSR中2对CPSR进行设置根据异常类型,强制设置CPSR的工作模式位设置中断禁止位,以禁止中断发生如果处理器处于Thumb状态,则切换到ARM状态3将下一条指令的地址存入相应链接寄存器LRLR中保存的是下一条指令的地址(当前执行指令地址+4或+8,与异常类型有关)4强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处第45页/共113页2023/5/6461对异常的响应(续)ARM处理器对异常的响应过程用伪码描述为SPSR_<Exception_Mode>=CPSRCPSR[4:0]=ExceptionModeNumberCPSR[5]=0 ;切换到ARM工作状态If<Exception_Mode>==ResetorFIQthen CPSR[6]=1 ;禁止新的FIQ异常
CPSR[7]=1 ;禁止新的IRQ异常R14_<Exception_Mode>=ReturnLinkPC=ExceptionVectorAddress
CPU自动完成第46页/共113页2023/5/647程序AIRQ服务程序系统模式IRQ模式程序寄存器组程序在系统模式下运行用户程序,假定当前处理器状态为Thumb状态、允许IRQ中断用户程序运行时发生IRQ中断,硬件完成以下动作:LR_sysSPSR_irqLR_irqLRPCCPSRSPSRSYS1?0...????MODTFI...NZCV置位I位(禁止IRQ中断)清零T位(进入ARM状态)设置MOD位,切换处理器模式至IRQ模式将下一条指令的地址存入IRQ模式的LR寄存器将CPSR寄存器内容存入IRQ模式的SPSR寄存器将跳转地址存入PC,实现跳转IRQ0?1...????BackAddrJumpAddrJumpSYS1?0...????“?”表示对该位不关心第47页/共113页2023/5/6482从异常返回异常处理完毕之后,ARM微处理器会执行以下几步操作从异常返回1、将SPSR复制回CPSR中2、将链接寄存器LR的值减去相应偏移量后送到PC中注意复位异常处理程序不需要返回编程(指令)完成第48页/共113页2023/5/649在异常处理结束后,异常处理程序完成以下动作:程序AIRQ服务程序系统模式IRQ模式程序寄存器组LR_sysSPSR_irqLR_irqLRPCCPSRSPSRSYS1?0...????MODTFI...NZCV将SPSR寄存器的值复制回CPSR寄存器;将LR寄存的值减去一个常量后复制到PC寄存器,跳转到被中断的用户程序。IRQ0?1...????BackAddrJumpAddrreturnSYS1?0...????SYS1?0...????BackAddr-4Jump“?”表示对该位不关心第49页/共113页2023/5/6503各类异常的具体描述复位的响应过程SPSR_svc=CPSR(不可预知)CPSR[4:0]=0b10011CPSR[5]=0 ;切换到ARM工作状态CPSR[6]=1 ;禁止新的FIQ异常 CPSR[7]=1 ;禁止新的IRQ异常R14_svc=ReturnLink(不可预知)PC=0x00000000
第50页/共113页2023/5/6513各类异常的具体描述(续)UndefinedInstruction(未定义指令)当ARM处理器遇到不能处理的指令时,会产生未定义指令异常采用这种机制,可以通过软件仿真扩展ARM或Thumb指令集在未定义指令处理程序中执行以下指令返回MOVSPC,R14_und恢复PC(从R14_und)和CPSR(从SPSR_und)的值,并返回到未定义指令后的下一条指令
指令加后缀“S”且目的寄存器为PC则自动复制第51页/共113页2023/5/6523各类异常的具体描述(续)未定义指令异常的响应过程SPSR_und=CPSRCPSR[4:0]=0b11011CPSR[5]=0 ;切换到ARM工作状态//CPSR[6]保持不变 CPSR[7]=1 ;禁止新的IRQ异常R14_und=ReturnLinkPC=0x00000004第52页/共113页2023/5/6533各类异常的具体描述(续)SoftwareInterrupt(软件中断)软件中断指令(SWI)用于进入管理模式,常用于请求执行特定的管理功能在ARM上写的操作系统典型的使用SWI来为编程者提供各种例程在软件中断处理程序中执行以下指令返回MOVSPC,R14_svc恢复PC(从R14_svc)和CPSR(从SPSR_svc)的值,并返回到SWI的下一条指令指令加后缀“S”且目的寄存器为PC则自动复制第53页/共113页2023/5/6543各类异常的具体描述(续)SWI的响应过程SPSR_svc=CPSRCPSR[4:0]=0b10011CPSR[5]=0 ;切换到ARM工作状态//CPSR[6]保持不变 CPSR[7]=1 ;禁止新的IRQ异常R14_svc=ReturnLinkPC=0x00000008
第54页/共113页2023/5/6553各类异常的具体描述(续)ABORT(中止)产生中止异常意味着对存储器的访问失败中止异常包括两种类型:指令预取中止:发生在指令预取时数据中止:发生在数据访问时当确定中止原因后,Abort处理程序执行以下指令返回SUBSPC,R14_abt,#4 ;指令预取中止SUBSPC,R14_abt,#8 ;数据中止恢复PC(从R14_abt)和CPSR(从SPSR_abt)的值,并重新执行产生中止的指令(返回当前指令)第55页/共113页2023/5/6563各类异常的具体描述(续)中止异常的响应过程SPSR_abt=CPSRCPSR[4:0]=0b10111CPSR[5]=0 ;切换到ARM工作状态//CPSR[6]保持不变 CPSR[7]=1 ;禁止新的IRQ异常R14_abt=ReturnLinkPC=0x0000000c/0x00000010第56页/共113页2023/5/6573各类异常的具体描述(续)IRQ(InterruptRequest)IRQ异常属于正常的中断请求,IRQ优先级低于FIQ若CPSR的I位置1,则禁止IRQ中断,若CPSR的I位清零,处理器会在指令执行完之前检查IRQ的输入注意只有在特权模式下才能改变I位的状态IRQ处理程序执行以下指令返回SUBSPC,R14_irq,#4该指令将寄存器R14_irq的值减去4后,复制到程序计数器PC中,同时将SPSR_irq寄存器的内容复制到CPSR中,并返回到引起中断的下一条指令第57页/共113页2023/5/6583各类异常的具体描述(续)IRQ的响应过程SPSR_irq=CPSRCPSR[4:0]=0b10010CPSR[5]=0 ;切换到ARM工作状态//CPSR[6]保持不变 CPSR[7]=1 ;禁止新的IRQ异常R14_irq=ReturnLinkPC=0x00000018第58页/共113页2023/5/6593各类异常的具体描述FIQ(FastInterruptRequest)FIQ异常是为了支持数据传输或者通道处理而设计的若将CPSR的F位置1,则禁止FIQ中断,若将CPSR的F位清零,处理器会在指令执行时检查FIQ的输入注意只有在特权模式下才能改变F位的状态FIQ处理程序执行以下指令返回SUBSPC,R14_fiq,#4该指令将寄存器R14_fiq的值减去4后,复制到程序计数器PC中,同时将SPSR_fiq寄存器的内容复制到CPSR中,并返回到引起中断的下一条指令第59页/共113页2023/5/6603各类异常的具体描述(续)FIQ的响应过程SPSR_fiq=CPSRCPSR[4:0]=0b10001CPSR[5]=0 ;切换到ARM工作状态CPSR[6]=1 ;禁止新的FIQ异常 CPSR[7]=1 ;禁止新的IRQ异常R14_fiq=ReturnLinkPC=0x0000001c第60页/共113页2023/5/6613各类异常的具体描述(续)返回指令R14_x先前的值BLMOVPC,R14下一条指令地址未定义指令MOVSPC,R14_und下一条指令地址SWIMOVSPC,R14_svc下一条指令地址指令预取SUBSPC,R14_abt,#4下一条指令地址数据预取SUBSPC,R14_abt,#8下一条指令地址+4IRQSUBSPC,R14_irq,#4下一条指令地址+4FIQSUBSPC,R14_fiq,#4下一条指令地址+4复位N/A-第61页/共113页2023/5/6624异常向量(ExceptionVectors)地址异常进入模式0x0000,0000复位管理模式0x0000,0004未定义指令未定义模式0x0000,0008软件中断管理模式0x0000,000C中止(预取指令)中止模式0x0000,0010中止(数据)中止模式0x0000,0014保留保留0x0000,0018IRQIRQ0x0000,001CFIQFIQ第62页/共113页2023/5/6634异常向量(续);ExceptionVectors;MappedtoAddress0.;Absoluteaddressingmodemustbeused.VectorsLDRPC,Reset_Address
LDRPC,Undef_Address
LDRPC,SWI_Address
LDRPC,PAbt_Address
LDRPC,DAbt_Address
NOP
;ReservedVector
LDRPC,IRQ_Address
LDRPC,FIQ_Address第63页/共113页2023/5/6645异常优先级(ExceptionPriorities)优先级异常1(最高)复位2数据中止3FIQ4IRQ5预取指令中止6(最低)未定义指令、SWI第64页/共113页2023/5/6656应用程序中的异常处理应用程序首先要进行异常处理当系统运行时,异常可能会随时发生,因此要保证在发生异常时ARM处理器不至于处于未知状态采用的方式是在异常向量表中的特定位置放置一条跳转指令,跳转到异常处理程序异常处理过程当发生异常时,程序计数器PC会被强制(自动)设置为对应的异常向量,从而(自动)跳转到异常处理程序,当异常处理完成以后,返回到主程序继续执行第65页/共113页2023/5/666/***********************************************程序段说明:以下函数为各异常模式服务子程序。设成死循环是为调试用,一旦发生此类异常,程序便跳入异常模式服务子程序,终止程序运行。*************************************************/voidHaltUndef(void) //未定义——程序跑飞{Uart_Printf(0,"theprogrammishaltUndefed");
while(1);}voidHaltSwi(void) //软中断{Uart_Printf(0,"theprogrammishaltSWI");
while(1);}第66页/共113页2023/5/667voidHaltPabort(void) //预取指令中止{Uart_Printf(0,"theprogrammishaltPaborted");
while(1);}voidHaltDabort(void) //数据中止——程序跑飞{Uart_Printf(0,"theprogrammishaltdaborted");
while(1);}voidHaltFIQ(void) //快速中断{Uart_Printf(0,"theprogrammishaltdFIQ");
while(1);}第67页/共113页2023/5/668;异常向量表;ExceptionVectors;MappedtoAddress0.;Absoluteaddressingmodemustbeused.VectorsLDRPC,HandleReset
LDRPC,HaltUndef
LDRPC,HaltSwi
LDRPC,HaltPabort
LDRPC,HaltDabort
NOP
;ReservedVector
LDRPC,HandleIRQ
LDRPC,HaltFIQ第68页/共113页2023/5/669本讲小结目的与要求掌握数据类型、异常向量表和异常程序设计熟悉边界对齐、大小端格式了解ARM处理器的异常处理机制重点与难点数据类型、异常向量表和异常程序设计边界对齐、异常程序设计第69页/共113页2023/5/670ARM微处理器的指令系统一、ARM微处理器的寻址方式二、ARM微处理器的指令集概述三、ARM指令集四、Thumb指令集第70页/共113页2023/5/671一、ARM微处理器的寻址方式寻址方式就是处理器根据指令中给出的地址信息来寻找物理地址的方式ARM指令系统的寻址方式1立即寻址2寄存器寻址3寄存器间接寻址4基址寻址5相对寻址6多寄存器寻址7堆栈寻址第71页/共113页2023/5/6721立即寻址立即寻址也叫立即数寻址这是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数。这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址例如ADD R0,R0,#1 ;R0←R0+1ADD R0,R0,#0x3f ;R0←R0+0x3f在以上两条指令中,第二个源操作数即为立即数,要求以“#”为前缀,对于以十六进制表示的立即数,还要求在“#”后加上“0x”或“&”立即数一般为8位(超过8位使用伪指令LDR)第72页/共113页2023/5/6732寄存器寻址寄存器寻址就是利用寄存器中的数值作为操作数这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式例如ADDR0,R1,R2 ;R0←R1+R2该指令的执行效果是将寄存器R1和R2的内容相加,其结果存放在寄存器R0中第73页/共113页2023/5/6743寄存器间接寻址寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中例如ADDR0,R1,[R2] ;R0←R1+[R2]LDRR0,[R1] ;R0←[R1]STR
R0,[R1]
;[R1]←R0在第一条指令中,以寄存器R2的值作为操作数的地址,在存储器中取得一个操作数后与R1相加,结果存入寄存器R0中LDR/STR:左寄存器,右存储器第74页/共113页2023/5/6754基址寻址基址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址基址寻址方式常用于访问某基地址附近的单元采用基址寻址方式的指令常见有以下几种形式LDRR0,[R1,#4];R0←[R1+4]LDRR0,[R1,#4]!;R0←[R1+4]、R1←R1+4LDRR0,[R1],#4;R0←[R1]、R1←R1+4LDRR0,[R1,R2];R0←[R1+R2]第75页/共113页2023/5/6765相对寻址相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址以下程序段完成子程序的调用和返回,跳转指令BL采用了相对寻址方式
BLSORT ;跳转到子程序处执行
……SORT……
MOVPC,LR ;从子程序返回
第76页/共113页2023/5/6776多寄存器寻址采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送,最多传送16个通用寄存器的值例如LDMIAR0!,{R1,R2,R3,R4};R1←[R0],R0=R0+4
;R2←[R0],R0=R0+4
;R3←[R0],R0=R0+4
;R4←[R0],R0=R0+4指令后缀IA表示在每次执行操作后R0按字长度增加注意:在寄存器列表中同一寄存器仅能指定一次;加载/存储操作按照寄存器固定次序进行,所以寄存器排列先后关系随意LDM/STM:左存储器,右寄存器STMIA
SP!,{R0,R1}LDMIA
SP!,{R1,R0}第77页/共113页2023/5/6787堆栈寻址堆栈按先进后出(FILO)的方式工作根据堆栈指针指向来分堆栈指针指向最后一个压入堆栈的数据时,称为满堆栈堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈根据堆栈的生成方式堆栈指针递增计数——递增堆栈堆栈指针递减计数——递减堆栈第78页/共113页2023/5/6797堆栈寻址(续)ARM微处理器支持这四种类型的堆栈工作方式满递增堆栈:堆栈指针指向最后压入的数据,且由低地址向高地址生成—{LDMFA,STMFA}满递减堆栈:堆栈指针指向最后压入的数据,且由高地址向低地址生成—{LDMFD,STMFD}空递增堆栈:堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成—{LDMEA,STMEA}空递减堆栈:堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成—{LDMED,STMED}STMFDSP!,{R0-R7,LR}—LR最先进栈,R0最后LDMFDSP!,{R0-R7,PC}—R0最先出栈,PC最后STMFDSP!,{R0-R7,LR}LDMFDSP!,{PC,R0-R7}第79页/共113页2023/5/680二、ARM微处理器的指令集概述ARM微处理器的指令集是Load/Store型注意:可以使用间接寻址等方式访问存储器,注意和纯RISC处理器的区别1指令格式2指令助记符3指令条件域第80页/共113页2023/5/6811指令格式<opcode>{<cond>}{S}<Rd>,<Rn>{,operand2}opcode: 指令助记符,如ADD,LDR,STRcond: 执行条件,如NE,EQS: 是否影响CPSR的值Rd: 目标寄存器Rn: 第一操作数寄存器operand2: 第二操作数灵活使用第二操作数能够提高代码质量例子:ADDEQSR0,R1,#0x3f第81页/共113页2023/5/682助记符指令功能描述ADC带进位加法指令ADD加法指令AND逻辑与指令B跳转指令BIC位清零指令BL带返回的跳转指令BLX带返回和状态切换的跳转指令BX带状态切换的跳转指令CDP协处理器数据操作指令CMN取负比较指令CMP比较指令2指令助记符第82页/共113页2023/5/683助记符指令功能描述EOR异或指令LDC存储器到协处理器的数据传输指令LDM加载多个寄存器指令LDR存储器到寄存器的数据传输指令MCR从ARM寄存器到协处理器寄存器的数据传输指令MLA乘加运算指令MOV数据传送指令MRC从协处理器寄存器到ARM寄存器的数据传输指令MRS传送CPSR或SPSR的内容到通用寄存器指令MSR传送通用寄存器到CPSR或SPSR的指令MUL32位乘法指令MVN数据取负传送指令第83页/共113页2023/5/684助记符指令功能描述ORR逻辑或指令RSB反向减法指令RSC带借位的反向减法指令SBC带借位减法指令STC协处理器寄存器写入存储器指令STM批量内存字写入指令STR寄存器到存储器的数据传输指令SUB减法指令SWI软件中断指令SWP交换指令TEQ相等测试指令TST位测试指令第84页/共113页2023/5/6853指令条件域条件执行当处理器工作在ARM状态时,几乎所有的指令均根据CPSR中条件码的状态和指令的条件域有条件的执行当指令的执行条件满足时,指令被执行,否则忽略条件码每一条ARM指令包含4位的条件码,位于指令码的最高4位[31:28]条件码共有15种,每种条件码可用两个字符表示,这两个字符可添加在指令助记符的后面第85页/共113页2023/5/686条件码助记符后缀标志含义0000EQZ=1相等0001NEZ=0不相等0010CSC=1无符号数大于或等于0011CCC=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忽略无条件执行第86页/共113页2023/5/6873指令条件域(续)实例
C代码: if(a>b)a++;elseb++; ARM代码:CMP R0,R1
ADDHI R0,R0,#1
ADDLS R1,R1,#1 C代码: if((a!=10)&&(b!=20))a=a+b; ARM代码:CMP R0,#10
CMPNE R1,#20
ADDNE R0,R0,R1if((a==10)&&(b!=20)) a=a+b;CMPR0,#10CMPEQR1,#20ADDNER0,R0,R1?第87页/共113页2023/5/688三、ARM指令集1跳转指令2数据处理指令3乘法指令与乘加指令4程序状态寄存器访问指令5加载/存储指令6数据交换指令7移位指令8协处理器指令9异常产生指令第88页/共113页2023/5/6891跳转指令在ARM程序中有两种方法可以实现程序的跳转直接向程序计数器PC写入跳转地址值可以实现在4GB的地址空间中的任意跳转MOVPC,R14使用专门的跳转指令跳转指令包括以下4条指令B 跳转指令BL 带返回的跳转指令BX 带状态切换的跳转指令BLX 带返回和状态切换的跳转指令第89页/共113页2023/5/6902数据处理指令数据处理指令可分为数据传送指令、算术逻辑运算指令和比较指令数据传送指令进行数据的传输MOVMVN比较指令不保存运算结果,只更新CPSR中相应的条件标志位算术逻辑运算指令完成常用的算术与逻辑的运算该类指令不但将运算结果保存在目的寄存器中,同时更新CPSR中的相应条件标志位第90页/共113页2023/5/6912数据处理指令(续)数据处理指令MOV 数据传送指令 MVN 数据取负传送指令CMP 比较指令 CMN 取负比较指令TST 位测试指令 TEQ 相等测试指令ADD 加法指令 ADC 带进位加法指令SUB 减法指令 SBC 带借位减法指令RSB 反向减法指令 RSC 带借位反向减法指令AND 逻辑与指令 ORR 逻辑或指令EOR 逻辑异或指令 BIC 位清除指令第91页/共113页2023/5/6923乘法指令与乘加指令ARM微处理器支持的乘法指令与乘加指令有6条可分为运算结果为32位和运算结果为64位两类与前面的数据处理指令不同,指令中的所有操作数、目的寄存器必须为通用寄存器,不能对操作数使用立即数或被移位的寄存器目的寄存器和第一操作数必须是不同的寄存器
第92页/共113页2023/5/6933乘法指令与乘加指令(续)乘法指令与乘加指令(6条)MUL 32位乘法指令MULR0,R1,R2 ;R0=R1*R2MLA 32位乘加指令MLAR0,R1,R2,R3 ;R0=R1*R2+R3SMULL 64位有符号数乘法指令SMULLR0,R1,R2,R3 ;R0保存结果低32位
;R1保存结果高32位SMLAL 64位有符号数乘加指令UMULL 64位无符号数乘法指令UMLAL 64位无符号数乘加指令第93页/共113页2023/5/6944程序状态寄存器访问指令ARM微处理器支持程序状态寄存器访问指令用于在程序状态寄存器和通用寄存器之间传送数据程序状态寄存器访问指令包括以下两条MRS 程序状态寄存器到通用寄存器的数据传送指令MRSR0,CPSRMRSR0,SPSRMSR 通用寄存器到程序状态寄存器的数据传送指令MSRCPSR,R0MSRSPSR,R0第94页/共113页2023/5/6955加载/存储指令ARM微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据常用的加载存储指令如下LDR 字数据加载指令LDRB 字节数据加载指令LDRH 半字数据加载指令STR 字数据存储指令STRB 字节数据存储指令STRH 半字数据存储指令LDM 批量数据加载指令STM 批量数据存储指令LDR/STR:左寄存器,右存储器LDM/STM:左存储器,右寄存器记忆规律:
R表示寄存器
M表示存储器第95页/共113页2023/5/6966数据交换指令ARM微处理器所支持数据交换指令能在存储器和寄存器之间交换数据,数据交换指令有两条SWP 字数据交换指令SWPR0,R1,[R2] ;[R2]R0,R1[R2]SWPR0,R0,[R1] ;R0[R1]SWPB 字节数据交换指令(低8位)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 学游泳小学作文15篇
- 《打电话》教案汇编九篇
- 大学生实习报告(15篇)
- 2024年12月 《马克思主义基本原理概论》复习题
- 关于五年级单元作文300字10篇
- 2024年五年级语文上册 第一单元 语文园地一教学实录 新人教版
- 公司财务个人工作计划5篇
- 2019年资产负债表(样表)
- 转让协议书范文七篇
- 个人房屋租赁合同范文合集五篇
- 山东省潍坊市潍城区2023-2024学年六年级上学期期末语文试题
- 电玩城岗位流程培训方案
- 会计师事务所保密制度
- 复合机器人行业分析
- 建立进出校园安全控制与管理的方案
- 阿里菜鸟裹裹云客服在线客服认证考试及答案
- 水库防恐反恐应急预案
- 供应商管理培训资料课件
- 绿植租摆服务投标方案(完整技术标)
- 幼儿园优质公开课:大班科学《有趣的仿生》课件
- 通用短视频拍摄脚本模板
评论
0/150
提交评论