![第4章 ARM处理器编程模型与指令系统_第1页](http://file4.renrendoc.com/view/03aa78d8c4b3833fb09a2bd2c14784cb/03aa78d8c4b3833fb09a2bd2c14784cb1.gif)
![第4章 ARM处理器编程模型与指令系统_第2页](http://file4.renrendoc.com/view/03aa78d8c4b3833fb09a2bd2c14784cb/03aa78d8c4b3833fb09a2bd2c14784cb2.gif)
![第4章 ARM处理器编程模型与指令系统_第3页](http://file4.renrendoc.com/view/03aa78d8c4b3833fb09a2bd2c14784cb/03aa78d8c4b3833fb09a2bd2c14784cb3.gif)
![第4章 ARM处理器编程模型与指令系统_第4页](http://file4.renrendoc.com/view/03aa78d8c4b3833fb09a2bd2c14784cb/03aa78d8c4b3833fb09a2bd2c14784cb4.gif)
![第4章 ARM处理器编程模型与指令系统_第5页](http://file4.renrendoc.com/view/03aa78d8c4b3833fb09a2bd2c14784cb/03aa78d8c4b3833fb09a2bd2c14784cb5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章ARM处理器编程模型与指令系统第四章ARM处理器编程模型与指令系统
体系结构直接支持的数据类型ARM处理器支持下列数据类型:字节8位半字16位(必须分配为占用两个字节)字32位(必须分配为占用4各字节)1112342字节半字字4.1ARM微处理器的工作状态4.1ARM微处理器的工作状态从编程的角度看,ARM微处理器的工作状态一般有两种,并可在两种状态之间切换:ARM状态:此时处理器执行32位的字对齐的ARM指令Thumb状态:此时处理器执行16位的、半字对齐的Thumb指令4.1ARM微处理器的工作状态处理器状态使用BX指令将ARM7TDMI内核的操作状态在ARM状态和Thumb状态之间进行切换,程序如下所示。;从Arm状态切换到Thumb状态LDRR0,=Lable+1BXR0;从Thumb状态切换到ARM状态LDRR0,=LableBXR0地址最低位为1,表示切换到Thumb状态地址最低位为0,表示切换到ARM状态跳转地址标号处理器模式说明备注用户(usr)正常程序执行模式不能直接切换到其它模式系统(sys)运行操作系统的特权任务与用户模式类似,但具有可以直接切换到其它模式等特权快中断(fiq)支持高速数据传输及通道处理FIQ异常响应时进入此模式中断(irq)用于通用中断处理IRQ异常响应时进入此模式管理(svc)操作系统保护模式系统复位和软件中断响应时进入此模式中止(abt)用于支持虚拟内存和/或存储器保护在ARM7TDMI没有大用处未定义(und)支持硬件协处理器的软件仿真未定义指令异常响应时进入此模式处理器7种模式4.2ARM微处理器的运行模式特权模式(PrivilegedModes)处理器模式说明备注用户(usr)正常程序工作模式不能直接切换到其它模式系统(sys)用于支持操作系统的特权任务等与用户模式类似,但具有可以直接切换到其它模式等特权快中断(fiq)支持高速数据传输及通道处理FIQ异常响应时进入此模式中断(irq)用于通用中断处理IRQ异常响应时进入此模式管理(svc)操作系统保护代码系统复位和软件中断响应时进入此模式中止(abt)用于支持虚拟内存和/或存储器保护在ARM7TDMI没有大用处未定义(und)支持硬件协处理器的软件仿真未定义指令异常响应时进入此模式除用户模式外,其它模式均为特权模式。ARM内部寄存器和一些片内外设在硬件设计上只允许(或者可选为只允许)特权模式下访问。此外,特权模式可以自由的切换处理器模式,而用户模式不能直接切换到别的模式。未定义(und)中止(abt)管理(svc)中断(irq)快中断(fiq)系统(sys)4.2ARM微处理器的运行模式异常模式(ExceptionModes)处理器模式说明备注用户(usr)正常程序工作模式不能直接切换到其它模式系统(sys)用于支持操作系统的特权任务等与用户模式类似,但具有可以直接切换到其它模式等特权快中断(fiq)支持高速数据传输及通道处理FIQ异常响应时进入此模式中断(irq)用于通用中断处理IRQ异常响应时进入此模式管理(svc)操作系统保护代码系统复位和软件中断响应时进入此模式中止(abt)用于支持虚拟内存和/或存储器保护在ARM7TDMI没有大用处未定义(und)支持硬件协处理器的软件仿真未定义指令异常响应时进入此模式未定义(und)中止(abt)管理(svc)中断(irq)快中断(fiq)这五种模式称为异常模式。它们除了可以通过程序切换进入外,也可以由特定的异常进入。当特定的异常出现时,处理器进入相应的模式。每种异常模式都有一些独立的寄存器,以避免异常退出时用户模式的状态不可靠。4.2ARM微处理器的运行模式用户和系统模式处理器模式说明备注用户(usr)正常程序工作模式不能直接切换到其它模式系统(sys)用于支持操作系统的特权任务等与用户模式类似,但具有可以直接切换到其它模式等特权快中断(fiq)支持高速数据传输及通道处理FIQ异常响应时进入此模式中断(irq)用于通用中断处理IRQ异常响应时进入此模式管理(svc)操作系统保护代码系统复位和软件中断响应时进入此模式中止(abt)用于支持虚拟内存和/或存储器保护在ARM7TDMI没有大用处未定义(und)支持硬件协处理器的软件仿真未定义指令异常响应时进入此模式这两种模式都不能由异常进入,而且它们使用完全相同的寄存器组。系统模式是特权模式,不受用户模式的限制。操作系统在该模式下访问用户模式的寄存器就比较方便,而且操作系统的一些特权任务可以使用这个模式访问一些受控的资源。系统(sys)用户(usr)4.2ARM微处理器的运行模式4.3ARM体系结构的存储器格式ARM体系结构可以用两种方法存储字数据大端格式:字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。
4.3ARM体系结构的存储器格式ARM体系结构可以用两种方法存储字数据小端格式:与大端存储格式相反,在小端存储格式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。4.4寄存器组织4.4.1ARM状态下的寄存器组织通用寄存器:通用寄存器包括R0~R15,可以分为三类:未分组寄存器R0~R7分组寄存器R8~R14程序计数器PC(R15)寄存器类别寄存器在汇编中的名称各模式下实际访问的寄存器用户系统管理中止未定义中断快中断通用寄存器和程序计数器R0(a1)R0R1(a2)R1R2(a3)R2R3(a4)R3R4(v1)R4R5(v2)R5R6(v3)R6R7(v4)R7R8(v5)R8R8_fiq*R9(SB,v6)R9R9_fiq*R10(SL,v7)R10R10_fiq*R11(FP,v8)R11R11_fiq*R12(IP)R12R12_fiq*R13(SP)R13R13_svc*R13_abt*R13_und*R13_irq*R13_fiq*R14(LR)R14R14_svc*R14_abt*R14_und*R14_irq*R14_fiq*R15(PC)R15状态寄存器R16(CPSR)CPSRSPSR无SPSR_abtSPSR_abtSPSR_undSPSR_irqSPSR_fiqARM状态各模式下的寄存器寄存器类别寄存器在汇编中的名称各模式下实际访问的寄存器用户系统管理中止未定义中断快中断通用寄存器和程序计数器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_fiqSPSR_fiqSPSR_irqSPSR_undSPSR_abtSPSR_abtCPSRR15R14_fiqR14_irqR14_undR14_abtR14_svcR14R13_fiqR13_irqR13_undR13_abtR13_svcR13R12_fiqR12R11_fiqR11R10_fiqR10R9_fiqR9R8_fiqR8R7R6R5R4R3R2R1R0所有的37个寄存器,分成两大类:31个通用32位寄存器;6个状态寄存器。ARM状态各模式下的寄存器寄存器类别寄存器在汇编中的名称各模式下实际访问的寄存器用户系统管理中止未定义中断快中断通用寄存器和程序计数器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无CPSRR15R14R13R12R11R10R9R8R7R6R5R4R3R2R1R0用户无CPSRR15R14R13R12R11R10R9R8R7R6R5R4R3R2R1R0系统SPSR_abtCPSRR15R14_svcR13_svcR12R11R10R9R8R7R6R5R4R3R2R1R0管理SPSR_abtCPSRR15R14_abtR13_abtR12R11R10R9R8R7R6R5R4R3R2R1R0中止SPSR_undCPSRR15R14_undR13_undR12R11R10R9R8R7R6R5R4R3R2R1R0未定义SPSR_irqCPSRR15R14_irqR13_irqR12R11R10R9R8R7R6R5R4R3R2R1R0中断SPSR_fiqCPSRR15R14_fiqR13_fiqR12_fiqR11_fiqR10_fiqR9_fiqR8_fiqR7R6R5R4R3R2R1R0快中断ARM状态各模式下可以访问的寄存器寄存器类别寄存器在汇编中的名称各模式下实际访问的寄存器用户系统管理中止未定义中断快中断通用寄存器和程序计数器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_fiqR13_irqR13_undR13_abtR13_svcR13R12_fiqR12R11_fiqR11R10_fiqR10R9_fiqR9R8_fiqR8R7R6R5R4R3R2R1R0在汇编语言中寄存器R0~R13为保存数据或地址值的通用寄存器。它们是完全通用的寄存器,不会被体系结构作为特殊用途,并且可用于任何使用通用寄存器的指令。寄存器类别寄存器在汇编中的名称各模式下实际访问的寄存器用户系统管理中止未定义中断快中断通用寄存器和程序计数器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_fiqR13_fiqR13_irqR13_undR13_abtR13_svcR13R12_fiqR12R11_fiqR11R10_fiqR10R9_fiqR9R8_fiqR8R7R6R5R4R3R2R1R0R7R6R5R4R3R2R1R0其中R0~R7为未分组的寄存器,也就是说对于任何处理器模式,这些寄存器都对应于相同的32位物理寄存器。一般的通用寄存器寄存器类别寄存器在汇编中的名称各模式下实际访问的寄存器用户系统管理中止未定义中断快中断通用寄存器和程序计数器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_fiqR14_fiqR14_irqR14_undR14_abtR14_svcR14R13_fiqR13_irqR13_undR13_abtR13_svcR13R12_fiqR12R11_fiqR11R10_fiqR10R9_fiqR9R8_fiqR8寄存器R8~R14为分组寄存器。它们所对应的物理寄存器取决于当前的处理器模式,几乎所有允许使用通用寄存器的指令都允许使用分组寄存器一般的通用寄存器寄存器类别寄存器在汇编中的名称各模式下实际访问的寄存器用户系统管理中止未定义中断快中断通用寄存器和程序计数器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_fiqR12_fiqR12R11_fiqR11R10_fiqR10R9_fiqR9R8_fiqR8寄存器R8~R12有两个分组的物理寄存器。一个用于除FIQ模式之外的所有寄存器模式,另一个用于FIQ模式。这样在发生FIQ中断后,可以加速FIQ的处理速度。一般的通用寄存器寄存器类别寄存器在汇编中的名称各模式下实际访问的寄存器用户系统管理中止未定义中断快中断通用寄存器和程序计数器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_svcR13一般的通用寄存器寄存器类别寄存器在汇编中的名称各模式下实际访问的寄存器用户系统管理中止未定义中断快中断通用寄存器和程序计数器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(SP)寄存器R13常作为堆栈指针(SP)。在ARM指令集当中,没有以特殊方式使用R13的指令或其它功能,只是习惯上都这样使用。但是在Thumb指令集中存在使用R13的指令。寄存器类别寄存器在汇编中的名称各模式下实际访问的寄存器用户系统管理中止未定义中断快中断通用寄存器和程序计数器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链接寄存器R14(LR)R14为链接寄存器(LR),在结构上有两个特殊功能:在每种模式下,模式自身的R14版本用于保存子程序返回地址;当发生异常时,将R14对应的异常模式版本设置为异常返回地址(有些异常有一个小的固定偏移量)。4.4寄存器组织4.4.1ARM状态下的寄存器组织状态寄存器
当前程序状态寄存器(CurrentProgramStatusRegister,CPSR)备份的程序状态寄存器(SavedProgramStatusRegister,SPSR)4.4寄存器组织程序状态寄存器CPSR格式NZCV——IM0M1M2M3M4TF—...313029282726876543210条件代码标志保留控制位溢出标志oVerflow进位或借位扩展Carry零Zero负或小于NegativeIRQ禁止InterruptFIQ禁止Fast状态位Thumb模式位ModeNZCVIM0M1M2M3M4TF程序状态寄保存存器SPSR格式每个异常模式还带有一个程序状态保存寄存器(SPSR),它用于保存在异常发生之前的CPSR。CPSR和SPSR通过特殊指令(MRS、MSR)进行访问。NZCV——IM0M1M2M3M4TF—...3130292827268765432104.4寄存器组织Lable程序A程序BR14R14(LR)寄存器与子程序调用BLLable地址A???MOVPC,LRR14(地址A)Lable……1.程序A执行过程中调用程序B;操作流程2.程序跳转至标号Lable,执行程序B。同时硬件将“BLLable”指令的下一条指令所在地址存入R14(LR);3.程序B执行最后,将R14寄存器的内容放入PC,返回程序A;4.4寄存器组织R14寄存器注意要点当发生异常嵌套时,这些异常之间可能会发生冲突。例如:如果用户在用户模式下执行程序时发生了IRQ中断,用户模式寄存器不会被破坏。但是如果允许在IRQ模式下的中断处理程序重新使能IRQ中断,并且发生了嵌套的IRQ中断时,外部中断处理程序保存在R14_irq中的任何值都将被嵌套中断的返回地址所覆盖。4.4寄存器组织R14寄存器注意要点R14R14_irq用户模式下的程序IRQ模式下的程序AareturnB...XA地址A地址A1.执行用户模式下的程序;2.发生IRQ中断,硬件将某个地址存入IRQ模式下的R14_irq寄存器,用户模式下的R14没有被破坏;3.IRQ服务程序A执行完毕,将R14_irq寄存器的内容减去某个常量后存入PC,返回之前被中断的程序;未被破坏R14_irq4.4寄存器组织R14寄存器注意要点R14R14_irq用户模式下的程序IRQ模式下的程序AaB...XA地址A地址A1.执行用户模式下的程序;2.发生IRQ中断,硬件将某个地址存入IRQ模式下的R14_irq寄存器,用户模式下的R14没有被破坏;3.IRQ服务程序A执行完毕,将R14_irq寄存器的内容减去某个常量后存入PC,返回之前被中断的程序;未被破坏IRQ模式下的程序BareturnB...XA地址B地址B4.如果在IRQ处理程序中打开IRQ中断,并且再次发生IRQ中断;5.硬件将返回地址保存在R14_irq寄存器中,原来保存的返回地址将被覆盖,造成错误;R14_irq被破坏6.在程序B返回到程序A,然后在返回到用户模式下被中断的程序时,发生错误,将不能正确返回;returnreturn解决办法是确保R14的对应版本在发生中断嵌套时不再保存任何有意义的值(将R14入栈),或者切换到其它处理器模式下。4.4寄存器组织4.4寄存器组织4.4.2Thumb状态下的寄存器组织Thumb状态下的寄存器集是ARM状态下寄存器集的一个子集,程序可以直接访问8个通用寄存器(R7~R0)、程序计数器(PC)、堆栈指针(SP)、连接寄存器(LR)和CPSR。Thumb状态寄存器在Arm状态寄存器上的映射R1
R2
R3
R4
R5
R6
R7
R8
R9
R10
R11
R12
R0
堆栈指针(R13)
连接寄存器(R14)
程序计数器(R15)
低寄存器高寄存器4.4寄存器组织Thumb状态下的寄存器组织与ARM状态下的寄存器组织的关系:Thumb状态下和ARM状态下的R0~R7是相同的;Thumb状态下的SP对应于ARM状态下的R13;Thumb状态下的LR对应于ARM状态下的R14;Thumb状态下的程序计数器对应于ARM状态下R15;Thumb状态下和ARM状态下的CPSR和所有的SPSR是相同的Thumb状态下的寄存器组织4.5ARM的异常当正常的程序执行流程发生暂时的停止时,称之为异常。在处理异常之前,当前处理器的状态必须保留处理器允许多个异常同时发生,它们将会按固定的优先级进行处理异常与中断的概念并不完全等同4.5ARM的异常4.5.1ARM体系结构所支持的异常类型在ARM体系结构中,异常中断用来处理软件中断、未定义指令陷阱(不是真正的“意外”事件)、系统复位功能(在逻辑上发生在程序执行前而不是程序执行中)和外部事件。这些“不正常”事件都被划归“异常”,因为在处理器的控制机制中,它们都使用同样的流程进行异常处理。4.5ARM的异常ARM异常按引起异常事件的不同可分为以下3类:指令执行引起的直接异常指令执行引起的间接异常外部产生的与指令流无关的异常异常类型具体含义复位(RESET)当处理器的复位电平有效时,产生复位异常,程序跳转到复位异常处理程序处执行。未定义指令(UDEF)当ARM处理器或协处理器遇到不能处理的指令时,产生未定义指令异常。可使用该异常机制进行软件仿真。软件中断(SWI)该异常由执行SWI指令产生,可用于用户模式下的程序调用特权操作指令。可使用该异常机制实现系统功能调用。指令预取中止(PABT)若处理器预取指令的地址不存在,或该地址不允许当前指令访问,存储器会向处理器发出中止信号,但当预取的指令被执行时,才会产生指令预取中止异常。数据中止(DABT)若处理器数据访问指令的地址不存在,或该地址不允许当前指令访问时,产生数据中止异常。外部中断请求(IRQ)当处理器的外部中断请求引脚有效,且CPSR中的I位为0时,产生IRQ异常。系统的外设可通过该异常请求中断服务。快速中断请求(FIQ)当处理器的快速中断请求引脚有效,且CPSR中的F位为0时,产生FIQ异常。ARM体系结构所支持的异常异常向量(ExceptionVectors)地址异常进入模式0x0000,0000复位管理模式0x0000,0004未定义指令未定义模式0x0000,0008软件中断管理模式0x0000,000C中止(预取指令)中止模式0x0000,0010中止(数据)中止模式0x0000,0014保留保留0x0000,0018IRQIRQ0x0000,001CFIQFIQ4.5ARM的异常4.5.3对异常的响应ARM微处理器对异常的响应过程如下:1、将下一条指令的地址存入相应的连接寄存器LR,以便程序在处理异常返回时能从正确的位置重新开始执行;2、将CPSR复制到相应的SPSR中;3、设置当前状态寄存器CPSR中的相应位;4、给程序计数器(PC)强制赋值,使程序从相应的异常向量地址开始执行中断处理程序;程序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...????“?”表示对该位不关心4.5ARM的异常4.5.4从异常返回ARM微处理器会执行以下操作从异常返回:1、所有修改过的用户寄存器必须从处理程序的保护堆栈中恢复(出栈);2、将连接寄存器LR的值减去相应的偏移量送到PC中;3、将SPSR_mode寄存器内容复制回CPSR中,使得CPSR从相应的SPSR中恢复,即恢复被中断的程序工作状态;4、若在进入异常处理时设置了中断禁止位,要在此清除。4.5ARM的异常4.5.4从异常返回为确保指令总是按正确的操作模式读取,以保证存储器保护方案不被绕过,还有更加微妙的困难。因此,ARM提供了2种返回处理机制第一种机制:返回地址保存在R14;第二种机制:异常处理程序把返回地址拷贝到堆栈(在这种情况下,SPSR也和PC一样必须保存),可使用一条多寄存器传送指令来恢复用户寄存器,并实现返回:在异常处理结束后,异常处理程序完成以下动作:程序AIRQ服务程序系统模式IRQ模式程序寄存器组图示退出异常过程LR_sysSPSR_irqLR_irqLRPCCPSRSPSRSYS1?0...????MODTFI...NZCV将SPSR寄存器的值复制回CPSR寄存器;将LR寄存的值减去一个常量后复制到PC寄存器,跳转到被中断的用户程序。IRQ0?1...????BackAddrJumpAddrreturnSYS1?0...????SYS1?0...????BackAddr-4Jump“?”表示对该位不关心4.5ARM的异常4.5.5各类异常的具体描述1未定义指令异常(UndefinedInstruction)2软件中断异常(SoftwareInterrupt)3中止异常(Abort)4快速中断请求异常(FastInterruptRequest,FIQ)5外部中断请求异常(InterruptRequest,IRQ)4.5ARM的异常4.5.6异常的进入/退出异常类型返回指令以前的状态注意ARMR14_xThumbR14_xBLMOVPC,R14PC+4PC+21UDEFMOVSPC,R14_undPC+4PC+21SWIMOVSPC,R14_svcPC+4PC+21PABTSUBSPC,R14_abt,#4PC+4PC+41DABTSUBSPC,R14_abt,#8PC+8PC+83FIQSUBSPC,R14_fiq,#4PC+4PC+42IRQSUBSPC,R14_irq,#4PC+4PC+42RESETNA--44.5ARM的异常4.5.7异常优先级(ExceptionPriorities)异常类型优先级复位1(最高优先级)数据中止2FIQ3IRQ4预取中止5未定义指令6SWI7(最低优先级)优先级降低4.6ARM微处理器的指令系统基础4.6.1指令长度及数据类ARM微处理器的指令长度可以是32位(在ARM状态下),也可以为16位(在Thumb状态下)。ARM微处理器中支持字节(8位)、半字(16位)、字(32位)三种数据类型,其中,字需要4字节对齐(地址的低两位为0)、半字需要2字节对齐(地址的最低位为0)。4.6ARM微处理器的指令系统基础4.6.2ARM微处理器的指令的分类与格式指令分类简述ARM微处理器指令集是加载/存储型的;ARM微处理器的指令集可以分为跳转指令、数据处理指令、程序状态寄存器处理指令、Load/Store指令、协处理器指令和异常产生指令六大类;4.6ARM微处理器的指令系统基础4.6.2ARM微处理器的指令的分类与格式指令格式
ARM指令使用的基本格式:<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}4.6ARM微处理器的指令系统基础4.6.2ARM微处理器的指令的分类与格式指令格式使用举例:
LDRR0,[R1] BEQDATAEVENADDSR2,R1,#1SUBNESR2,R1,#0x20指令的条件域条件码助记符后缀标志含义0000EQZ置位相等0001NEZ清零不相等0010CSC置位无符号数大于或等于0011CCC清零无符号数小于0100MIN置位负数0101PLN清零正数或零0110VSV置位溢出0111VCV清零未溢出1000HIC置位Z清零无符号数大于1001LSC清零Z置位无符号数小于或等于1010GEN等于V带符号数大于或等于1011LTN不等于V带符号数小于1100GTZ清零且(N等于V)带符号数大于1101LEZ置位或(N不等于V)带符号数小于或等于1110AL忽略无条件执行4.7ARM指令的寻址方式立即寻址指令中的操作码字段后面的地址码部分即是操作数本身,也就是说,数据就包含在指令当中,取出指令也就取出了可以立即使用的操作数(这样的数称为立即数)。立即寻址指令举例如下:SUBSR0,R0,#1;R0减1,结果放入R0,并且;影响标志位MOV R0,#0xFF00;将立即数0xFF000装入;R0寄存器0x55R0MOVR0,#0xFF00程序存储寻址方式分类——立即寻址MOVR0,#0xFF000xFF00从代码中获得数据4.7ARM指令的寻址方式操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值来操作。寄存器寻址指令举例如下:MOVR1,R2 ;将R2的值存入R1SUBR0,R1,R2;将R1的值减去R2;的值,结果保存到R00xAA0x55R2R1寻址方式分类——寄存器寻址MOVR1,R20xAA4.7ARM指令的寻址方式寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。寄存器间接寻址指令举例如下:LDR R1,[R2] ;将R2指向的存储单元的数据读出 ;保存在R1中SWP R1,R1,[R2];将寄存器R1的值和R2指定的存储 ;单元的内容交换0x55R0R20x400000000xAA0x40000000寻址方式分类——寄存器间接寻址LDRR0,[R2]0xAA4.7ARM指令的寻址方式基址寻址就是将基址寄存器的内容与指令中给出的偏移量(<4K)相加/减,形成操作数的有效地址。基址寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能部件寄存器访问等。寄存器间接寻址是偏移量为0的基址加偏移寻址。基址寻址指令举例如下(前索引寻址):LDR R2,[R3,#0x0C];读取R3+0x0C地址上的存储单;元的内容,放入R2STR R1,[R0,#-4]!;先R0=R0-4,然后把R0的值寄;存到保存到R1指定的存储单元寻址方式分类——基址寻址0x55R2R30x400000000xAA0x4000000CLDRR2,[R3,#0x0C]0xAA将R3+0x0C作为地址装载数据4.7ARM指令的寻址方式变址寻址方式可分为:前变址模式
LDRR0,[R1,#4];R0←[R1+4]自动变址模式
LDRR0,[R1,#4]!;R0←[R1+4]、R1←R1+4
后变址模式LDRR0,[R1],#4;R0←[R1]、R1←R1+4偏移地址LDRR0,[R1,R2];R0←[R1+R2]LDRR0,[R1,R2,LSL#2];R0←[R1+R2*4]4.7ARM指令的寻址方式多寄存器寻址一次可传送几个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器。多寄存器寻址指令举例如下:LDMIAR1!,{R2-R7,R12};将R1指向的单元中的;数据读出到R2~R7、R12中(R1自动加4)STMIAR0!,{R2-R7,R12};将寄存器R2~R7、;R12的值保存到R0指向的存储;单元中 ;(R0自动加4)0x40000000R1R20x??0x010x400000000x??R3R40x??R60x??0x020x030x040x400000040x400000080x4000000C存储器寻址方式分类——多寄存器寻址LDMIAR1!,{R2-R4,R6}0x010x020x030x040x400000104.7ARM指令的寻址方式堆栈是一个按特定顺序进行存取的存储区,操作顺序为“后进先出”。堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存储单元即是堆栈的栈顶。存储器堆栈可分为两种:向上生长:向高地址方向生长,称为递增堆栈向下生长:向低地址方向生长,称为递减堆栈寻址方式分类——堆栈寻址4.7ARM指令的寻址方式寻址方式分类——堆栈寻址栈底栈顶栈区SP堆栈存储区栈顶栈底栈区SP向下增长向上增长0x123456780x12345678堆栈压栈堆栈压栈4.7ARM指令的寻址方式栈顶SP栈顶SP栈底空堆栈栈底满堆栈堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个待压入数据的空位置,称为空堆栈。寻址方式分类——堆栈寻址0x123456780x12345678栈顶SP0x12345678栈顶SP压栈压栈4.7ARM指令的寻址方式所以可以组合出四种类型的堆栈方式:满递增:堆栈向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA、STMFA等;空递增:堆栈向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA、STMEA等;满递减:堆栈向下增长,堆栈指针指向内含有效数据项的最低地址。指令如LDMFD、STMFD等;空递减:堆栈向下增长,堆栈指针向堆栈下的第一个空位置。指令如LDMED、STMED等。寻址方式分类——堆栈寻址4.7ARM指令的寻址方式在ARM指令中,堆栈寻址也是通过Load/Store指令来实现的,例如:STMFDSP!{R1-R7,LR};将R1~R7,LR入栈LDMFDSP!{R1-R7,LR};数据出栈,放入R1~R7,LR寄存器在Thumb指令中,堆栈寻址通过PUSH/POP指令来实现,例如:PUSH{R1-R7,LR};将R1~R7,LR入栈POP{R1-R7,PC};数据出栈,放入R1~R7,PC寄存器寻址方式分类——堆栈寻址4.7ARM指令的寻址方式相对寻址是基址寻址的一种变通。由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。相对寻址指令举例如下: BL SUBR1 ;调用到SUBR1子程序 ...SUBR1 ...寻址方式分类——相对寻址4.8ARM指令集;文件名:TEST1.S
;功能:实现两个寄存器相加;说明:使用ARMulate软件仿真调试 AREA Example1,CODE,READONLY ;声明代码段Example1
ENTRY ;标识程序入口 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 ;文件结束
使用“;”进行注释标号顶格写实际代码段声明文件结束简单的ARM程序4.8ARM指令集ARM指令集总体分为六大类:数据处理指令;程序状态寄存器访问指令;Load/Store指令;跳转指令(转移指令);异常中断指令;协处理器指令。4.8ARM指令集4.8.1数据处理指令数据传送指令用于在寄存器和存储器之间进行数据的双向传输。算术逻辑运算指令完成常用的算术与逻辑的运算,该类指令不但将运算结果保存在目的寄存器中,同时更新CPSR中的相应条件标志位。比较指令不保存运算结果,只更新CPSR中相应的条件标志位。4.8ARM指令集数据处理指令包括:SUB:减法指令SBC:带借位减法指令RSB:逆向减法指令RSC:带借位逆向减法指令AND:逻辑与指令ORR:逻辑或指令EOR:逻辑异或指令BIC:位清除指令MOV:数据传送指令MVN:数据取反传送指令CMP:比较指令CMN:反值比较指令TST:位测试指令TEQ:相等测试指令ADD:加法指令ADC:带进位加法指令4.8ARM指令集4.8.2乘法指令与乘加指令ARM微处理器支持的乘法指令与乘加指令共有6条,可分为运算结果为32位和运算结果为64位两类,与前面的数据处理指令不同,指令中的所有操作数、目的寄存器必须为通用寄存器,不能对操作数使用立即数或被移位的寄存器,同时,目的寄存器和操作数1必须是不同的寄存器。4.8ARM指令集乘法指令与乘加指令共有以下6条:MUL:32位乘法指令;MLA:32位乘加指令;SMULL:64位有符号数乘法指令;SMLAL:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025学年河南省邓州市春雨国文学校高二上学期入学摸底考试语文试卷
- 2024-2025学年福建省宁德市部分达标学校高二上学期11月期中考试语文试卷
- 2025届高中语文一轮复习学案32 分析思想感情和评价观点态度(含答案)
- 激励高一高二学生的发言稿
- 电力市场下电能质量监测的商业价值分析
- 英语老师实习总结
- 农经站年终工作总结
- 影楼年终工作总结
- 上半年招商引资工作总结
- 社交媒体的心理健康与保护措施研讨
- 《幼儿行为观察与分析案例教程》教学教案
- 煤矿掘进队机电管理制度汇编
- 小学科学教育课程实施方案
- 国家公务员考试(面试)试题及解答参考(2024年)
- 幼学纪事获奖课件
- 代理商的管理制度
- 名著阅读:简答、阅读题(解析版)-2025年中考语文复习专练
- 住院精神疾病患者自杀风险护理
- 供应室课件大全
- 浙江省大学生职业生涯规划大赛赛前辅导课件
- 部编四下语文《口语交际:转述》公开课教案教学设计【一等奖】
评论
0/150
提交评论