1、2,C H A P T E R,ARM7体系结构,第2章 ARM7体系结构,2.4 异常 2.5 ARM寻址方式,第2章 ARM7体系结构,2.4 异常 2.5 ARM寻址方式,2.4 异常,简介,异常是指由内部或外部产生的引起处理器处理的事件,只要正常的程序被暂时中止,处理器就进入异常模式。例如响应一个来自外设的中断。在处理异常之前,ARM7TDMI内核保存当前的处理器状态(CPSR-SPSR),这样当处理程序结束时可以恢复执行原来的程序(SPSR-CPSR)。同一时刻可能会出现多个异常,如果同时发生两个或更多异常,那么将按照固定的顺序来处理异常。,异常类型,注: 发生异常后进入高端/正常向
2、量由硬件配置决定。,当多个异常同时发生时,一个固定的优先级系统决定它们被处理的顺序:,2.4 异常,异常优先级,异常入口/出口汇总,注意:“MOVS PC,R14_svc”是指在管理模式执行MOVS PC,R14指令。“MOVS PC,R14_und”、“SUBS PC,R14_abt,#4”等指令也是类似的。,2.4 异常,异常的入口和出口处理,如果异常处理程序已经把返回地址拷贝到堆栈,那么可以使用一条多寄存器传送指令来恢复用户寄存器并实现返回。,SUB LR,LR,#4 ;计算返回地址 STMFD SP!,R0-R3,LR ;保存使用到的寄存器 . . . LDMFD SP!,R0-R3,
3、PC ;中断返回,中断处理代码的开始部分和退出部分,如果异常处理程序已经把返回地址拷贝到堆栈,那么可以使用一条多寄存器传送指令来恢复用户寄存器并实现返回。,中断处理代码的开始部分和退出部分,2.4 异常,异常的入口和出口处理,SUB LR,LR,#4 ;计算返回地址 STMFD SP!,R0-R3,LR ;保存使用到的寄存器 . . . LDMFD SP!,R0-R3,PC ;中断返回,注意:中断返回指令的寄存器列表(其中必须包括PC)后的“”符号表示这是一条特殊形式的指令。这条指令在从存储器中装载PC的同时(PC是最后恢复的),CPSR也得到恢复。这里使用的堆栈指针SP(R13)是属于异常模
4、式的寄存器,每个异常模式有自己的堆栈指针。这个堆栈指针应必须在系统启动时初始化。,2.4 异常,进入异常,在异常发生后,ARM7TDMI内核会作以下工作:,1.在适当的LR中保存下一条指令的地址,当异常入口来自: ARM状态,那么ARM7TDMI将当前指令地址加4或加8复制(取决于异常的类型)到LR中; 为Thumb状态,那么ARM7TDMI将当前指令地址加2、4或加8 (取决于异常的类型)复制到LR中;异常处理器程序不必确定状态。,2.4 异常,进入异常,在异常发生后,ARM7TDMI内核会做以下工作:,2.将CPSR复制到对应的SPSR中; 3. 将CPSR模式位强制设置为与异常类型相对应
5、的值; 4.强制PC从相关的异常向量处取指。,ARM7TDMI内核在中断异常时置位中断禁止标志,这样可以防止不受控制的异常嵌套。 注:异常总是在ARM状态中进行处理。当处理器处于Thumb状态时发生了异常,在异常向量地址装入PC时,会自动切换到ARM状态。,2.4 异常,进入异常,当异常结束时,异常处理程序必须: 1.将LR( R14 )中的值减去偏移量后存入PC,偏移量根据异常的类型而有所不同; 2.将SPSR的值复制回CPSR; 3.清零在入口置位的中断禁止标志。 注:恢复CPSR的动作会将T、F和I位自动恢复为异常发生前的值。,2.4 异常,退出异常,图示进入异常过程,1. 程序在系统模
6、式下运行用户程序,假定当前处理器状态为Thumb状态、允许IRQ中断;,2. 用户程序运行时发生IRQ中断,硬件完成以下动作:,置位I位(禁止IRQ中断) 清零T位(进入ARM状态) 设置MOD位,切换处理器模式至IRQ模式,将下一条指令的地址存入IRQ模式的LR寄存器,将CPSR寄存器内容存入IRQ模式的SPSR寄存器,将跳转地址存入PC,实现跳转,BackAddr,JumpAddr,“?”表示对该位不关心,在异常处理结束后,异常处理程序完成以下动作:,图示退出异常过程,将SPSR寄存器的值复制回CPSR寄存器;,将LR寄存的值减去一个常量后复制到PC寄存器,跳转到被中断的用户程序。,Bac
7、kAddr,JumpAddr,return,BackAddr-4,“?”表示对该位不关心,快速中断请求(FIQ)适用于对一个突发事件的快速响应,这得益于在ARM状态中,快中断模式有8个专用的寄存器可用来满足寄存器保护的需要(这可以加速上下文切换的速度)。不管异常入口是来自ARM状态还是Thumb状态,FIQ处理程序都会通过执行下面的指令从中断返回: SUBS PC,R14_fiq,#4在一个特权模式中,可以通过置位CPSR中的F位来禁止FIQ异常。,2.4 异常,快速中断请求,中断请求(IRQ)异常是一个由nIRQ输入端的低电平所产生的正常中断(在具体的芯片中,nIRQ由片内外设拉低,nIRQ
8、是内核的一个信号,对用户不可见)。IRQ的优先级低于FIQ。对于FIQ序列它是被屏蔽的。任何时候在一个特权模式下,都可通过置位CPSR中的I 位来禁止IRQ。 不管异常入口是来自ARM状态还是Thumb状态,IRQ处理程序都会通过执行下面的指令从中断返回: SUBS PC,R14_irq,#4,2.4 异常,中断请求,中止发生在对存储器的访问不能完成时,中止包含两种类型: 预取中止 发生在指令预取过程中 数据中止 发生在对数据访问时,2.4 异常,中止,当发生预取中止时,ARM7TDMI内核将预取的指令标记为无效,但在指令到达流水线的执行阶段时才进入异常。如果指令在流水线中因为发生分支而没有被
9、执行,中止将不会发生。 在处理中止的原因之后,不管处于哪种处理器操作状态,处理程序都会执行下面的指令恢复PC和CPSR并重试被中止的指令:SUBS PC,R14_abt,#4,2.4 异常,中止预取指中止,当发生数据中止后,根据产生数据中止的指令类型作出不同的处理:,2.4 异常,中止数据中止,数据转移指令(LDR、STR)回写到被修改的基址寄存器。中止处理程序必须注意这一点; 交换指令(SWP)中止好像没有被执行过一样(中止必须发生在SWP指令进行读访问时) ;,在修复产生中止的原因后,不管处于哪种处理器操作状态,处理程序都必须执行下面的返回指令,重试被中止的指令 :SUBS PC,R14_
10、abt,#8,2.4 异常,中止数据中止,使用软件中断(SWI)指令可以进入管理模式,通常用于请求一个特定的管理函数。SWI处理程序通过执行下面的指令返回: MOVS PC,R14_svc这个动作恢复了PC并返回到SWI之后的指令。SWI处理程序读取操作码以提取SWI函数编号。,2.4 异常,软件中断指令,当ARM7TDMI处理器遇到一条自己和系统内任何协处理器都无法处理的指令时,ARM7TDMI内核执行未定义指令陷阱。软件可使用这一机制通过模拟未定义的协处理器指令来扩展ARM指令集。,2.4 异常,未定义的指令,在模拟处理了失败的指令后,陷阱程序执行下面的指令: MOVS PC,R14_sv
11、c这个动作恢复了PC并返回到未定义指令之后的指令。,2.4 异常,未定义的指令,第2章 ARM7体系结构,2.4 异常 2.5 ARM寻址方式,2.5 ARM处理器寻址方式,寻址方式分类,寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。ARM处理器具有9种基本寻址方式。 1.寄存器寻址; 2.立即寻址; 3.寄存器移位寻址; 4.寄存器间接寻址; 5.变址寻址; 6.多寄存器寻址; 7.堆栈寻址; 8.块拷贝寻址; 9.相对寻址。,操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值来操作。寄存器寻址指令举例如下: MOV R1,R2 ;将
12、R2的值存入R1 SUB R0,R1,R2 ;将R1的值减去R2的值,结果保存到R0,2.5 ARM处理器寻址方式,寻址方式分类1 寄存器寻址,MOV R1,R2,0xAA,立即寻址指令中的操作码字段后面的地址码部分即是操作数本身,也就是说,数据就包含在指令当中,取出指令也就取出了可以立即使用的操作数(这样的数称为立即数)。立即寻址指令举例如下: SUBS R0,R0,#1 ;R0减1,结果放入R0,并且影响标志位 MOV R0,#0xFF000 ;将立即数0xFF000装入R0寄存器,2.5 ARM处理器寻址方式,寻址方式分类2 立即寻址,MOV R0,#0xFF00,0xFF00,从代码中
13、获得数据,寄存器移位寻址是ARM指令集特有的寻址方式。当第2个操作数是寄存器移位方式时,第2个寄存器操作数在与第1个操作数结合之前,选择进行移位操作。寄存器移位寻址指令举例如下: MOV R0,R2,LSL #3 ;R2的值左移3位,结果放入R0, ;即是R0=R28 ANDS R1,R1,R2,LSL R3 ;R2的值左移R3位,然后和R1相 ;“与”操作,结果放入R1,2.5 ARM处理器寻址方式,寻址方式分类3 寄存器移位寻址,MOV R0,R2,LSL #3,0x08,0x08,逻辑左移3位,寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在寄存器指定地址的存
14、储单元中,即寄存器为操作数的地址指针。寄存器间接寻址指令举例如下: LDR R1,R2 ;将R2指向的存储单元的数据读出;保存在R1中 SWP R1,R1,R2 ;将寄存器R1的值和R2指定的存储;单元的内容交换,2.5 ARM处理器寻址方式,寻址方式分类4 寄存器间接寻址,LDR R0,R2,0xAA,变址寻址就是将基址寄存器的内容与指令中给出的偏移量(4K)相加/减,形成操作数的有效地址。基址寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能部件寄存器访问等。寄存器间接寻址是偏移量为0的基址加偏移寻址。 变址寻址指令举例如下(前索引寻址): LDR R2,R3,#0x0C ;读取R
15、3+0x0C地址上的存储单元;的内容,放入R2,2.5 ARM处理器寻址方式,寻址方式分类5 变址寻址,LDR R2,R3,#0x0C,0xAA,将R3+0x0C作为地址装载数据,变址寻址指令举例如下: LDR R0,R1 ,#4 ;R0=R1,R1R14 ;后索引基址寻址;ARM这种自动索引机制不消耗额外的时间 LDR R0,R1,R2 ;R0=R1+R2 ; 基址加索引寻址;,2.5 ARM处理器寻址方式,寻址方式分类5 变址寻址,多寄存器寻址一次可传送几个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器。多寄存器寻址指令举例如下: LDMIA R1!,R2-R4,R6 ;将R
16、1指向的单元中的数据读出到;R2R4、R6中(R1自动加16) STMIA R0!,R2-R4,R6 ;将寄存器R2R4、R12的值保;存到R0指向的存储; 单元中;(R0自动加16),2.5 ARM处理器寻址方式,寻址方式分类6 多寄存器寻址,LDR R1!,R2-R4,R6,0x40000000,堆栈是一个按特定顺序进行存取的存储区,操作顺序为“后进先出” 。堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存储单元即是堆栈的栈顶。存储器堆栈可分为两种: 向上生长:向高地址方向生长,称为递增堆栈 向下生长:向低地址方向生长,称为递减堆栈,2.5 AR
17、M处理器寻址方式,寻址方式分类7 堆栈寻址,2.5 ARM处理器寻址方式,寻址方式分类7 堆栈寻址,0x12345678,0x12345678,堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个待压入数据的空位置,称为空堆栈。,2.5 ARM处理器寻址方式,寻址方式分类7 堆栈寻址,0x12345678,所以可以组合出四种类型的堆栈方式: 满递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA、STMFA等; 空递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA、STMEA等; 满递减:堆栈通
18、过减小存储器的地址向下增长,堆栈指针指向内含有效数据项的最低地址。指令如LDMFD、STMFD等; 空递减:堆栈通过减小存储器的地址向下增长,堆栈指针向堆栈下的第一个空位置。指令如LDMED、STMED等。,2.5 ARM处理器寻址方式,寻址方式分类7 堆栈寻址,多寄存器传送指令用于将一块数据从存储器的某一位置拷贝到另一位置。 如: STMIA R0!,R1-R7 ;将R1R7的数据保存到存储器中。;存储指针R0在保存第一个值之后增加,;增长方向为向上增长。 STMIB R0!,R1-R7 ;将R1R7的数据保存到存储器中。;存储指针R0在保存第一个值之前增加,;增长方向为向上增长。,2.5 ARM处理器寻址方式,寻址方式分类8 块拷贝寻址,相对寻址是基址寻址的一种变通。由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。相对寻址指令举例如下:BL SUBR1 ;调用到SUBR1子程序BEQ LOOP ;条件跳转到LOOP标号处. LOOP MOV R6,#1. SUBR1 .,2.5 ARM处理器寻址方式,寻址方式分类9 相对寻址,回顾,2.4 异常 2.5 ARM寻址方式,