1、 第四章 ARM微处理器的编程模型与指令系统2022-4-1624.1 ARM微处理器的工作模式(续) ARM微处理器支持7种工作模式 Supervisor-管理模式(svc) 操作系统使用的保护模式 复位、软中断调用(SWI) Abort-中止模式(abt) 当数据或指令预取中止时进入该模式 可用于虚拟存储及存储保护 Undefined-未定义指令模式(und) 当未定义的指令执行时进入该模式 可用于支持硬件协处理器的软件仿真2022-4-1634.1 ARM微处理器的工作模式(续) 特权模式 除用户模式以外,其余6种模式称之为特权模式(Privileged Modes) 当处理器运行在用户
2、模式下时,某些被保护的系统资源是不能被访问的 异常模式 除去用户模式和系统模式以外的5种又称为异常模式(Exception Modes) 常用于处理中断或异常,以及需要访问受保护的系统资源等情况2022-4-1644.1 ARM微处理器的工作模式(续) 工作模式的改变 通过软件改变 系统调用 通过外部中断或异常处理改变 外部中断:IRQ、FIQ 来自中断控制器 异常处理 来自CPU内部2022-4-1654.1 ARM微处理器的工作模式(续) 工作模式的改变举例 SWI软件中断指令 SWI 0 x0 ; 调用0号软中断 SWI 0 x12 ; 调用12号软中断 IRQ外部中断 _irq voi
3、d HandlerTIMER5(void) timeval+;/ 当前时刻递增 pIC-I_ISPC = INT_TIMER5; / 清除中断请求位 2022-4-1664.2 ARM微处理器的工作状态 ARM微处理器的工作状态一般有两种 第一种为ARM状态 处理器执行32位的ARM指令 ARM指令要求字对齐 第二种为Thumb状态 处理器执行16位的Thumb指令 Thumb指令要求半字对齐2022-4-1674.2 ARM微处理器的工作状态(续) 工作状态切换 在程序的执行过程中,处理器可以随时在两种工作状态之间切换 处理器工作状态的转变并不影响处理器的工作模式和相应寄存器中的内容 ARM
4、微处理器在开始执行代码时总是处于ARM状态 也就是复位后进入ARM状态2022-4-1684.2 ARM微处理器的工作状态(续) 工作状态切换方法 进入Thumb状态 执行BX指令 BX:带状态切换的跳转指令 当操作数寄存器的最低位0为1时,可以使微处理器从ARM状态切换到Thumb状态 BX R0;R0的最低位0为1 处理器工作在Thumb状态,如果发生异常并进入异常处理子程序,则异常处理完毕返回时,自动从ARM状态切换到Thumb状态2022-4-1694.2 ARM微处理器的工作状态(续) 工作状态切换方法 进入ARM状态 执行BX指令 BX:带状态切换的跳转指令 当操作数寄存器的最低位
5、0为0时,可以使微处理器从Thumb状态切换到ARM 状态 BX R0;R0的最低位0为0 处理器工作在Thumb状态,如果发生异常并进入异常处理子程序,则进入时处理器自动从Thumb状态切换到ARM状态 2022-4-16104.2 ARM微处理器的工作状态(续) 工作状态切换举例BLabelCMPR1, #0BEQLabelADRLR0, ThumbFun+1BXR0BLXLabelBLX:下一条指令地址送往下一条指令地址送往LR寄存器;寄存器;Label送往送往PC,并完成状态切换,并完成状态切换2022-4-16114.3 ARM体系结构的寄存器组织 ARM处理器的寄存器 37个32位
6、寄存器 31个通用寄存器 6个状态寄存器 这些寄存器不能被同时访问 取决于处理器的 工作状态 工作模式2022-4-16124.3 ARM体系结构的寄存器组织 1 ARM状态下的寄存器组织 2 Thumb状态下的寄存器组织 3 程序状态寄存器2022-4-16131 ARM状态下的寄存器组织 通用寄存器 通用寄存器包括R0R15 可以分为三类 未分组寄存器R0R7 分组寄存器R8R14 程序计数器R15 (PC)2022-4-16141 ARM状态下的寄存器组织(续) 未分组寄存器R0R7 在所有的工作模式下,每个未分组寄存器都指向对应的一个物理寄存器 在中断或异常处理进行工作模式转换时,由于
7、不同的处理器工作模式均使用相同的物理寄存器,可能会造成寄存器中数据的破坏2022-4-16151 ARM状态下的寄存器组织(续) 分组寄存器R8R14 R8R12 每个寄存器对应2个不同的物理寄存器 当使用FIQ模式时,访问R8_fiqR12_fiq 当使用其他模式时,访问R8_usrR12_usr R13、R14 每个寄存器对应6个不同的物理寄存器 其中一个寄存器是用户模式与系统模式共用 另外5个物理寄存器对应于其他5种不同的工作模式 2022-4-16161 ARM状态下的寄存器组织(续) 不同物理寄存器的区分 R13_ R14_ mode为:usr、fiq、irq、svc、abt、und
8、 例如: R13_usr、R13_fiq、R13_irq R14_svc、R14_abt、R14_und2022-4-16171 ARM状态下的寄存器组织(续) R13寄存器 常用作堆栈指针SP(Stack Pointer),一种习惯用法 也可使用其他的寄存器作为堆栈指针 在Thumb指令集中,某些指令强制使用R13作为堆栈指针 在应用程序初始化时,一般都要初始化每种模式下的R13,使其指向该工作模式的栈空间2022-4-16181 ARM状态下的寄存器组织(续) R14寄存器 也称链接寄存器LR (Link Register) 当执行BL子程序调用指令时,R14中得到R15(程序计数器PC)
9、的备份 BL Label;下一条指令地址LR, LabelPC 当发生中断或异常时,对应的分组寄存器R14_svc、R14_irq、R14_fiq、R14_abt和R14_und用来保存R15的返回值 其他情况下,R14用作通用寄存器2022-4-16191 ARM状态下的寄存器组织(续) R14寄存器常用情形 1、常用用法(子程序返回) MOVPC, LR BXLR 2、在子程序入口处使用以下指令将R14存入堆栈 STMFDSP!, , LR 使用以下指令可以完成子程序返回 LDMFDSP!, , PC2022-4-161 ARM状态下的寄存器组织(续) R15寄存器 R15寄存器用作程序计
10、数器(PC) 在ARM状态下,位1:0为0,位31:2用于保存PC 在Thumb状态下,位0为0,位31:1用于保存PC 由于ARM体系结构采用了多级流水结构,对于ARM指令集而言,PC总是指向当前执行指令的下两条指令的地址,即PC的值为当前执行指令的地址值加8个字节 R15也可用作通用寄存器,但一般不这么使用 因为对R15的使用有一些特殊的限制,当违反了这些限制时,程序的执行结果是未知的2022-4-16211 ARM状态下的寄存器组织(续) CPSR寄存器 用作CPSR(Current Program Status Register) CPSR可在任何工作模式下被访问,它包括条件标志位、中
11、断禁止位、当前处理器模式标志位,以及其他一些相关的控制和状态位 异常模式下有一个专用的物理状态寄存器,称为SPSR(Saved Program Status Register) 当异常发生时,SPSR用于保存CPSR的当前值,从异常退出时则可由SPSR来恢复CPSR 用户模式和系统模式不属于异常模式,没有SPSR2022-4-16 国防科技大学计算机学院国防科技大学计算机学院601室室222022-4-16232 Thumb状态下的寄存器组织 Thumb状态下的寄存器集是ARM状态下寄存器集的一个子集 程序可以直接访问 8个通用寄存器(R7R0) 程序计数器(PC) 堆栈指针(SP) 连接寄存
12、器(LR) CPSR 在每一种异常模式下都有一组SP、LR和SPSR2022-4-16242022-4-16 国防科技大学计算机学院国防科技大学计算机学院601室室25两种工两种工作状态作状态下寄存下寄存器比较器比较2022-4-16263 程序状态寄存器 程序状态寄存器的构成 一个当前程序状态寄存器(CPSR) 五个备份程序状态寄存器(SPSR) 备份的程序状态寄存器用来进行异常处理 程序状态寄存器的功能 保存ALU中的当前操作信息 控制允许和禁止中断 设置处理器的工作模式 2022-4-16273 程序状态寄存器(续)2022-4-16283 程序状态寄存器(续) 条件码标志(Condit
13、ion Code Flags) N、Z、C、V均为条件码标志位 它们的内容可被算术或逻辑运算的结果所改变,并且可以决定某条指令是否被执行 在ARM状态下,绝大多数的指令都是有条件执行的 在Thumb状态下,仅有分支指令B是有条件执行的2022-4-16293 程序状态寄存器(续) 实例 C代码:if (ab) a+; else b+; Thumb代码:CMPR0, R1BHIA_ADDADDR1, R1, #1 BOVER A_ADDADDR0, R0, #1 OVER ARM代码: CMPR0, R1ADDHIR0, R0, #1ADDLSR1, R1, #1 2022-4-16303 程序
14、状态寄存器(续) 标志位N 当用两个补码表示的带符号数进行运算时 N=1 表示运算结果为负数 N=0 表示运算结果为正数或零 标志位Z Z=1 表示运算结果为零;Z=0 表示运算结果为非零 标志位V 对于加/减法运算指令,当操作数和运算结果为补码表示的带符号数时,V=1表示符号位溢出 对于其他的非加/减运算指令,V的值通常不改变2022-4-16313 程序状态寄存器(续) 标志位C 加法运算(包括比较指令CMN): 当运算结果产生了进位时(无符号数溢出),C=1,否则C=0 减法运算(包括比较指令CMP): 当运算时产生了借位(无符号数溢出),C=1,否则C=0 对于包含移位操作的非加/减运
15、算指令,C为移出值的最后一位 对于其他的非加/减运算指令,C的值通常不改变2022-4-16323 程序状态寄存器(续) 中断禁止位I和F I=1禁止IRQ中断;I=0允许IRQ中断 F=1禁止FIQ中断;F=0允许IRQ中断 运行状态控制位T 对于ARM v5及以上的T系列处理器,当该位为1时,程序运行于Thumb状态,否则运行于ARM状态 对于ARM v5及以上的非T系列处理器,当该位为1时,执行下一条指令以引起未定义指令异常;当该位为0时,表示运行于ARM状态 工作模式位M4:0 这些位决定了处理器的工作模式2022-4-1633M4:0处理器模式可访问的寄存器0b10000用户PC,C
16、PSR, R0-R140b10001FIQPC,CPSR, SPSR_fiq,R14_fiqR8_fiq, R7R00b10010IRQPC,CPSR, SPSR_irq,R14_irq, R13_irq, R12R00b10011管理PC,CPSR, SPSR_svc,R14_svc, R13_svc, R12R00b10111中止PC,CPSR, SPSR_abt,R14_abt, R13_abt, R12R00b11011未定义 PC,CPSR, SPSR_und,R14_und, R13_und, R12R03 程序状态寄存器(续)2022-4-1634本讲小结本讲小结n目的与要求目的
17、与要求掌握掌握ARM处理器的工作模式、工作状态、处理器的工作模式、工作状态、ARM状态下状态下的寄存器组织的寄存器组织熟悉熟悉Thumb状态下的寄存器组织、程序状态寄存器状态下的寄存器组织、程序状态寄存器n重点与难点重点与难点工作模式工作模式寄存器组织寄存器组织2022-4-16354.4 ARM微处理器的数据类型 字、半字、字节 字(Word):字的长度为32位 半字(Half-Word):半字的长度为16位 字节(Byte):字节的长度为8位 ARM微处理器要求自然对齐 字需要4字节对齐 地址的低两位为0 半字需要2字节对齐 地址的最低位为0 字节则是任意地址对齐 2022-4-16364
18、.4 ARM微处理器的数据类型(续) 边界对齐(数据存储) 如果一个数据是从偶地址开始的连续存储,那么它就是半字对齐,否则就是非半字对齐 如果一个数据是以能被4整除的地址开始的连续存储,那么它就是字对齐,否则就是非字对齐方式半字对齐字对齐地址0 x000000000 x000000020 x000000040 x000000000 x000000040 x00000008特征Bit0=0Bit1=0,Bit0=02022-4-16374.4 ARM微处理器的数据类型(续) ARM体系结构的存储结构 从零地址开始的以字节为单位的线性组合 从零字节到三字节放置第一个存储的字数据,从第四个字节到第七
19、个字节放置第二个存储的字数据,依次排列 作为32位的微处理器,ARM体系结构所支持的最大寻址空间为4GB(232字节) 受到物理地址线的限制,一般实际嵌入式处理器最大寻址空间为几百兆2022-4-16384.4 ARM微处理器的数据类型(续) ARM体系结构可以用两种方法存储字数据 大端格式(Big endian) 字数据的高字节存储在低地址中 字数据的低字节存放在高地址中 小端格式(Little endian) 与大端存储格式相反 低地址中存放的是字数据的低字节 高地址中存放的是字数据的高字节2022-4-1639大端格式(Big endian)2022-4-1640小端格式(Little
20、endian)2022-4-1641举例1 程序 LDR R0, =0 x11223344 LDR R1, =0 x00000100 STR R0, R1 LDRB R2, R1 R2=? 答案 小端模式:R2 = 0 x44 大端模式:R2 = 0 x11LDR 伪指令,使用以下项伪指令,使用以下项之一加载寄存器:之一加载寄存器: 一个一个 32 位常数值位常数值 一个地址一个地址LDR伪指令的形式:伪指令的形式:LDR Rn, =expr ; =而非而非#2022-4-16424.5 ARM微处理器的异常状态 当正常的程序执行流程发生暂时的停止时,称之为异常(Exception) 例如处理
21、一个外部的中断请求 在处理异常之前,当前处理器的状态必须保留,这样当异常处理完成之后,当前程序可以继续执行 处理器允许多个异常同时发生,它们将会按固定的优先级进行处理 中断优先级 中断嵌套2022-4-1643异常类型具体含义复位当处理器的复位电平有效时,产生复位异常,程序跳转到复位异常处理程序处执行未定义指令 当ARM处理器或协处理器遇到不能处理的指令时,产生未定义指令异常。可使用该异常机制进行软件仿真软件中断该异常由执行SWI指令产生,可用于用户模式下的程序调用特权操作指令。可使用该异常机制实现系统功能调用指令预取中止若处理器预取指令的地址不存在,或该地址不允许当前指令访问,存储器会向处理
22、器发出中止信号,但当预取的指令被执行时,才会产生指令预取中止异常数据中止若处理器数据访问的地址不存在,或该地址不允许当前指令访问时,产生数据中止异常IRQ(外部中断请求)当处理器的外部中断请求引脚有效,且CPSR中的I位为0时,产生IRQ异常。系统的外设可通过该异常请求中断服务2022-4-16444.5 ARM微处理器的异常状态(续) 1 对异常的响应 2 从异常返回 3 各类异常的具体描述 4 异常向量 5 异常优先级 6 应用程序中的异常处理2022-4-16451 对异常的响应 当出现异常后,ARM处理器会执行以下操作 1 将CPSR复制到相应的SPSR中 2 对CPSR进行设置 根据
23、异常类型,强制设置CPSR的工作模式位 设置中断禁止位,以禁止中断发生 如果处理器处于Thumb状态,则切换到ARM状态 3 将下一条指令的地址存入相应链接寄存器LR LR中保存的是下一条指令的地址(当前执行指令地址4或8,与异常类型有关) 4 强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处2022-4-16461 对异常的响应(续) ARM处理器对异常的响应过程用伪码描述为 SPSR_ = CPSR CPSR4:0 = Exception Mode Number CPSR5 = 0; 切换到ARM工作状态 If = Reset or FIQ then CPSR6
24、 = 1 ; 禁止新的FIQ异常 CPSR7 = 1; 禁止新的IRQ异常 R14_ = Return Link PC = Exception Vector Address CPU自动完成自动完成2022-4-1647程序程序AIRQ服务程序服务程序系统模式IRQ模式程序寄存器组程序在系统模式下运行用户程程序在系统模式下运行用户程序,假定当前处理器状态为序,假定当前处理器状态为Thumb状态、允许状态、允许IRQ中断中断用户程序运行时发生用户程序运行时发生IRQ中断,硬件完成以下动作:中断,硬件完成以下动作:LR_sysSPSR_irqLR_irqLRPCCPSRSPSRSYS1?0. . .
25、? ? ? ?MODTFI. . .N Z C V置位置位I位(禁止位(禁止IRQ中断)中断)清零清零T位(进入位(进入ARM状态)状态)设置设置MOD位,位,切换切换处理器处理器模式至模式至IRQ模式模式将下一条指令的地址将下一条指令的地址存入存入IRQ模式的模式的LR寄存器寄存器将将CPSR寄存器内容寄存器内容存入存入IRQ模式的模式的SPSR寄存器寄存器将跳转地址存入将跳转地址存入PC,实,实现现跳转跳转IRQ0?1. . .? ? ? ?BackAddrJumpAddrJumpSYS1?0. . .?“?”表示对该位不关心表示对该位不关心2022-4-16482 从异常返回 异常处理完
26、毕之后,ARM微处理器会执行以下几步操作从异常返回 1、将SPSR复制回CPSR中 2、将链接寄存器LR的值减去相应偏移量后送到PC中 注意 复位异常处理程序不需要返回编程(指令)完成编程(指令)完成2022-4-1649在异常处理结束后,异常处理程序完成以下动作:程序程序AIRQ服务程序服务程序系统模式系统模式IRQIRQ模式模式程序程序寄存器组寄存器组LR_sysSPSR_irqLR_irqLRPCCPSRSPSRSYS1?0. . .? ? ? ?MODTFI. . .N Z C V将SPSR寄存器的值复制回CPSR寄存器;将LR寄存的值减去一个常量后复制到PC寄存器,跳转到被中断的用户
27、程序。IRQ0?1. . .? ? ? ?BackAddrJumpAddrreturnSYS1?0. . .?SYS1?0. . .? ? ? ?BackAddr-4Jump“?”表示对该位不关心表示对该位不关心2022-4-16503 各类异常的具体描述 复位的响应过程 SPSR_svc = CPSR (不可预知) CPSR4:0 = 0b10011 CPSR5 = 0; 切换到ARM工作状态 CPSR6 = 1; 禁止新的FIQ异常 CPSR7 = 1; 禁止新的IRQ异常 R14_svc = Return Link(不可预知) PC = 0 x00000000 2022-4-16513
28、各类异常的具体描述(续) Undefined Instruction(未定义指令) 当ARM处理器遇到不能处理的指令时,会产生未定义指令异常 采用这种机制,可以通过软件仿真扩展ARM或Thumb指令集 在未定义指令处理程序中执行以下指令返回 MOVS PC, R14_und 恢复PC(从R14_und)和CPSR(从SPSR_und)的值,并返回到未定义指令后的下一条指令 指令加后缀“S”且目的寄存器为PC则自动复制2022-4-16523 各类异常的具体描述(续) 未定义指令异常的响应过程 SPSR_und = CPSR CPSR4:0 = 0b11011 CPSR5 = 0; 切换到ARM
29、工作状态 / CPSR6保持不变 CPSR7 = 1; 禁止新的IRQ异常 R14_und = Return Link PC = 0 x000000042022-4-16533 各类异常的具体描述(续) Software Interrupt(软件中断) 软件中断指令(SWI)用于进入管理模式,常用于请求执行特定的管理功能 在 ARM 上写的操作系统典型的使用 SWI 来为编程者提供各种例程 在软件中断处理程序中执行以下指令返回 MOVS PC, R14_svc 恢复PC(从R14_svc)和CPSR(从SPSR_svc)的值,并返回到SWI的下一条指令 指令加后缀“S”且目的寄存器为PC则自动
30、复制2022-4-16543 各类异常的具体描述(续) SWI的响应过程 SPSR_svc = CPSR CPSR4:0 = 0b10011 CPSR5 = 0; 切换到ARM工作状态 / CPSR6保持不变 CPSR7 = 1; 禁止新的IRQ异常 R14_svc = Return Link PC = 0 x00000008 2022-4-16553 各类异常的具体描述(续) ABORT(中止) 产生中止异常意味着对存储器的访问失败 中止异常包括两种类型: 指令预取中止:发生在指令预取时 数据中止:发生在数据访问时 当确定中止原因后,Abort处理程序执行以下指令返回 SUBS PC, R1
31、4_abt, #4 ; 指令预取中止 SUBS PC, R14_abt, #8 ; 数据中止 恢复PC(从R14_abt)和CPSR(从SPSR_abt)的值,并重新执行产生中止的指令(返回当前指令)2022-4-16563 各类异常的具体描述(续) 中止异常的响应过程 SPSR_abt = CPSR CPSR4:0 = 0b10111 CPSR5 = 0; 切换到ARM工作状态 / CPSR6保持不变 CPSR7 = 1; 禁止新的IRQ异常 R14_abt = Return Link PC = 0 x0000000c/ 0 x000000102022-4-16573 各类异常的具体描述(续
32、) IRQ(Interrupt Request) IRQ异常属于正常的中断请求,IRQ优先级低于FIQ 若CPSR的I位置1,则禁止IRQ中断,若CPSR的I位清零,处理器会在指令执行完之前检查IRQ的输入 注意只有在特权模式下才能改变I位的状态 IRQ处理程序执行以下指令返回 SUBS PC , R14_irq , #4 该指令将寄存器R14_irq的值减去4后,复制到程序计数器PC中,同时将SPSR_irq寄存器的内容复制到CPSR中,并返回到引起中断的下一条指令2022-4-16583 各类异常的具体描述(续) IRQ的响应过程 SPSR_irq = CPSR CPSR4:0 = 0b1
33、0010 CPSR5 = 0; 切换到ARM工作状态 / CPSR6保持不变 CPSR7 = 1; 禁止新的IRQ异常 R14_irq = Return Link PC = 0 x000000182022-4-16593 各类异常的具体描述 FIQ(Fast Interrupt Request) FIQ异常是为了支持数据传输或者通道处理而设计的 若将CPSR的F位置1,则禁止FIQ中断,若将CPSR的F位清零,处理器会在指令执行时检查FIQ的输入 注意只有在特权模式下才能改变F位的状态 FIQ处理程序执行以下指令返回 SUBS PC, R14_fiq , #4 该指令将寄存器R14_fiq的值
34、减去4后,复制到程序计数器PC中,同时将SPSR_fiq寄存器的内容复制到CPSR中,并返回到引起中断的下一条指令2022-4-16603 各类异常的具体描述(续) FIQ的响应过程 SPSR_fiq = CPSR CPSR4:0 = 0b10001 CPSR5 = 0; 切换到ARM工作状态 CPSR6 = 1; 禁止新的FIQ异常 CPSR7 = 1; 禁止新的IRQ异常 R14_fiq = Return Link PC = 0 x0000001c2022-4-16613 各类异常的具体描述(续)返回指令R14_x先前的值BLMOV PC, R14下一条指令地址未定义指令MOVS PC,
35、R14_und下一条指令地址SWIMOVS PC, R14_svc 下一条指令地址指令预取SUBS PC, R14_abt, #4下一条指令地址数据预取SUBS PC, R14_abt, #8下一条指令地址+4IRQSUBS PC, R14_irq, #4下一条指令地址+42022-4-16624 异常向量(Exception Vectors) 地 址异 常进入模式0 x0000,0000复位管理模式0 x0000,0004未定义指令未定义模式0 x0000,0008软件中断管理模式0 x0000,000C中止(预取指令)中止模式0 x0000,0010中止(数据)中止模式2022-4-166
36、34 异常向量(续); Exception Vectors; Mapped to Address 0. ; Absolute addressing mode must be used.Vectors LDR PC, Reset_Address LDR PC, Undef_Address LDR PC, SWI_Address LDR PC, PAbt_Address LDR PC, DAbt_Address NOP ; Reserved Vector LDR PC, IRQ_Address LDR PC, FIQ_Address2022-4-16645 异常优先级(Exception Prio
37、rities) 优先级异 常1(最高)复位2数据中止3FIQ4IRQ5预取指令中止6(最低)未定义指令、SWI2022-4-16656 应用程序中的异常处理 应用程序首先要进行异常处理 当系统运行时,异常可能会随时发生,因此要保证在发生异常时ARM处理器不至于处于未知状态 采用的方式 是在异常向量表中的特定位置放置一条跳转指令,跳转到异常处理程序 异常处理过程 当发生异常时,程序计数器PC会被强制(自动)设置为对应的异常向量,从而(自动)跳转到异常处理程序,当异常处理完成以后,返回到主程序继续执行 2022-4-1666/*程序段说明程序段说明 : 以下函数为各异常模式服务子程序。以下函数为各
38、异常模式服务子程序。 设成死循环是为调试用,一旦发生此类异常,设成死循环是为调试用,一旦发生此类异常, 程序便跳入异常模式服务子程序,终止程序运行。程序便跳入异常模式服务子程序,终止程序运行。*/void HaltUndef(void)/ 未定义未定义程序跑飞程序跑飞 Uart_Printf(0, the programm is haltUndefed); while(1);void HaltSwi(void)/ 软中断软中断 Uart_Printf(0, the programm is haltSWI); while(1);2022-4-1667void HaltPabort(void)/
39、预取指令中止预取指令中止 Uart_Printf(0, the programm is haltPaborted); while(1);void HaltDabort(void)/ 数据中止数据中止程序跑飞程序跑飞 Uart_Printf(0, the programm is haltdaborted); while(1);void HaltFIQ(void)/ 快速中断快速中断 Uart_Printf(0, the programm is haltdFIQ); while(1);2022-4-1668; 异常向量表异常向量表; Exception Vectors; Mapped to Add
40、ress 0. ; Absolute addressing mode must be used.Vectors LDR PC, HandleReset LDR PC, HaltUndef LDR PC, HaltSwi LDR PC, HaltPabort LDR PC, HaltDabort NOP ; Reserved Vector LDR PC, HandleIRQ LDR PC, HaltFIQ2022-4-1669本讲小结本讲小结n目的与要求目的与要求掌握数据类型、异常向量表和异常程序设计掌握数据类型、异常向量表和异常程序设计熟悉边界对齐、大小端格式熟悉边界对齐、大小端格式了解了解A
41、RM处理器的异常处理机制处理器的异常处理机制n重点与难点重点与难点数据类型、异常向量表和异常程序设计数据类型、异常向量表和异常程序设计边界对齐、异常程序设计边界对齐、异常程序设计2022-4-1670ARM微处理器的指令系统 一、ARM微处理器的寻址方式 二、ARM微处理器的指令集概述 三、ARM指令集 四、Thumb指令集2022-4-1671一、ARM微处理器的寻址方式 寻址方式 就是处理器根据指令中给出的地址信息来寻找物理地址的方式 ARM指令系统的寻址方式 1 立即寻址 2 寄存器寻址 3 寄存器间接寻址 4 基址寻址 5 相对寻址 6 多寄存器寻址 7 堆栈寻址 2022-4-167
42、21 立即寻址 立即寻址也叫立即数寻址 这是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数。这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址 例如 ADD R0, R0, 1; R0R01 ADD R0, R0, 0 x3f ; R0R00 x3f 在以上两条指令中,第二个源操作数即为立即数,要求以“”为前缀,对于以十六进制表示的立即数,还要求在“”后加上“0 x”或“&” 立即数一般为8位(超过8位使用伪指令LDR)2022-4-16732 寄存器寻址 寄存器寻址就是利用寄存器中的数值作为操作数 这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率
43、较高的寻址方式 例如 ADD R0, R1, R2; R0R1R2 该指令的执行效果是将寄存器R1和R2的内容相加,其结果存放在寄存器R0中 2022-4-16743 寄存器间接寻址 寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中 例如 ADD R0, R1, R2 ; R0R1R2 LDR R0, R1 ; R0R1 STR R0, R1 ; R1R0 在第一条指令中,以寄存器R2的值作为操作数的地址,在存储器中取得一个操作数后与R1相加,结果存入寄存器R0中LDR/STR:左寄存器,右存储器:左寄存器,右存储器2022-4-16754 基址寻址 基址寻址就是将
44、寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址 基址寻址方式常用于访问某基地址附近的单元 采用基址寻址方式的指令常见有以下几种形式 LDR R0, R1, 4 ; R0R14 LDR R0, R1, 4! ; R0R14、R1R14 LDR R0, R1, 4 ; R0R1、R1R14 LDR R0, R1, R2 ; R0R1R22022-4-16765 相对寻址 相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址 以下程序段完成子程序的调用和返回,跳转指令BL采用了相对寻址方式 BL
45、 SORT; 跳转到子程序处执行 SORT MOV PC, LR; 从子程序返回 2022-4-16776 多寄存器寻址 采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送,最多传送16个通用寄存器的值 例如 LDMIA R0!, R1, R2, R3, R4 ; R1R0,R0=R0+4 ; R2R0,R0=R0+4 ; R3R0,R0=R0+4 ; R4R0,R0=R0+4 指令后缀IA表示在每次执行操作后R0按字长度增加 注意:在寄存器列表中同一寄存器仅能指定一次;加载/存储操作按照寄存器固定次序进行,所以寄存器排列先后关系随意LDM/STM:左存储器,右寄存器:左存储器,右寄存器
46、STMIA SP!, R0, R1LDMIA SP!, R1, R02022-4-16787 堆栈寻址 堆栈按先进后出(FILO)的方式工作 根据堆栈指针指向来分 堆栈指针指向最后一个压入堆栈的数据时,称为满堆栈 堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈 根据堆栈的生成方式 堆栈指针递增计数递增堆栈 堆栈指针递减计数递减堆栈2022-4-16797 堆栈寻址(续) ARM微处理器支持这四种类型的堆栈工作方式 满递增堆栈:堆栈指针指向最后压入的数据,且由低地址向高地址生成LDMFA, STMFA 满递减堆栈:堆栈指针指向最后压入的数据,且由高地址向低地址生成LDMFD, STMFD
47、空递增堆栈:堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成LDMEA, STMEA 空递减堆栈:堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成LDMED, STMED STMFD SP!, R0-R7, LR LR最先进栈,R0最后 LDMFD SP!, R0-R7, PC R0最先出栈,PC最后STMFD SP!, R0-R7, LRLDMFD SP!, PC, R0-R72022-4-1680二、ARM微处理器的指令集概述 ARM微处理器的指令集是Load/Store型 注意:可以使用间接寻址等方式访问存储器,注意和纯RISC处理器的区别 1 指令格式 2
48、指令助记符 3 指令条件域2022-4-16811 指令格式 S , , operand2 opcode:指令助记符,如ADD, LDR, STR cond:执行条件,如NE, EQ S:是否影响CPSR的值 Rd:目标寄存器 Rn:第一操作数寄存器 operand2:第二操作数灵活使用第二操作数能够提高代码质量 例子:ADDEQS R0, R1, 0 x3f2022-4-1682助记符指令功能描述ADC带进位加法指令ADD加法指令AND逻辑与指令B跳转指令BIC位清零指令BL带返回的跳转指令BLX带返回和状态切换的跳转指令BX带状态切换的跳转指令CDP协处理器数据操作指令CMN取负比较指令C
49、MP比较指令2 指令助记符2022-4-1683助记符指令功能描述EOR异或指令LDC存储器到协处理器的数据传输指令LDM加载多个寄存器指令LDR存储器到寄存器的数据传输指令MCR从ARM寄存器到协处理器寄存器的数据传输指令MLA乘加运算指令MOV数据传送指令MRC从协处理器寄存器到ARM寄存器的数据传输指令MRS传送CPSR或SPSR的内容到通用寄存器指令MSR传送通用寄存器到CPSR或SPSR的指令2022-4-1684助记符指令功能描述ORR逻辑或指令RSB反向减法指令RSC带借位的反向减法指令SBC带借位减法指令STC协处理器寄存器写入存储器指令STM批量内存字写入指令STR寄存器到存
50、储器的数据传输指令SUB减法指令SWI软件中断指令SWP交换指令TEQ相等测试指令TST位测试指令2022-4-16853 指令条件域 条件执行 当处理器工作在ARM状态时,几乎所有的指令均根据CPSR中条件码的状态和指令的条件域有条件的执行 当指令的执行条件满足时,指令被执行,否则忽略 条件码 每一条ARM指令包含4位的条件码,位于指令码的最高4位31:28 条件码共有15种,每种条件码可用两个字符表示,这两个字符可添加在指令助记符的后面2022-4-1686条件码助记符后缀标 志含 义0000EQZ=1相等0001NEZ=0不相等0010CSC=1无符号数大于或等于0011CCC=0无符号