资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,ARM体系结构研讨,第二讲 体系结构,从体系结构而言,51单片机属于哈弗结构,采用cisc复杂指令集系统,Arm一般为哈弗结构(ARM7采用冯诺依曼结构),采用risc精简指令集系统,体系结构:,从用户角度看到的计算机属性,计算机的指令集、可见寄存器、存储器管理单元和异常处理模式都是体系结构的一部分。,ARM体系结构,ARM处理器工作状态,ARM处理器工作模式,ARM寄存器组成,ARM的异常中断,ARM7处理器工作状态,自从ARM7TDMI核以后,体系结构中具有T变种的ARM处理器核可以工作在以下两种状态:,ARM状态,32位,ARM状态下执行字对准的32位ARM指令;,Thumb状态,16位,Thumb状态下执行半字对准的16位Thumb指令。在Thumb状态下,程序计数器PC使用位1选择另一个半字。,Thumb产生的原因,ARM为32位机,适于处理高速大数据量,因此高端消费类产品需要较大,成本矛盾,32位指令需要更大的存储空间,对应更高的成本,为了解决代码长度的问题,ARM体系结构又增加了变种,开发了一种新的指令体系,这就是Thumb指令集。,Thumb指令集,Thumb是ARM体系结构的扩展。它有从标准32位ARM指令集抽出来的36条指令格式,可以重新编成16位的操作码,这能带来很高的代码密度,因为Thumb指令的宽度只有ARM指令宽度的一半,在运行时,这些16位的Thumb指令又由处理器解压成32位的ARM指令。,Thumb指令集,Thumb指令集是通常使用的32位ARM指令集的子集。,每条Thumb指令是16位长,有相应的对于处理器模型有相同效果的32位ARM指令。,Thumb指令在标准的ARM寄存器配置下进行操作,在ARM和Thumb状态之间具有出色的互操作性。,执行时,16位Thumb指令透明地实时解压缩成32位ARM指令,且没有性能损失。,Thumb具有32位核的所有优点:,32位寻址空间;,32位寄存器;,32位移位器和算术逻辑单元ALU(Arithmetic Logic Unit);,32位存储器传送。,Thumb的技术实现,ARM7TDMI考虑流水线各级间的平衡,利用译码阶段的一个未用的时钟相位,将Thumb指令解压还原为32位相应的ARM指令来完成对Thumb指令的解压缩。,这些16位的Thumb指令可以由处理器在译码级解压成32位的ARM指令,在ARM核里运行。,这样,不需要再附加时间费用和单独的解码周期,就可以维持指令的执行。,Thumb的技术实现,ARM7TDMI中ARM7和ARM7T取指令、解压缩与执行的过程。,Thumb的技术实现,Thumb指令的解压缩和解码过程:,从流水的取指令阶段得到的ARM指令,经过ARM译,码,并且激活主副操作码控制信号。其中,主操作码描述了要执行指令的类型,副操作码说明了指令的细节,诸如存储器、操作数 等。,在Thumb状态,多路复用器指导指令经过Thumb解压缩逻辑,转换为相应的ARM指令,然后执行。,Thumb技术的特点,独立的两套指令集也使得解码逻辑极其的简单,从而维持了较小的硅片面积,保证了领先的“低功耗、高性能、小体积”的技术要求,满足了对嵌入式系统的设计需求。,ARM与THUMB,THUMB指令是ARM指令的子集,可以相互调用,只要遵循一定的调用规则,Thumb指令与ARM指令的时间效率和空间效率关系为:,存储空间约为ARM代码的6070,指令数比ARM代码多约3040,存储器为32位时ARM代码比Thumb代码快约40,存储器为16位时Thumb比ARM代码快约4050,使用Thumb代码,存储器的功耗会降低约30,ARM7处理器工作状态,进入Thumb状态:,当操作数寄存器Rm的状态位bit0为1时,执行BX Rm指令进入 Thumb状态,所有的异常都是再ARM状态下进行,如果处理器在Thumb状态进入异常,则当异常处理(IRQ,FIQ,Undef,Abort和SWI)返回时,自动切换到Thumb状态。,ARM7处理器工作状态,进入ARM状态:,当操作数寄存器Rm的状态位bit0为0时,执行BX Rm指令进入ARM状态。,如果处理器进行异常处理(IRQ,FIQ,Undef,Abort和SWI),在此情况下,把PC放入异常模式链接寄存器LR中,从异常向量地址开始执行也可以进入ARM状态。,处理器状态,使用BX指令将ARM7TDMI内核的操作状态在ARM状态和Thumb状态之间进行切换(程序如下所示。,;从Arm状态切换到Thumb状态,LDR R0,=Lable+1,BX R0,;从Thumb状态切换到ARM状态,LDR R0,=Lable,BX R0,地址最低位为1,表示切换到Thumb状态,地址最低位为0,表示切换到ARM状态,跳转地址标号,ARM7处理器工作状态,ARM7处理器工作状态,在程序执行的过程中,处理器可以在两种状态下切换。需要强调的是:,ARM和Thumb之间状态的切换不影响处理器的模式或寄存器的内容。,ARM指令集和Thumb指令集都有相应的状态切换命令。,ARM处理器在开始执行代码时,只能处于ARM状态。,两种工作状态存在的问题,ARM 状态,指令均是32 位的,性能高。,Thumb 状态下,指令均是16 位的,代码密度提高了一倍。,Thumb 状态下的指令功能只是ARM 下的一个子集,结果可能需要更多条的指令去完成相同的工作,导致处理性能下降。,一般的解决方法,混合编程:arm与thumb结合。,不足:两个方面,1:时间额外开销,2,ARM 代码和Thumb 代码需要以不同的方式编译,这也增加了软件开发管理的复杂度。,Cortex m3的解决方法,采用thumb-2指令集,,混合32/16位指令,不支持arm状态,只支持thumb状态,减小了状态切换的额外开销,节省了 执行时间和指令空间。,不再需要把源代码文件分成按ARM 编译的和按Thumb 编译的,软件开发的管理大大减负。,无需再反复地求证和测试:究竟该在何时何地切换到何种状态下,我的程序才最有效率。开发软件容易多了,ARM技术基础,ARM处理器工作状态,ARM处理器工作模式,ARM寄存器组成,ARM的异常中断,ARM处理器工作模式,ARM7处理器共支持所列的7种处理器模式见下表,表中给出了CPSR4:0与七种工作模式的关系以及各种模式的解释。,CPSR4:0,模式,用途,可访问的寄存器,10000,用户,正常用户模式,,程序正常执行模式,PC,R14R0,CPSR,10001,FIQ,处理快速中断,支持高速数据传送或通道处理,PC,R14_fiqR8_fiq,R7R0,CPSR,SPSR_fiq,10010,IRQ,处理普通中断,PC,R14_irqR13_fiq,R12R0,CPSR,SPSR_irq,10011,SVC,操作系统保护模式,处理软件中断(SWI),PC,R14_svcR13_svc,R12R0,CPSR,SPSR_svc,10111,中止,处理存储器故障、实现虚拟存储器和存储器保护,PC,R14_abtR13_abt,R12R0,CPSR,SPSR_abt,11011,未定义,处理未定义的指令陷阱,支持硬件协处理器的软件仿真,PC,R14_undR13_und,R12R0,CPSR,SPSR_und,11111,系统,运行特权操作系统任务,PC,R14R0,CPSR,处理器模式,说明,备注,用户 (usr),正常程序工作模式,不能直接切换到其它模式,系统 (sys),用于支持操作系统的特权任务等,与用户模式类似,但具有可以直接切换到其它模式等特权,快中断 (fiq),支持高速数据传输及通道处理,FIQ异常响应时进入此模式,中断 (irq),用于通用中断处理,IRQ异常响应时进入此模式,管理 (svc),操作系统保护代码,系统复位和软件中断响应时进入此模式,中止 (abt),用于支持虚拟内存和/或存储器保护,在ARM7TDMI没有大用处,未定义 (und),支持硬件协处理器的软件仿真,未定义指令异常响应时进入此模式,处理器模式,特权模式,处理器模式,说明,备注,用户 (usr),正常程序工作模式,不能直接切换到其它模式,系统 (sys),用于支持操作系统的特权任务等,与用户模式类似,但具有可以直接切换到其它模式等特权,快中断 (fiq),支持高速数据传输及通道处理,FIQ异常响应时进入此模式,中断 (irq),用于通用中断处理,IRQ异常响应时进入此模式,管理 (svc),操作系统保护代码,系统复位和软件中断响应时进入此模式,中止 (abt),用于支持虚拟内存和/或存储器保护,在ARM7TDMI没有大用处,未定义 (und),支持硬件协处理器的软件仿真,未定义指令异常响应时进入此模式,除用户模式外,其它模式均为特权模式。ARM内部寄存器和一些片内外设在硬件设计上只允许(或者可选为只允许)特权模式下访问。此外,特权模式可以自由的切换处理器模式,而用户模式不能直接切换到别的模式。,未定义 (und),中止 (abt),管理 (svc),中断 (irq),快中断 (fiq),系统 (sys),异常模式,处理器模式,说明,备注,用户 (usr),正常程序工作模式,不能直接切换到其它模式,系统 (sys),用于支持操作系统的特权任务等,与用户模式类似,但具有可以直接切换到其它模式等特权,快中断 (fiq),支持高速数据传输及通道处理,FIQ异常响应时进入此模式,中断 (irq),用于通用中断处理,IRQ异常响应时进入此模式,管理 (svc),操作系统保护代码,系统复位和软件中断响应时进入此模式,中止 (abt),用于支持虚拟内存和/或存储器保护,在ARM7TDMI没有大用处,未定义 (und),支持硬件协处理器的软件仿真,未定义指令异常响应时进入此模式,未定义 (und),中止 (abt),管理 (svc),中断 (irq),快中断 (fiq),这五种模式称为,异常模式,。它们除了可以通过程序切换进入外,也可以由特定的异常进入。当特定的异常出现时,处理器进入相应的模式。每种异常模式都有一些独立的寄存器,以避免异常退出时用户模式的状态不可靠。,用户和系统模式,处理器模式,说明,备注,用户 (usr),正常程序工作模式,不能直接切换到其它模式,系统 (sys),用于支持操作系统的特权任务等,与用户模式类似,但具有可以直接切换到其它模式等特权,快中断 (fiq),支持高速数据传输及通道处理,FIQ异常响应时进入此模式,中断 (irq),用于通用中断处理,IRQ异常响应时进入此模式,管理 (svc),操作系统保护代码,系统复位和软件中断响应时进入此模式,中止 (abt),用于支持虚拟内存和/或存储器保护,在ARM7TDMI没有大用处,未定义 (und),支持硬件协处理器的软件仿真,未定义指令异常响应时进入此模式,这两种模式都不能由异常进入,而且它们使用完全相同的寄存器组。,系统模式是特权模式,不受用户模式的限制。操作系统在该模式下访问用户模式的寄存器就比较方便,而且操作系统的一些特权任务可以使用这个模式访问一些受控的资源。,系统 (sys),用户 (usr),Cortex-M3,的工作模式,CortexM3 支持2 个模式和两个特权等级。,两种操作模式分别为:处理模式(handler mode)和线程模式(thread mode)。引入两个模式的目的,是用于区别普通应用程序的代码和异常服务例程的代码包括中断服务例程的代码。,CortexM3 的特权分级特权级和用户级。,这可以提供一种存储器访问的保护机制,使得普通的用户程序代码不能意外地,甚至是恶意地执行涉及到要害的操作。处理器支持两种特权级,这也是一个基本的安全模型。,特权访问和用户访问,处理模式,线程模式,可以特权访问,也可以用户访问,始终特权访问,Cortex-M3,的工作模式,用户程序,中断(异常)程序,特权执行可以访问所有资源。,非特权执行时对有些资源的访问受到限制或不允许访问。,如部分指令的使用(设置FAULTMASK和PRIMASK的CPS指令),对系统控制空间(SCS)的大部分寄存器的访问。,特权访问和用户访问(非特权访问)的区别,FAULTMASK,PRIMASK,SCS,用户访问,特权访问,Cortex-M3,的工作模式,1.线程模式,线程模式和处理模式,2.处理模式,在复位时处理器进入线程模式,异常返回时处理器进入线程模式,特权和用户(非特权)代码能够在线程模式下运行,出现异常时处理器进入处理模式,在处理模式中,所有代码都是特权访问的,Cortex-M3,的编程模式,线程模式,特权访问,复位,处理模式,特权访问,异常,线程模式,用户访问,异常,异常退出,CONTROL0=1,CONTROL0=0,MSR指令置位,CONTROL0,Cortex-M3,的编程模式,CONTROL0,特权访问,用户访问,1,0,特权访问和用户访问的切换,控制寄存器的第0位,在,处理模式,下,,通过MSR指令,清零,CONTROL0,退出,处理模式进入线程模式时切换到,特权访问,。,MOV R0#0X00,MSR CONTROL R0,在,处理模式,下,,通过MSR指令,置位,CONTROL0,退出,处理模式进入线程模式时切换到用户访问。,在,线程模式特权访问,下,通过MSR指令,置位,CONTROL0,即可由特权访问进入用户访问。,MRS R0 CONTROL,ORR R0,R0,#0 x01,MSR CONTROL R0,控制寄存器,控制寄存器(CONTROL),控制寄存器用于定义特权级别,还用于选择当前使用哪个堆栈指针。,CONTROL0,仅当在特权级下操作时才允许写该位。一旦进入了用户级,唯一返回特权级的途径,就是触发一个(软)中断,再由服务例程改写该位。,堆栈指针,这两个堆栈指针分别是:,主堆栈指针(MSP),,或写作SP_main。这是缺省的堆栈指针,它由OS 内核、异常服务例程以及所有需要特权访问的应用程序代码来使用。,进程堆栈指针(PSP),,或写作SP_process。用于常规的应用程序代码(不处于异常服用例程中时)。,堆栈指针,在CortexM3 中,有专门的指令负责堆栈操作PUSH 和POP。它俩的汇编语言语法如下例所演示:,PUSH R0;,POP R0,堆栈指针,PUSH 和POP 能一次操作多个寄存器,如下所示:,subroutine_1,PUSH R0-R7,R12,R14;保存寄存器列表,;执行处理,POP R0-R7,R12,R14;恢复寄存器列表,BX R14;返回到主调函数,Cortex-M3,的编程模式,主堆栈和进程堆栈,处理模式,线程模式,可用 MSP,始终使用 MSP,也可用 PSP,Cortex-M3,的编程模式,主堆栈和进程堆栈,结束复位后,所有代码都使用主堆栈,所有异常都使用主堆栈,在线程模式中,使用MSR指令对CONTROL1执行写操作也可以从主堆栈切换到进程堆栈。,在任何时候,进程堆栈和主堆栈中只有一个是可见的,由r13指示。,Cortex-M3,的编程模式,通过异常进行堆栈切换,线程模式,主堆栈,复位,处理模式,主堆栈,产生异常,线程模式,线程堆栈,产生异常,异常退出,EXC_RETURN3:0=0b1101,EXC_RETURN3:0=0b1001,Cortex-M3,的编程模式,通过MSR指令修改CONTROL1进行堆栈切换,线程模式,主堆栈,线程模式,进程堆栈,CONTROL1,主堆栈,进程堆栈,1,0,控制寄存器的第1位,CONTROL1,在CortexM3 的handler 模式中,CONTROL1总是0。在线程模式中则可以为0 或1。,仅当处于特权级的线程模式下,此位才可写,其它场合下禁止写此位。,Cortex-M3,的编程模式,特权等级和堆栈指针的选择均由CONTROL 负责。当CONTROL0=0 时,在异常处理的始末,只发生了处理器模式的转换,如下图所示。,Cortex-M3,的编程模式,若CONTROL0=1(线程模式+用户级),则在中断响应的始末,处理器模式和特权等极都要发生变化,如下图所示。,三种执行模式的比较,执行模式,进入方式,堆栈SP,用途,特权线程,模式,1复位,2在特权处理模式下使用,MSR,指令清零,CONTROL0,使用,SP_main,:,1复位后默认,2.在退出特权处理模式前,,修改返回值,EXC_RETURN3:0为0b1001,3清零,CONTROL1,使用,SP_process,:,1在退出特权处理模式前,,修改返回值,EXC_RETURN3:0,为,0b1101,2置位,CONTROL1,线程模式(特权或非特权),SP_process,多用于操作系统的任务状态。,非特权线程模式,在特权线程模式或特权处理模式下使用,MSR,指令置位,CONTROL0,特权处理,模式,出现异常,只能使用,SP_main,特权处理模式,SP_main,在前后台和操作系统中用于中断状态。,前后台系统主堆栈压栈过程,数据,数据,栈顶,栈底,0 x20000400,0 x200003FC,0 x200003F8,数据,地址,数据增长方向,堆栈增长为,满递减,SP,主堆栈,前后台系统主堆栈压栈过程,数据,数据,栈底,数据,地址,数据增长方向,堆栈增长为,满递减,产生中断,主堆栈,SP,XPSR,PC,LR,R12,R3,R0,0 x20000400,0 x200003FC,0 x200003F8,硬件自动,压栈,前后台系统主堆栈出栈过程,数据,数据,栈底,数据,地址,退出中,断,主堆栈,XPSR,PC,LR,R12,R3,R2,R1,R0,通用寄存器,0 x20000400,0 x200003FC,0 x200003F8,SP,SP,SP,SP,SP,SP,SP,XPSR,PC,LR,R12,R3,R2,R1,R0,R1,R0,SP,SP,R2,XPSR,PC,LR,R12,R3,退出异常,,寄存器恢复,为进入前的,值。,操作系统主堆栈和进程堆栈切换过程,主堆栈,任务1,任务2,复位,SP,初始化,数据,SP,数据,数据,栈底,栈底,栈底,栈顶,栈顶,栈顶,栈顶,栈顶,栈顶,SP =MSP,操作系统主堆栈和进程堆栈切换过程,主堆栈,任务1,任务2,进入异常,数据,SP,数据,数据,栈底,栈底,栈底,R0,SP,SP =MSP,操作系统主堆栈和进程堆栈切换过程,主堆栈,任务1,任务2,退出异,常时,切换到任务1,数据,数据,数据,栈底,栈底,栈底,R0,SP,SP =PSP,ARM技术基础,ARM处理器工作状态,ARM处理器工作模式,ARM寄存器组成,ARM的异常中断,ARM寄存器组成概述,简介,在ARM7TDMI处理器内部有37个用户可见的寄存器。,在不同的工作模式和处理器状态下,程序员可以访问的寄存器也不尽相同。,寄存器类别,寄存器在汇编中的名称,各模式下实际访问的寄存器,用户,系统,管理,中止,未定义,中断,快中断,通用寄存器和程序计数器,R0(a1),R0,R1(a2),R1,R2(a3),R2,R3(a4),R3,R4(v1),R4,R5(v2),R5,R6(v3),R6,R7(v4),R7,R8(v5),R8,R8_fiq,R9(SB,v6),R9,R9_fiq,R10(SL,v7),R10,R10_fiq,R11(FP,v8),R11,R11_fiq,R12(IP),R12,R12_fiq,R13(SP),R13,R13_svc,R13_abt,R13_und,R13_irq,R13_fiq,R14(LR),R14,R14_svc,R14_abt,R14_und,R14_irq,R14_fiq,R15(PC),R15,状态寄存器,CPSR,CPSR,SPSR,无,SPSR_abt,SPSR_abt,SPSR_und,SPSR_irq,SPSR_fiq,ARM状态各模式下的寄存器,寄存器类别,寄存器在汇编中的名称,各模式下实际访问的寄存器,用户,系统,管理,中止,未定义,中断,快中断,通用寄存器和程序计数器,R0(a1),R0,R1(a2),R1,R2(a3),R2,R3(a4),R3,R4(v1),R4,R5(v2),R5,R6(v3),R6,R7(v4),R7,R8(v5),R8,R8_fiq,R9(SB,v6),R9,R9_fiq,R10(SL,v7),R10,R10_fiq,R11(FP,v8),R11,R11_fiq,R12(IP),R12,R12_fiq,R13(SP),R13,R13_svc,R13_abt,R13_und,R13_irq,R13_fiq,R14(LR),R14,R14_svc,R14_abt,R14_und,R14_irq,R14_fiq,R15(PC),R15,状态寄存器,CPSR,CPSR,SPSR,无,SPSR_abt,SPSR_abt,SPSR_und,SPSR_irq,SPSR_fiq,ARM状态各模式下的寄存器,SPSR_fiq,SPSR_irq,SPSR_und,SPSR_abt,SPSR_abt,CPSR,R15,R14_fiq,R14_irq,R14_und,R14_abt,R14_svc,R14,R13_fiq,R13_irq,R13_und,R13_abt,R13_svc,R13,R12_fiq,R12,R11_fiq,R11,R10_fiq,R10,R9_fiq,R9,R8_fiq,R8,R7,R6,R5,R4,R3,R2,R1,R0,所有的37个寄存器,分成两大类:,31个通用32位寄存器;,6个状态寄存器。,寄存器类别,寄存器在汇编中的名称,各模式下实际访问的寄存器,用户,系统,管理,中止,未定义,中断,快中断,通用寄存器和程序计数器,R0(a1),R0,R1(a2),R1,R2(a3),R2,R3(a4),R3,R4(v1),R4,R5(v2),R5,R6(v3),R6,R7(v4),R7,R8(v5),R8,R8_fiq,R9(SB,v6),R9,R9_fiq,R10(SL,v7),R10,R10_fiq,R11(FP,v8),R11,R11_fiq,R12(IP),R12,R12_fiq,R13(SP),R13,R13_svc,R13_abt,R13_und,R13_irq,R13_fiq,R14(LR),R14,R14_svc,R14_abt,R14_und,R14_irq,R14_fiq,R15(PC),R15,状态寄存器,CPSR,CPSR,SPSR,无,SPSR_abt,SPSR_abt,SPSR_und,SPSR_irq,SPSR_fiq,无,CPSR,R15,R14,R13,R12,R11,R10,R9,R8,R7,R6,R5,R4,R3,R2,R1,R0,用户,无,CPSR,R15,R14,R13,R12,R11,R10,R9,R8,R7,R6,R5,R4,R3,R2,R1,R0,系统,SPSR_abt,CPSR,R15,R14_svc,R13_svc,R12,R11,R10,R9,R8,R7,R6,R5,R4,R3,R2,R1,R0,管理,SPSR_abt,CPSR,R15,R14_abt,R13_abt,R12,R11,R10,R9,R8,R7,R6,R5,R4,R3,R2,R1,R0,中止,SPSR_und,CPSR,R15,R14_und,R13_und,R12,R11,R10,R9,R8,R7,R6,R5,R4,R3,R2,R1,R0,未定义,SPSR_irq,CPSR,R15,R14_irq,R13_irq,R12,R11,R10,R9,R8,R7,R6,R5,R4,R3,R2,R1,R0,中断,SPSR_fiq,CPSR,R15,R14_fiq,R13_fiq,R12_fiq,R11_fiq,R10_fiq,R9_fiq,R8_fiq,R7,R6,R5,R4,R3,R2,R1,R0,快中断,ARM状态各模式下可以访问的寄存器,寄存器类别,寄存器在汇编中的名称,各模式下实际访问的寄存器,用户,系统,管理,中止,未定义,中断,快中断,通用寄存器和程序计数器,R0(a1),R0,R1(a2),R1,R2(a3),R2,R3(a4),R3,R4(v1),R4,R5(v2),R5,R6(v3),R6,R7(v4),R7,R8(v5),R8,R8_fiq,R9(SB,v6),R9,R9_fiq,R10(SL,v7),R10,R10_fiq,R11(FP,v8),R11,R11_fiq,R12(IP),R12,R12_fiq,R13(SP),R13,R13_svc,R13_abt,R13_und,R13_irq,R13_fiq,R14(LR),R14,R14_svc,R14_abt,R14_und,R14_irq,R14_fiq,R15(PC),R15,状态寄存器,CPSR,CPSR,SPSR,无,SPSR_abt,SPSR_abt,SPSR_und,SPSR_irq,SPSR_fiq,一般的通用寄存器,R13_fiq,R13_irq,R13_und,R13_abt,R13_svc,R13,R12_fiq,R12,R11_fiq,R11,R10_fiq,R10,R9_fiq,R9,R8_fiq,R8,R7,R6,R5,R4,R3,R2,R1,R0,在汇编语言中寄存器R0R13为保存数据或地址值的通用寄存器。它们是完全通用的寄存器,不会被体系结构作为特殊用途,并且可用于任何使用通用寄存器的指令。,寄存器类别,寄存器在汇编中的名称,各模式下实际访问的寄存器,用户,系统,管理,中止,未定义,中断,快中断,通用寄存器和程序计数器,R0(a1),R0,R1(a2),R1,R2(a3),R2,R3(a4),R3,R4(v1),R4,R5(v2),R5,R6(v3),R6,R7(v4),R7,R8(v5),R8,R8_fiq,R9(SB,v6),R9,R9_fiq,R10(SL,v7),R10,R10_fiq,R11(FP,v8),R11,R11_fiq,R12(IP),R12,R12_fiq,R13(SP),R13,R13_svc,R13_abt,R13_und,R13_irq,R13_fiq,R14(LR),R14,R14_svc,R14_abt,R14_und,R14_irq,R14_fiq,R15(PC),R15,状态寄存器,CPSR,CPSR,SPSR,无,SPSR_abt,SPSR_abt,SPSR_und,SPSR_irq,SPSR_fiq,一般的通用寄存器,R13_fiq,R13_irq,R13_und,R13_abt,R13_svc,R13,R12_fiq,R12,R11_fiq,R11,R10_fiq,R10,R9_fiq,R9,R8_fiq,R8,R7,R6,R5,R4,R3,R2,R1,R0,R7,R6,R5,R4,R3,R2,R1,R0,其中R0R7为未分组的寄存器,也就是说对于任何处理器模式,这些寄存器都对应于相同的32位物理寄存器。,寄存器类别,寄存器在汇编中的名称,各模式下实际访问的寄存器,用户,系统,管理,中止,未定义,中断,快中断,通用寄存器和程序计数器,R0(a1),R0,R1(a2),R1,R2(a3),R2,R3(a4),R3,R4(v1),R4,R5(v2),R5,R6(v3),R6,R7(v4),R7,R8(v5),R8,R8_fiq,R9(SB,v6),R9,R9_fiq,R10(SL,v7),R10,R10_fiq,R11(FP,v8),R11,R11_fiq,R12(IP),R12,R12_fiq,R13(SP),R13,R13_svc,R13_abt,R13_und,R13_irq,R13_fiq,R14(LR),R14,R14_svc,R14_abt,R14_und,R14_irq,R14_fiq,R15(PC),R15,状态寄存器,CPSR,CPSR,SPSR,无,SPSR_abt,SPSR_abt,SPSR_und,SPSR_irq,SPSR_fiq,一般的通用寄存器,R14_fiq,R14_irq,R14_und,R14_abt,R14_svc,R14,R13_fiq,R13_irq,R13_und,R13_abt,R13_svc,R13,R12_fiq,R12,R11_fiq,R11,R10_fiq,R10,R9_fiq,R9,R8_fiq,R8,寄存器R8R14为分组寄存器。它们所对应的物理寄存器取决于当前的处理器模式,几乎所有允许使用通用寄存器的指令都允许使用分组寄存器,寄存器类别,寄存器在汇编中的名称,各模式下实际访问的寄存器,用户,系统,管理,中止,未定义,中断,快中断,通用寄存器和程序计数器,R0(a1),R0,R1(a2),R1,R2(a3),R2,R3(a4),R3,R4(v1),R4,R5(v2),R5,R6(v3),R6,R7(v4),R7,R8(v5),R8,R8_fiq,R9(SB,v6),R9,R9_fiq,R10(SL,v7),R10,R10_fiq,R11(FP,v8),R11,R11_fiq,R12(IP),R12,R12_fiq,R13(SP),R13,R13_svc,R13_abt,R13_und,R13_irq,R13_fiq,R14(LR),R14,R14_svc,R14_abt,R14_und,R14_irq,R14_fiq,R15(PC),R15,状态寄存器,CPSR,CPSR,SPSR,无,SPSR_abt,SPSR_abt,SPSR_und,SPSR_irq,SPSR_fiq,一般的通用寄存器,R12_fiq,R12,R11_fiq,R11,R10_fiq,R10,R9_fiq,R9,R8_fiq,R8,寄存器R8R12有两个分组的物理寄存器。一个用于除FIQ模式之外的所有寄存器模式,另一个用于FIQ模式。这样在发生FIQ中断后,可以加速FIQ的处理速度。,寄存器类别,寄存器在汇编中的名称,各模式下实际访问的寄存器,用户,系统,管理,中止,未定义,中断,快中断,通用寄存器和程序计数器,R0(a1),R0,R1(a2),R1,R2(a3),R2,R3(a4),R3,R4(v1),R4,R5(v2),R5,R6(v3),R6,R7(v4),R7,R8(v5),R8,R8_fiq,R9(SB,v6),R9,R9_fiq,R10(SL,v7),R10,R10_fiq,R11(FP,v8),R11,R11_fiq,R12(IP),R12,R12_fiq,R13(SP),R13,R13_svc,R13_abt,R13_und,R13_irq,R13_fiq,R14(LR),R14,R14_svc,R14_abt,R14_und,R14_irq,R14_fiq,R15(PC),R15,状态寄存器,CPSR,CPSR,SPSR,无,SPSR_abt,SPSR_abt,SPSR_und,SPSR_irq,SPSR_fiq,一般的通用寄存器,寄存器R13、R14分别有6个分组的物理寄存器。一个用于用户和系统模式,其余5个分别用于5种异常模式。,R14_fiq,R14_irq,R14_und,R14_abt,R14_svc,R14,R13_fiq,R13_irq,R13_und,R13_abt,R13_svc,R13,寄存器类别,寄存器在汇编中的名称,各模式下实际访问的寄存器,用户,系统,管理,中止,未定义,中断,快中断,通用寄存器和程序计数器,R0(a1),R0,R1(a2),R1,R2(a3),R2,R3(a4),R3,R4(v1),R4,R5(v2),R5,R6(v3),R6,R7(v4),R7,R8(v5),R8,R8_fiq,R9(SB,v6),R9,R9_fiq,R10(SL,v7),R10,R10_fiq,R11(FP,v8),R11,R11_fiq,R12(IP),R12,R12_fiq,R13(SP),R13,R13_svc,R13_abt,R13_und,R13_irq,R13_fiq,R14(LR),R14,R14_svc,R14_abt,R14_und,R14_irq,R14_fiq,R15(PC),R15,状态寄存器,CPSR,CPSR,SPSR,无,SPSR_abt,SPSR_abt,SPSR_und,SPSR_irq,SPSR_fiq,堆栈指针寄存器R13(SP),寄存器R13常作为堆栈指针(SP)。在ARM指令集当中,没有以特殊方式使用R13的指令或其它功能,只是习惯上都这样使用。但是在Thumb指令集中,只能使用R13作为堆栈指针。,寄存器类别,寄存器在汇编中的名称,各模式下实际访问的寄存器,用户,系统,管理,中止,未定义,中断,快中断,通用寄存器和程序计数器,R0(a1),R0,R1(a2),R1,R2(a3),R2,R3(a4),R3,R4(v1),R4,R5(v2),R5,R6(v3),R6,R7(v4),R7,R8(v5),R8,R8_fiq,R9(SB,v6),R9,R9_fiq,R10(SL,v7),R10,R10_fiq,R11(FP,v8),R11,R11_fiq,R12(IP),R12,R12_fiq,R13(SP),R13,R13_svc,R13_abt,R13_und,R13_irq,R13_fiq,R14(LR),R14,R14_svc,R14_abt,R14_und,R14_irq,R14_fiq,R15(PC),R15,状态寄存器,CPSR,CPSR,SPSR,无,SPSR_abt,SPSR_abt,SPSR_und,SPSR_irq,SPSR_fiq,链接寄存器R14(LR),R14为链接寄存器(LR),在结构上有两个特殊功能:,在每种模式下,模式自身的R14版本用于保存子程序返回地址;,当发生异常时,将R14对应的异常模式版本设置为异常返回地址(有些异常有一个小的固定偏移量)。,Lable,程序A,程序B,R14,R14寄存器与子程序调用,BL Lable,地址A,?,MOV PC,LR,R14(地址,A),Lable,?,1.,程序A执行过程中调用程序B;,操作流程,2.,程序跳转至标号Lable,执行程序B。同时硬件将“BL Lable”指令的下一条指令所在地址存入R14;,3.,程序B执行最后,将R14寄存器的内容放入PC,返回程序A;,R14寄存器与异常发生,异常发生时,程序要跳转至异常服务程序,对返回地址的处理与子程序调用类似,都是由硬件完成的。,R14寄存器,当发生异常嵌套时,这些异常之间可能会发生冲突。,例如:如果用户在用户模式下执行程序时发生了IRQ中断,用户模式寄存器不会被破坏。但是如果允许在IRQ模式下的中断处理程序重新使能IRQ中断,并且发生了嵌套的IRQ中断时,外部中断处理程序保存在R14_irq中的任何值都将被嵌套中断的返回地址所覆盖。,R14寄存器注意,R14,R14_irq,用户模式下的程序,IRQ模式下的程序A,a,return,B,.,X,A,地址A,地址A,1.执行用户模式下的程序;,2.发生IRQ中断,硬件将某个地址存入IRQ模式下的R14_irq寄存器,用户模式下的R14没有被破坏;,3.IRQ服务程序A执行完毕,将R14_irq寄存器的内容减去某个常量后存入PC,返回之前被中断的程序;,未被破坏,R14寄存器注意要点,R14,R14_irq,用户模式下的程序,IRQ模式下的程序A,a,B,.,X,A,地址A,地址A,1.执行用户模式下的程序;,2.发生IRQ中断,硬件将某个地址存入IRQ模式下的R14_irq寄存器,用户模式下的R14没有被破坏;,3.IRQ服务程序A执行完毕,将R14_irq寄存器的内容减去某个常量后存入PC,返回之前被中断的程序;,未被破坏,IRQ模式下的程序B,a,ret
展开阅读全文