arm中断返回地址详细分析.
arm中断实验的实验报告
arm中断实验的实验报告ARM中断实验的实验报告引言:ARM中断是一种常用的处理器功能,它可以在特定条件下中断当前的程序执行,转而执行指定的中断服务程序。
本次实验旨在通过ARM中断实验,深入了解中断的原理和应用。
一、实验背景ARM中断是ARM处理器中的一种重要功能,它可以在特定条件下中断当前的程序执行,转而执行指定的中断服务程序。
中断可以分为外部中断和内部中断两种类型。
外部中断是指来自外部设备的中断请求,例如外部设备的输入信号变化;内部中断是指来自处理器内部的中断请求,例如算术溢出、指令错误等。
二、实验目的1. 了解中断的概念和原理;2. 掌握ARM中断的实现方法;3. 学习如何编写中断服务程序。
三、实验步骤1. 准备实验环境:搭建ARM开发板,连接必要的外设;2. 配置中断控制器:根据实验需求,配置中断控制器的相关寄存器,使其能够正确响应中断请求;3. 编写中断服务程序:根据实验需求,编写中断服务程序,实现中断处理的相关功能;4. 运行实验程序:将编写好的程序下载到ARM开发板上,运行程序,观察中断的触发和响应情况;5. 实验结果分析:根据实验结果,分析中断的触发条件、中断服务程序的执行情况等。
四、实验结果与分析通过实验,我们成功实现了ARM中断的功能。
在实验过程中,我们配置了外部设备的中断引脚,当引脚状态发生变化时,中断控制器会产生中断请求,处理器则会立即中断当前的程序执行,转而执行中断服务程序。
在中断服务程序中,我们可以完成一些特定的操作,例如读取外设数据、更新系统状态等。
实验结果表明,中断服务程序能够正确地响应中断请求,并完成相应的操作。
五、实验总结本次实验通过ARM中断的实验,我们深入了解了中断的原理和应用。
中断是一种重要的处理器功能,它可以在特定条件下中断当前的程序执行,转而执行指定的中断服务程序。
掌握了中断的实现方法和编写中断服务程序的技巧,我们可以在实际应用中更好地利用中断功能,提高系统的响应速度和稳定性。
ARM的异常处理学习笔记转贴
ARM 的异常处理学习笔记转贴ARM的异常处理这部分比较不好理解。
当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。
当异常中断处理程序执行完成后,程序返回到发生中断指令的下条指令处执行。
在进入异常中断处理程序时,要保存被中断程序的执行现场,从异常中断处理程序退出时,要恢复被中断程序的执行现场。
1、引起异常的原因(1)、指令执行引起的异常软件中断、未定义指令(包括所要求的协处理器不存在是的协处理器指令)、预取址中止(存储器故障)、数据中止。
(2)、外部产生的中断复位、FIQ、IRQ。
2、ARM中异常中断的种类(1)、复位(RESET)a、当处理器复位引脚有效时,系统产生复位异常中断,程序跳转到复位异常中断处理程序处执行,包括系统加电和系统复位。
b、通过设置PC跳转到复位中断向量处执行称为软复位。
(2)、未定义的指令当ARM处理器或者是系统中的协处理器认为当前指令未定义时,产生未定义的指令异常中断,可以通过改异常中断机制仿真浮点向量运算。
(3)、软件中断这是一个由用户定义的中断指令(SWI)。
可用于用户模式下的程序调用特权操作指令。
在实时操作系统中可以通过该机制实现系统功能调用。
(4)、指令与取终止(Prefech Abort)如果处理器预取的指令的地址不存在,或者该地址不允许当前指令访问,当被预取的指令执行时,处理器产生指令预取终止异常中断。
(5)、数据访问终止(DATAABORT)如果数据访问指令的目标地址不存在,或者该地址不允许当前指令访问,处理器产生数据访问终止异常中断。
(6)、外部中断请求(IRQ)当处理器的外部中断请求引脚有效,而且CPSR的寄存器的I控制位被清除时,处理器产生外部中断请求异常中断。
系统中个外设通过该异常中断请求处7)、快速中断请求(FIQ) 理服务。
(当处理器的外部快速中断请求引脚有效,而且CPSR的F控制位被清除时,处理器产生外部中断请求异常中断。
arm汇编程序退出方式
arm汇编程序退出方式1.引言概述部分的内容如下所示:1.1 概述ARM汇编语言是一种低级的程序设计语言,专门用于编写ARM架构下的机器指令。
与高级语言相比,ARM汇编语言更加底层且与硬件关联密切,可以直接操作寄存器、内存和设备等。
在编写ARM汇编程序时,了解如何正确退出程序是非常重要的。
程序的退出方式通常有两种:正常退出和异常退出。
正常退出是指程序在完成所需的任务后,通过一系列指令主动结束程序的执行。
异常退出是指在程序执行过程中发生了错误或异常情况,导致程序意外终止。
无论是正常退出还是异常退出,程序的结束都需要进行一系列的清理工作,如关闭文件、释放内存等,以确保程序能够正确退出并回收资源。
在ARM汇编程序中,正常退出通常通过以下几种方式实现:1. 返回指令:使用指令`BX LR`或`MOV PC, LR`将程序的执行流程返回到调用该函数的位置。
这通常用于函数的正常返回。
2. 终止指令:使用指令`MOV PC, 0`或`MOV PC, R0`将程序的执行流程直接跳转到地址0处,从而结束程序的执行。
这通常用于主程序的结束。
异常退出则需要通过异常处理机制来实现,例如使用相关的中断处理程序或异常处理程序。
当程序发生异常情况时,处理程序会根据异常类型进行相应的处理和清理工作,最终将程序的执行流程返回到预定的位置。
本文将重点讨论ARM汇编程序的退出方式,以及如何正确地进行清理工作,确保程序的正常退出和资源的释放。
在接下来的章节中,我们将详细介绍不同的退出方式,并提供示例代码以说明其用法和注意事项。
1.2文章结构1.2 文章结构本文将围绕ARM汇编程序的退出方式展开讨论。
首先在引言部分进行了概述,介绍了本文的背景和意义。
接着通过文章结构的说明,将向读者展示本文的组织架构和思路。
在正文部分,将重点讨论两个要点,分别是“第一个要点”和“第二个要点”。
通过详细的解释和实例分析,将阐明ARM汇编程序退出的不同方式及其相关的特点和优缺点。
ARM异常后返回的几种情况
ARM异常后返回的几种情况当ARM处理器执行指令时,可能会遇到异常条件。
异常是一种CPU的响应,用于处理系统的特殊情况,例如错误指令,中断和系统调用。
当发生异常时,ARM处理器会暂停正在执行的任务,并执行特定的异常处理程序。
下面是几种ARM异常后返回的情况:1. 异常返回(Exception Return)指令:当ARM处理器遇到一个异常时,它会将程序状态保存在异常模式的专用寄存器中,并执行一个异常处理程序。
处理程序完成后,可以使用异常返回指令(例如bx或pop)来恢复中断指令后的执行。
2.异常向量表:ARM处理器使用异常向量表来存储异常处理程序入口地址。
当异常发生时,ARM会检索对应异常向量表中的地址并跳转到对应的处理程序。
这些异常向量表通常被存储在系统的固定内存位置,以便ARM能够快速找到异常处理程序。
3.异常处理程序:每个异常都有一个对应的异常处理程序。
异常处理程序负责处理异常情况,并采取适当的措施。
例如,当发生访问错误异常时,异常处理程序可能会尝试恢复,并重新执行导致访问错误的指令。
4. 异常级别(Exception Level):ARM处理器中存在不同的异常级别,用于处理不同优先级的异常。
较高的级别可以屏蔽较低级别的异常,以确保在优先级更高的异常发生时能够优先处理。
5.异常处理期间的状态保存:在进入异常处理程序时,ARM处理器会保存当前任务的状态,包括程序计数器值、寄存器值等。
这样,当异常处理程序执行完毕后,可以准确地返回到之前的任务。
6.异常处理程序的恢复操作:在异常处理程序执行完毕后,ARM处理器可能需要执行一些恢复操作,例如重新加载保存在堆栈中的寄存器值,以确保异常处理程序之后的指令能够正确执行。
7.异常处理程序之间的切换:在多个异常同时发生的情况下,ARM处理器可以通过执行特定的异常处理程序来处理不同的异常。
当多个异常同时发生时,ARM处理器可能会选择一个具有最高优先级的异常进行处理。
单片机中断处理过程:中断响应 中断处理 中断返回详解
单片机中断处理过程:中断响应中断处理中断返回详
解
中断处理过程可分为中断响应、中断处理和中断返回三个阶段。
中断响应
中断响应是CPU 对中断源中断请求的响应,包括保护断点和将程序转向中断服务程序的入口地址(通常称矢量地址)。
中断响应过程
中断响应过程包括保护断点和将程序转向中断服务程序的入口地址。
首先,中断系统通过硬件自动生成长调用指令(LACLL),该指令将自动把断点地址压入堆栈保护(不保护累加器A、状态寄存器PSW 和其它寄存器的内容),然后,将对应的中断入口地址装入程序计数器PC(由硬件自动执行),使程序转向该中断入口地址,执行中断服务程序。
MCS-51 系列单片机各中断源的入口地址由硬件事先设定,分配如下:
中断源入口地址
外部中断00003H
定时器T0 中断000BH
外部中断10013H
定时器T1 中断001BH
串行口中断0023H
使用时,通常在这些中断入口地址处存放一条绝对跳转指令,使程序跳转到用户安排的中断服务程序的起始地址上去。
中断返回
中断返回是指中断服务完后,计算机返回原来断开的位置(即断点),继续执。
学习小结--ARM7中断原理
2
3 向量地址寄存器 0-15(VICVectAddr0-15 - 0xFFFFF100-13C,读/写)
一般(以 Slot0 为例):VICVectAddr0 = (uint32)IRQ_TIME0 ;
4 向量地址寄存器(VICVectAddr - 0xFFFFF030,读/写) VICVectAddr = 0x00; // 通知 VIC 中断处理结束
二 ,VIC 寄存器 1,中断选择寄存器(VICIntSelect - 0xFFFFF00C,读/写)
该寄存器将 32 个中断请求分别分配为 FIQ 或 IRQ。
一般选 IRQ 时:VICIntSelect = 0x00;
1
2,向量控制寄存器 0-15(VICVectCnt l0-15 - 0xFFFFF200-23C,读/写)
PINSEL0 = 0x00000000; // 设置管脚连接 GPIO IO1DIR = LED1|LED2; // 设置 I/O 为输出 IO1SET = LED1|LED2; Time1Init(); // 初始化定时器及使能中断 Time0Init(); VICIntSelect = 0x00; // 所有中断通道设置为 IRQ 中断 VICDefVectAddr = (uint32)nIRQ_TIME; VICIntEnable = time0|time1; while(1); // 等待定时器中断或定时器匹配输出 return(0); }
}
} /**************************************************************************** * 名 称:Time0Init() * 功 能:初始化定时器,定时时间为 S,并使能中断。 * 入口参数:无 * 出口参数:无 ****************************************************************************/ void Time1Init(void) {
ARM异常中断以及对ARM异常返回地址的分析
返回地址:SUBS PC,R14,#8 返回地址分析: 当进入异常时,R14_abt = address of the aborted instruction + 8
所以要返回到有问题的指令处重新执行,所以返回的地址为 R14-8 IRQ 中断异常:
产生原因: 当处理器的外部中断请求引脚有效,且 CPSR 寄存器的 I 控制位被清除 时,处理器产生外部中断 IRQ 异常。
是因为当前指令即引起软件异常中断的指令执行后所引起的,说明当前指令已近执行,当从
中断返回时,执行的指令应该是当前指令的下一条指令,即待执行指令的地址应该是 0x3004, 而 R14 中存放的即为 0x3004,所以返回时使用将 R14 的值直接赋给 PC 即可。
指令预期中止异常: 发生原因:若在指令预取阶段遇到无效指令时,系统存储器将该预取的指令标记为无
效指令,当处理器试图去执行这一条被标记为预取无效的指令时,将产生指令预取中止异常, 注意若处理器没有执行无效指令时将不会产生异常中断(在流水线中存在一条分支指令,导 致该非法指令没有执行,将不会产生该异常)。
处理器动作: R14_abt = address of the aborted instruction + 4 SPSR_abt = CPSR ….. …..
2、各异常分析
举个小例子,下面是一段 ARM 汇编代码: (后面的返回地址分析中将会用到此图)
arm处理器异常中断响应过程
arm处理器异常中断响应过程ARM处理器是一种广泛应用于移动设备、嵌入式系统和服务器等领域的处理器架构。
在运行过程中,处理器可能会遇到各种异常情况,如访问非法内存、除零错误等。
当这些异常发生时,ARM处理器需要做出相应的中断响应,以保证系统的稳定性和安全性。
ARM处理器异常中断响应的过程可以分为异常触发、异常处理和恢复执行三个阶段。
首先是异常触发阶段。
当处理器在执行指令时,发生了某种异常情况,例如访问了非法的内存地址,处理器会立即检测到异常,并将当前指令的状态保存起来。
同时,处理器会根据异常类型,确定异常向量的地址,将控制转移到异常向量所指向的地址处。
接下来是异常处理阶段。
当处理器进入异常向量所指向的地址时,会执行相应的异常处理程序。
这个程序通常是由操作系统或应用程序提供的,用于处理不同类型的异常。
在异常处理程序中,可以进行一系列的操作,例如保存现场、记录异常信息、处理异常原因等。
处理程序还可以根据需要选择继续执行或终止当前指令。
最后是恢复执行阶段。
在异常处理程序执行完毕后,处理器会根据异常返回地址,将控制权返回到引发异常的指令处,继续执行后续指令。
在返回之前,处理器可能会进行一些必要的恢复操作,如恢复现场、清除异常状态等。
这样,系统就可以继续正常运行,不受异常的影响。
需要注意的是,ARM处理器还提供了一些特殊的异常处理方式,如中断(Interrupt)和陷阱(Trap)。
中断是外部设备触发的异常,用于异步事件的处理,例如外部设备的输入输出请求。
陷阱是由程序主动触发的异常,用于实现系统调用和调试功能。
这些异常的触发和处理方式与一般异常略有不同,但整体的处理过程仍然符合前述的异常中断响应流程。
在ARM处理器中,异常中断响应是保证系统正常运行和异常处理的关键环节。
通过合理的异常处理程序和恢复机制,可以有效地应对各种异常情况,提高系统的可靠性和稳定性。
同时,开发人员也需要根据具体应用场景和需求,灵活地配置和调整异常处理方式,以满足不同的需求。
对于中断函数返回值的分析
对于中断函数返回值的分析中断函数是一种特殊的函数,与其他函数不同的是,它可以被中断信号打断执行其他任务。
当中断函数被中断信号触发后,系统会保存当前中断函数的执行上下文,并跳转到中断服务例程去执行其他任务。
当中断任务完成后,系统会恢复中断函数的上下文,并继续中断函数的执行。
由于中断函数的特殊性,中断函数返回值的分析有一些独特之处。
下面将详细探讨中断函数返回值的分析。
首先,中断函数的返回值通常用来表示中断处理的状态。
这个状态可以用来表示中断是否被成功处理,或者是否需要进一步处理。
常见的中断处理状态包括以下几种:1.成功处理:中断处理成功完成,中断函数成功返回。
这种情况下,中断函数的返回值通常为一个特定值,例如0或者1、这样的返回值可以让调用中断函数的代码知道中断已经成功处理,并根据需要继续执行其他操作。
2.需要进一步处理:在一些情况下,中断函数可能无法处理整个中断过程,需要进一步处理。
这时,中断函数的返回值通常会携带一些附加信息,用来指示下一步处理的方向。
例如,返回值可以是一个错误码,指示中断处理过程中发生了特定的错误,并提供错误的详细信息。
3.忽略中断:在一些情况下,中断函数可能会决定忽略一些特定的中断。
这种情况下,中断函数的返回值通常是一个特定的标志值,例如-1或者一个错误码,用来告诉系统忽略该中断,并不做任何处理。
其次,中断函数返回值的分析可以提供一些额外的信息,用于调试和故障排除。
在调试过程中,中断函数的返回值可以提供有关中断处理的详细信息,以帮助开发人员定位和解决问题。
返回值可以包含一些诊断信息,例如错误码、故障位置或者调试信息,使开发人员能够通过分析返回值来理解中断处理的具体情况。
此外,中断函数返回值的分析还可以帮助确定中断处理的优先级。
在系统中,可能存在多个中断处理程序,每个中断处理程序可能有不同的优先级。
通过分析中断函数的返回值,可以确定优先级高的中断处理程序是否已经完成执行,以便选择下一个要执行的中断处理程序。
arm汇编函数返回
arm汇编函数返回ARM汇编语言是一种底层的程序设计语言,用于编写嵌入式系统和操作系统等应用程序。
在ARM汇编语言中,函数的返回值是非常重要的,它可以将计算的结果返回给调用方。
本文将围绕ARM汇编函数的返回值展开讨论,探讨其相关特点和使用方式。
一、ARM汇编函数的返回方式在ARM汇编语言中,函数的返回值通常通过寄存器来传递。
ARM体系结构中,常用的返回寄存器是R0,它用于存储函数的返回值。
在函数执行完毕后,将结果存储在R0寄存器中,然后通过函数调用指令返回到调用方。
二、ARM汇编函数的返回值类型ARM汇编语言支持多种数据类型的返回值,包括整型、浮点型和结构体等。
对于整型和浮点型的返回值,可以直接通过R0寄存器返回;对于结构体等复杂类型的返回值,通常需要通过传递指针的方式返回。
三、整型返回值的示例下面以一个简单的示例来说明整型返回值的使用方式:```.global main.textmain:push {lr} ;保存返回地址bl func ;调用func函数mov r1, r0 ;将返回值保存到r1寄存器pop {pc} ;恢复返回地址并返回func:mov r0, #123 ;将123存储到r0寄存器,作为返回值bx lr ;返回到调用方```在上述示例中,我们定义了一个名为`func`的函数,它将常数123作为返回值。
在`main`函数中,我们通过`bl`指令调用了`func`函数,并将返回值保存在r1寄存器中。
四、浮点型返回值的示例对于浮点型的返回值,ARM汇编语言使用特殊的浮点寄存器来传递。
下面以一个简单的示例来说明浮点型返回值的使用方式:```.global main.textmain:push {lr} ;保存返回地址bl func ;调用func函数vmov s1, s0 ;将返回值从s0寄存器复制到s1寄存器pop {pc} ;恢复返回地址并返回func:vldr s0, =3.14 ;将3.14加载到s0寄存器,作为返回值bx lr ;返回到调用方```在上述示例中,我们通过`vldr`指令将常数3.14加载到浮点寄存器s0中,作为返回值。
Cortex-M3中断响应和中断返回过程分析
一、中断/异常响应当CM3开始响应一个中断时,它的内部会依次自动地进行以下三个操作:●入栈:把8个寄存器的值压入栈。
●取向量:从向量表中找出对应的服务程序入口地址。
●选择堆栈指针MSP/PSP,更新堆栈指针SP,更新连接寄存器LR,更新程序计数器PC。
1.入栈响应中断的第一个操作,就是自动保存现场:依次把xPSR(程序状态寄存器)、PC、LR、R12以及R0~R13由硬件自动压入适当的堆栈中。
响应中断时,如果当前代码使用的是PSP,也就是使用进程堆栈,则压入PSP;否则就压入MSP。
一旦进入服务例程,代码就将一直使用主堆栈(MSP)。
假设入栈开始时,SP的值为N,则在入栈后,堆栈内部的变化如下表所列。
另外,在自动入栈的过程中,寄存器压栈的先后顺序,并不与其在堆栈的位置相对应。
但是硬件会保证寄存器被保存到正确的位置,如下表的第3列所示。
表1 入栈顺序以及入栈后堆栈内容先保存PC与xPSR的值,就可以更早地启动服务例程指令的预取;同时,也可以做到在早期更新xPSR中IPSR位段的值。
至于为何保存R0~R3和R12的值,则是根据ARM的C函数调用标准约定(AAPCS,Ref5):它使得中断服务例程能用C语言编写,编译器优先使用入栈的寄存器来保存中间结果。
2.取向量当数据总线正在为入栈操作而忙得风风火火时,指令总线则正在为响应中断紧张有序地执行另一项重要的任务:从向量表中找出正确的中断向量,然后在服务程序的入口处预取指。
由此可以看到各自都有专用总线的好处:入栈和取指可以同时进行。
3.更新寄存器入栈和取向量操作完成后,在执行服务例程之前,还要更新一系列寄存器。
SP:入栈后堆栈指针(PSP或MSP)更新到新的位置。
执行服务例程时,将由MSP负责对堆栈的访问。
PSR:更新IPSR位段(PSR的最低部分)的值更新为新响应的中断编号。
PC:取向量完成后,PC指向服务例程的入口地址。
LR:在出入ISR的时候,LR的值将被重新诠释,这种特殊的值称为“EXC_RETURN”,该值在中断进入时由系统计算并赋给LR,并在中断返回时使用它。
ARMCortex-M3权威指南-中断和异常(2)
ARMCortex-M3权威指南-中断和异常(2)中断和异常它⽀持16-4-1=11 种系统异常(同步)(保留了 4+1 个档位),外加 240 个外部中断输⼊(异步)。
在 CM3 中取消了 FIQ 的概念(v7 前的ARM 都有这个 FIQ,快中断请求),这是因为有了更新更好的机制——中断优先级管理以及嵌套中断⽀持,它们被纳⼊ CM3 的中断管理逻辑中。
因此,⽀持嵌套中断的系统就更容易实现 FIQ。
虽然 CM3 是⽀持 240 个外中断的,但具体使⽤了多少个是由芯⽚⽣产商决定。
CM3还有⼀个NMI(不可屏蔽中断)输⼊脚。
当它被置为有效(assert)时, NMI 服务例程会⽆条件地执⾏。
NMI 究竟被拿去做什么,还要视处理器的设计⽽定。
在多数情况下, NMI 会被连接到⼀个看门狗定时器,有时也会是电压监视功能块,以便在电压掉⾄危险级别后警告处理器。
向量表当 CM3 内核响应了⼀个发⽣的异常后,对应的异常服务例程(ESR)就会执⾏。
为了决定 ESR 的⼊⼝地址, CM3 使⽤了“向量表查表机制”。
这⾥使⽤⼀张向量表。
向量表其实是⼀个 WORD(32 位整数)数组,每个下标对应⼀种异常,该下标元素的值则是该 ESR 的⼊⼝地址。
向量表在地址空间中的位置是可以设置的,通过 NVIC 中的⼀个重定位寄存器来指出向量表的地址。
在复位后,该寄存器的值为 0。
因此,在地址 0 处必须包含⼀张向量表,⽤于初始时的异常分配。
举个例⼦,如果发⽣了异常 11(SVC),则 NVIC 会计算出偏移移量是11x4=0x2C,然后从那⾥取出服务例程的⼊⼝地址并跳⼊。
要注意的是这⾥有个另类: 0 号类型并不是什么⼊⼝地址,⽽是给出了复位后MSP 的初值。
CM3允许向量表重定位即从其它地址处开始执⾏各异常向量。
这些地址对应的区域可以是代码区,但也可以是 RAM 区。
在 RAM区就可以修改向量的⼊⼝地址了。
为了实现这个功能, NVIC中有⼀个寄存器,称为“向量表偏移量寄存器”(在地址 0xE000_ED08 处),通过修改它的值就能定位向量表。
armv8中断处理流程
ARMv8 中断处理流程一、中断请求中断请求是由硬件或软件发起的异常信号,用于打断正在执行的指令序列,将控制权转移到中断处理程序。
在ARMv8 架构中,中断请求由中断控制器(如GIC)产生,并通过中断信号线传递给处理器核。
二、中断响应当处理器核接收到中断请求时,它会根据优先级和其他因素决定是否响应中断。
如果处理器核决定响应中断,它将执行一系列指令来保存当前执行环境的状态,并跳转到中断处理程序的入口点。
在ARMv8 架构中,中断处理程序的入口点由中断向量表(IVT)或异常向量表(EVT)指定。
三、保存上下文在中断响应过程中,处理器核需要保存当前执行环境的状态,以便在中断处理程序执行完毕后能够恢复原来的执行环境。
在ARMv8 架构中,上下文保存的操作包括:1. 保存寄存器状态寄存器(xPSR)的值;2. 保存当前指令指针(PC)的值;3. 保存堆栈指针(SP)和链接寄存器(LR)的值;4. 如果当前执行环境是异常或中断处理程序,则保存相应的程序计数器(PC)和链接寄存器(LR)的值。
四、执行异常处理程序中断处理程序的入口点通常是指向异常向量表(EVT)或中断向量表(IVT)的一个跳转指令。
当处理器核跳转到这个地址时,它会执行该地址处的指令,即异常处理程序的入口点。
在执行异常处理程序时,处理器核会根据具体的异常类型和上下文信息执行相应的操作,如执行设备驱动程序或系统调用等。
五、恢复上下文在异常处理程序执行完毕后,处理器核需要恢复原来的执行环境。
在ARMv8 架构中,上下文恢复的操作包括:1. 恢复寄存器状态寄存器(xPSR)的值;2. 恢复当前指令指针(PC)的值;3. 恢复堆栈指针(SP)和链接寄存器(LR)的值;4. 如果当前执行环境是异常或中断处理程序,则恢复相应的程序计数器(PC)和链接寄存器(LR)的值。
六、中断返回在恢复上下文后,处理器核会执行一条返回指令,将控制权从异常处理程序返回给原来的执行环境。
ARM之Cortex-M内核中断异常系统详解
ARM之Cortex-M内核中断异常系统详解问题最近在使用STM32F3芯片的时候,遇到这样一个问题:如果外部中断来的频率足够快,上一个中断没有处理完成,新来的中断如何处理?在调试时,发现有中断有挂起、激活、失能等状态,考虑这些状态都是干啥用的呢!他们是Cortex-M核所共有的,因此这里不针对与具体用的STM32 MCU,直接上升到 Cortex-M内核来了解一下!简介 中断(也称为“异常”)是微控制器一个很常见的特性。
中断一般是由硬件(例如外设、外部引脚)产生,当中断产生以后 CPU 就会中断当前的程序执行流程转而去处理中断服务中指定的操作。
所有的Cortex-M 内核都会系统一个用于中断处理的组件:NVIC(Nested Vectored Interrupt Controller,嵌套向量中断控制器)。
它处理处理中断,还处理其他需要服务的事件(例如 SVC 指令),通常称为“异常”。
按照 ARM 的说法,中断也是一种异常。
Cortex-M3和 Cotex-M4 的 NVIC 最多支持 240 个 IRQ(中断请求)、1 个不可屏蔽中断(NMI)、1个 Systick(滴答定时器)定时器中断和多个系统异常。
而 Cortex-M0 最多支持32个IRQ、1 个不可屏蔽中断(NMI)、1 个 Systick(滴答定时器)定时器中断和多个系统异常。
IRQ:多数由定时器、IO端口、通信接口等外设产生NMI:通常由看门狗定时器或者掉电检测器等外设产生其他:主要来自系统内核注意,本文所说的 Cortex-M 主要指定是 Cotex-M3和 Cotex-M4。
Cortex-M0、Cortex-M0+、Cortex-M1 基于 ARMv6-M。
与Cotex-M3和 Cotex-M4相比,他们的指令集较小。
而且,Cortex-M1 是专门为FPGA应用设计的,没有独立MCU。
异常类型 Cortex-M 处理器的异常中,编号 1~15 的为系统异常,16及以上的则为中断输入。
ARM的8种寻址方式详细总结
二、ARM7的8种寻址方式1.3级流水线是ARM7TDMI的主要特征之一,而ARM7之后的处理器,比如ARM9的5级流水线等等,流水线越多,就越快。
他在执行程序时,要分3个步骤。
第一步是要把指令从程序存储器中取出来,取指是在处理器内核和程序存储器之间进行的,取指时间的长短和程序存储器的位置远近,和速度(用的静态还是动态,Cachae,Flash等)这些有关。
第二部就是把读到的内核的指令进行译码,也就是把二进制指令转变为电路的动作,打开哪些门电路,关闭哪些门电路。
第三步就是把门电路的动作送到制定的目标地址。
2.寻址方式寻址就是找与数据相关联的地址,ARM寻址复杂,操作数为2个或以上。
寄存器寻址:此种寻址就是寄存器内容就是操作数,寄存器本身就是操作数地址,在ARM 任何一个模式中都有R0—R14以及PC和CSSR可以寻址。
如下举例:注意在ARM指令中第二条,应为ARM的寄存器大部分都可以作为ADD,ADD R4,R4,R5中第一个R4就相当于存了51系列本来用ADD存结果。
立即寻址:操作数不是存储在寄存器或存储器中,而是包含在指令的操作码,取出指令就取出了操作码。
如图:注意:十进制立即数表达举例:#0005、#0376、#01234十六进制立即数表达举例:#0x0005、#0x0FFF、#0x072寄存器移位寻址:寄存器移位寻址是ARM指令独有的寻址方式,51系列单片机没有,在这种方式中,对一个寄存器的内容进行移位(左右移位),移位的位数必须写在表达式中。
如图:ARM指令集有5种移位操作:(1)LSL逻辑左移向左移位,左侧移出的位丢失,右端空出位补0。
注意最后一个左移出的位放在状态寄存器的C位CPSR【29】中。
这种相当于寄存器的乘法。
移出n位相当于乘以2的n次幂。
(2)LSR逻辑右移向右移位,右侧移出的位丢失,左端空出位补0。
注意最后一个右移出的位放在状态寄存器的C位CPSR【29】中。
这种相当于寄存器的除法。
中断异常处理流程
中断异常处理流程1.特殊中断响应与返回系统运行时,特殊可能会随时发生。
当一个特殊出现以后,ARM微处理器会执行下列几步操作:1) 将下一条指令的地址存入相应连接寄存器LR,以便程序在处理特殊返回时能从正确的位置重新开始执行。
2) 将CPSR复制到相应的SPSR中。
3) 根据特殊类型,强制设置CPSR的运行模式位。
4) 强制PC从有关的特殊向量地址取下一条指令执行,从而跳转到相应的特殊处理程序处。
这些工作是由ARM 内核完成的,不需要用户程序参与。
特殊处理完毕之后,ARM 微处理器会执行下列几步操作从特殊返回:1) 将连接寄存器LR的值减去相应的偏移量后送到PC中。
2) 将SPSR复制回CPSR中。
3) 若在进入特殊处理时设置了中断禁止位,要在此清除。
这些工作务必由用户在中断处理函数中实现。
为保证在ARM处理器发生特殊时不至于处于未知状态,在应用程序的设计中,首先要进行特殊处理。
使用的方式是在特殊向量表中的特定位置放置一条跳转指令,跳转到特殊处理程序。
当ARM处理器发生特殊时,程序计数器PC会被强制设置为对应的特殊向量,从而跳转到特殊处理程序。
当特殊处理完成以后,返回到主程序继续执行。
能够认为应用程序总是从复位特殊处理程序开始执行的,因此复位特殊处理程序不需要返回。
2.特殊处理程序设计2.1 特殊响应流程由于向量表的限制,只能有一条指令B完成32MB范围内的跳转,并不能保证所有的特殊处理函数都位于32MB范围内。
为了扩展跳转范围,需要二次跳转才能把特殊处理函数的地址传送给PC。
特殊处理调用关系如图1所示。
三星公司网站提供了test2410_r11软件包,其中2410init.s有如下代码:HandlerXXXsub sp,sp,#4 ;减少sp,储存跳转地址stmfd sp!,{r0} ;将工作寄存器压入堆栈ldr r0,=HandleXXX ;将HandleXXX地址放入r0ldr r0,[r0] ;将中断程序入口地址放入r0str r0,[sp,#4] ;将中断程序入口地址压入堆栈ldmfd sp!,{r0,pc} ;将工作寄存器与中断程序入口地址弹出到r0与PC图1特殊处理调用同时在RAM中定义了存有中断程序入口地址表_ISR_STARTADDRESS:AREA RamData, DA TA, READWRITE^ _ISR_STARTADDRESSHandleReset # 4HandleUndef # 4HandleSWI # 4HandlePabort # 4HandleDabort # 4HandleReserved # 4HandleIRQ # 4HandleFIQ # 4通常HandlerXXX位于程序入口地址32MB范围内,HandleXXX是以_ISR_STARTADDRESS为基地址的RAM中地址。
arm中断向量表的作用及工作原理
arm中断向量表的作用及工作原理
作用:
中断向量表在嵌入式系统和计算机体系结构中扮演着关键角色,其主要作用是存储了各个中断源对应的中断服务程序的入口地址。
当CPU接收到外部或内部产生的中断请求时,它会根据中断控制器传递过来的中断号,从预先定义好的中断向量表中查找到与该中断号对应的那个条目,这个条目中存放的就是ISR的地址。
工作原理:
1.中断触发:当一个中断事件发生时,硬件设备或内部逻辑会发出中断请求信号给中断控制器。
2.中断识别与优先级处理:中断控制器接收请求后,会按照优先级进行仲裁,确定最高优先级的中断并将其中断号发送给CPU。
3.中断响应:CPU停止当前执行的任务,保存现场,然后读取中断向量表中的相应位置。
4.跳转至ISR:根据中断号在中断向量表中找到对应的地址,并执行该地址处的指令,通常这个地址包含的是跳转指令,使得CPU 跳转到相应的中断服务程序的起始地址开始执行。
5.中断服务:ISR负责处理中断请求,执行相应的错误处理、数据交换或者任务调度等操作。
6.中断返回:当ISR执行完毕后,通过特定的指令序列恢复现场,清除中断标志位,并通过中断返回指令回到被中断的正常程序流程继续执行。
中断处理函数参数传递和返回值
中断处理函数参数传递和返回值中断是计算机系统中的一种事件,它会打断正在进行的程序执行,并转而执行由中断处理函数指定的代码。
在中断处理函数中,参数传递和返回值的处理是非常重要的。
在大多数计算机系统中,中断处理函数的参数传递主要通过两种方式进行:寄存器传递和栈传递。
寄存器传递是指将参数直接存储在寄存器中,然后通过寄存器传递给中断处理函数。
这种方式的优点是传递速度快,因为读写寄存器的速度比读写内存的速度要快。
同时,寄存器的个数是有限的,所以这种传递方式只适合传递少量的参数。
在中断处理函数中,可以使用相应的寄存器来读取这些参数。
栈传递是指将参数存储在栈中,然后通过栈传递给中断处理函数。
这种方式的优点是可以传递复杂的数据类型和大量的参数。
在中断处理函数中,可以通过栈指针来获取这些参数。
通常情况下,中断处理函数在进入时会保存当前的栈指针,并在退出时恢复保存的栈指针,以确保栈的完整性。
除了参数传递以外,中断处理函数还可以返回值。
返回值的处理也可以通过寄存器或者栈来进行。
如果返回值较小,可以选择使用寄存器来返回,这样可以提高返回值的传递速度。
如果返回值较大,可以使用栈来返回。
在中断处理函数中,可以将返回值存储在栈中,然后在函数返回时从栈中取出。
在一些特殊情况下,中断处理函数可能需要修改被中断程序的状态或者共享数据。
为了实现这一点,可以通过指针参数来传递需要修改的状态或者共享数据的地址。
中断处理函数可以通过指针来修改这些值,从而达到修改被中断程序状态或者共享数据的目的。
总结起来,中断处理函数的参数传递和返回值的处理是根据具体的计算机系统而定的,主要有寄存器传递和栈传递两种方式。
寄存器传递适合传递少量的参数,传递速度较快;栈传递适合传递复杂的数据类型和大量的参数,但传递速度较慢。
返回值的处理可以通过寄存器或者栈来进行,根据返回值大小来选择合适的方式。
同时,中断处理函数还可以通过指针参数来修改被中断程序的状态或者共享数据。
中断返回名词解释
中断返回名词解释
中断返回是指计算机在执行程序过程中,遇到某种突发事件或异常情况,使得程序控制权暂时中断并返回到操作系统或调用者的一种机制。
当一个中断发生时,计算机系统会暂停当前正在执行的程序,保存当前的程序状态(如寄存器中的数据),转而执行中断处理程序。
中断处理程序负责处理中断事件,完成相关的操作后,需要返回原程序继续执行。
这个返回原程序继续执行的过程就称为中断返回。
中断返回涉及到一些关键步骤,包括保存和恢复程序状态、选择返回点等。
其中,保存和恢复程序状态是为了保证程序在中断和返回后能够正确地继续执行。
选择返回点是指确定中断处理程序结束后的程序执行位置,通常是发生中断的位置,但也可以根据需要进行调整。
中断返回是操作系统中非常核心的概念之一,它与进程调度、内存管理等紧密相关。
通过中断返回机制,操作系统能够及时响应各种突发事件和异常情况,确保计算机系统的稳定性和可靠性。
同时,中断返回也使得多任务处理成为可能,提高了计算机系统的并发性能和资源利用率。
在现代计算机系统中,中断返回的实现通常依赖于硬件和操作系统的支持。
硬件提供了一些特殊的指令和机制来处理中断和返回,如中断向量表、上下文切换等。
操作系统则负责管理中断处理程序和相关资源,确保中断能够及时、正确地返回原程序继续执行。
arm汇编函数返回
arm汇编函数返回在ARM汇编语言中,函数返回值通常保存在寄存器中。
常用的寄存器有R0-R3,用于存储函数返回值。
如果返回值超过一个字,那么通常会使用多个寄存器来保存返回值。
例如,如果返回一个64位的整数,可以使用R0和R1两个寄存器来保存。
为了正确使用寄存器来返回函数结果,需要遵循一定的规则。
首先,在函数调用之前,调用者需要将需要保留的寄存器的值保存起来,以免在函数执行过程中被修改。
一般来说,R4-R11是可以被修改的寄存器,所以调用者需要将这些寄存器的值保存起来。
接下来,在函数执行完毕后,需要将函数的返回值存放在合适的寄存器中。
通常情况下,返回值会存放在R0中。
在函数最后的指令中,可以通过MOV指令将返回值移动到R0中。
如果返回值超过一个字,那么需要使用多个MOV指令来移动返回值。
除了使用寄存器来返回函数结果,还可以使用栈来实现函数返回。
栈是一种后进先出的数据结构,用于存储临时的数据。
在函数调用过程中,函数的返回地址会被保存在栈中。
当函数执行完毕后,可以通过从栈中取出返回地址来返回到调用者代码中。
使用栈返回函数结果的方法相对复杂一些,需要在函数调用之前保存返回地址,在函数执行过程中将返回值存放在栈中,然后在函数执行完毕后再从栈中取出返回地址并返回。
ARM汇编语言中的函数返回可以通过寄存器或栈来实现。
使用寄存器返回函数结果简单高效,但需要注意寄存器的保存和恢复。
使用栈返回函数结果相对复杂一些,但可以处理返回值超过一个字的情况。
在实际的ARM汇编程序中,根据具体的需求和场景选择适合的函数返回机制。
在编写程序时,需要注意保护寄存器的值,避免出错。
此外,还需要考虑函数的调用规范,确保函数返回后程序的正确执行。
函数返回是ARM汇编语言中的重要机制之一。
通过寄存器或栈来返回函数结果,可以实现高效的程序设计。
在实际的编程中,需要根据具体情况选择适合的函数返回机制,并注意保护寄存器的值,确保程序的正确执行。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在ARM体系中,通常有以下3种方式控制程序的执行流程:1、在正常执行过程中,每执行一条ARM指令,程序计数器PC的值加4个字节;每执行一条Thumb 指令,程序计数器PC加2个字节。
整个过程是顺序执行的;2、跳转B指令执行跳转操作;BL指令在执行跳转的同时,保存子程序返回地址;BX指令,执行跳转的同时,根据目标地址的最低位,可以将程序状态切换到Thumb状态;BLX指令执行上述3个操作;3、当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。
在进入异常中断处理程序时,要保存被中断的程序的执行现场,在从异常中断处理程序退出时,要恢复被中断的程序的执行现场。
当异常中断处理程序执行完成后,程序返回到发生中断的指令的下一条指令处执行。
异常中断种类、异常中断向量地址和异常中断优先级别见下表:ARM运行的几种处理器模式如上表所示。
其中,应用程序通常运行在用户模式下!为了说明异常中断执行过程,先了解各处理器模式下的寄存器组,如下表:重点:ARM处理器对异常中断的响应过程:㈠、保存当前程序状态寄存器CPSR到对应异常中断的处理器模式下的SPSR中;㈡、设置当前程序状态寄存器CPSR的处理器模式位M(4:0)为对应的处理器模式,并禁止IRQ 中断(设置I位=1);当进入的是FIQ模式时,禁止FIQ中断(设置F位=1);㈢、将对应异常中断的处理器模式下的LR设置成返回地址;㈣、将程序计数器PC值,设置成该异常中断向量地址,从而跳转到相应的异常中断处理程序处执行。
上述处理器对异常中断的响应过程可以用伪代码描述如下:R14<exception_mode>=return LinkSPSR<exception_mode>=CPSRCPSR[4:0]=exception mde numberCPSR[5] = 0 //所有异常均在ARM状态下处理(本句出自《基于ARM的嵌入式系统开发与实例》P32)if(<exception_mode>==Reset or FIQ )thenCPSR[6]=1 //禁止FIQ中断CPSR[7] =1 //禁止IRQ中断PC = exception vetor address程序将自动跳转到对应异常中断的处理程序中。
上述过程,完全由处理器自动完成,所以,当发生一种异常中断时,寄存器R14 、CPSR、SPSR 和PC的值将是上述的结果!结果如下图所示:下面是引用别人的文章:ARM处理器中主要有7个异常(2个中断异常):1、复位异常;在以ARM为核的单片机中,常把下列事件作为引起复位的原因。
? 上电复位:在上电后,复位使内部达到预定的状态,特别是程序跳到初始入口;? 复位引脚上的复位脉冲:这是由外部其他控制信号引起的;? 对系统电源检测发现过压或欠压;? 时钟异常复位。
ARM处理器复位后,处理器硬件将进行以下操作:? 强制进入管理模式;0b10011? 强制进入ARM状态;T=0? 跳转到绝对地址PC=0x00000000处执行;? 禁止IRQ中断和FIQ中断。
I=1,F=1;复位后,程序状态寄存器如下:...... I F T M4 M3 M2 M1 M01 1 0 1 0 0 1 1上电复位后,进入管理模式,执行操作系统程序,一般用做对系统初始化,例如开中断等;然后切换到用户模式,开始执行正常的用户程序。
切换到用户模式可使用下列程序:MRS R0,CPSR ;读状态寄存器BIC R0,R0,#03 ;把末两位清0MSR CPRS_c,R0 ;把修改后的值加载给状态寄存器,切换结束...... ;用户程序2、未定义指令异常;由于ARM使用32位代码,包含的信息量很大,可达2的31方(4G)。
ARM指令集不能用尽所有代码。
当ARM处理器遇到无法译码的指令时就会发生未定义指令异常。
进入中断处理程序。
ARM的未定义指令异常有以下两种情况:(1)遇到一条无法执行的指令,此指令没有定义;(2)执行一条对协处理器的操作指令,在正常情况下,协处理器应该应答,但协处理器没有应答。
未定义异常中断时,处理器硬件将进行以下操作:? 把下一条指令的地址拷贝给LR;? 把程序状态寄存器CPSR拷贝给SPSR_und;? 强制进入未定义模式;0b11011? 强制进入到ARM模式;T=0? 跳转到绝对地址PC=0x00000004处执行;? 禁止IRQ中断。
I=0? 状态寄存器中的F位不变。
进入中断后,程序状态寄存器如下:...... I F T M4 M3 M2 M1 M01 x 0 1 1 0 1 1使用下列指令退出异常中断,返回原程序。
MOVS PC,R14.3、软件中断异常;是由指令SWI引起的。
程序在执行这一指令后,进入异常中断。
{下面是《ARM体系结构与编程》书中的一段摘录}********SWI和未定义指令异常中断是由当前执行的指令自身产生的。
当SWI和未定义指令异常中断产生时,程序计数器PC的值还未更新,它指向当前指令后面第2条指令(对于ARM指令来说+8字节;对于Thumb指令来说+4字节的位置)。
当SWI和未定义指令异常中断产生时,处理器将值(PC-4)保存到异常模式下的寄存器LR_mode中。
这时(PC-4)即指向当前指令的下一条指令地址。
因此返回操作可以通过下面的指令来实现:MOV PC,LR该指令将寄存器LR中的值复制到程序计数器PC中实现程序返回,同时将SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。
**********{摘录结束}处理器响应中断,硬件执行如下的操作。
? 把下一条指令的地址拷贝给LR;? 把程序状态寄存器CPSR拷贝给SPSR_svc;? 强制进入管理模式;0b10011? 强制进入到ARM状态;T=0? 跳转到绝对地址PC=0x00000008处执行;? 禁止IRQ中断。
I=1;F保持不变;进入中断后的程序状态寄存器如下:...... I F T M4 M3 M2 M1 M01 x 0 1 0 0 1 1软件中断处理程序完成后,使用下列指令返回到原中断处:MOVS PC,R14.4、预取指中止异常;由程序存储器引起的中止异常叫做预取指中止异常;由数据存储器引起的中止异常叫做数据中止异常。
由于ARM的指令是3级流水线结构,读取指令周期是提前进行的,因此把读取指令的过程一般称预取指。
如果在取得指令的同时程序存储器发出中止信号,则ARM处理器把这一条指令标记位无效,然后等待执行。
{下面是《ARM体系结构与编程》书中的一段摘录}************在指令预取时,如果目标地址是非法的,该指令将被标记成有问题的指令。
这时,流水线上该指令之前的指令继续执行。
当执行到该被标记成有问题的指令时,处理器产生指令预取中止异常中断。
当发生指令预取中止异常中断时,程序要返回到该有问题的指令处,重新读取并执行该指令。
因此指令预取中止异常中断程序应该返回到产生该指令预取中止异常中断的指令处,而不是像前面两种情况下返回到发生中断的指令的下一条指令。
指令预取中止异常中断是由当前执行的指令自身产生的,当指令预取中止异常中断产生时,程序计数器PC的值还未更新,它指向当前指令后面第2条指令(对于ARM指令来说,它指向当前指令地址加8个字节的w位置;对于Thumb指令来说,它指向当前指令地址加4个字节的位置)。
当指令预取中止异常中断产生时,处理器将(PC-4)值保存到异常模式下的寄存器LR_mode中。
这时(PC-4)即指向当前指令的下一条指令。
因此返回操作可以通过下面的指令来实现:SUBS PC,LR,#4该指令将寄存器LR中的值减4后,复制到程序计数器PC中,实现程序返回,同时将SPSR_mode 寄存器内容复制到当前程序状态寄存器CPSR中。
*************{摘录结束}有两种可能如下:? 当执行这条指令前程序发生跳转,则这条无效指令不引起异常中断;? 当执行到这条指令时,处理器会发生预取指中止异常,引起中断。
当进入预取指异常中断时,处理器硬件响应中断,执行以下的操作:? 把中断时PC的地址拷贝给LR;? 把程序状态寄存器CPSR拷贝给SPSR_abt;? 强制进入中止异常模式;0b10111? 强制进入到ARM状态;T=0;? 跳转到绝对地址PC=0x0000000C处执行;? 禁止IRQ中断。
I=1;进入中断后,程序状态寄存器如下:...... I F T M4 M3 M2 M1 M01 x 0 1 0 1 1 1预取指中止异常中断返回时,应该执行下列指令:SUBS PC,R14,#4.5、数据中止异常;ARM处理器访问数据存储器时,在读取数据的同时数据存储器发出了中止信号,引起数据中止异常。
当进入预取数据异常中断时,处理器硬件响应中断,执行以下的操作:? 把中断时的PC的地址拷贝给LR;? 把程序状态寄存器CPSR拷贝给SPSR_abt;? 强制进入中止异常模式;? 强制进入到ARM状态;? 跳转到绝对地址PC=0x00000010处执行;? 禁止IRQ中断。
进入中断后,程序状态寄存器如下:...... I F T M4 M3 M2 M1 M01 x 0 1 0 1 1 1数据中止异常中断服务程序返回时,使用下列指令:SUBS PC,R14,#8上述指令是返回到中断时所执行的指令,目的是再一次从数据存储器中读取数据。
如果不再一次读取数据,则执行下一条指令,此时使用下列指令返回:SUBS PC,R14,#46、中断请求(IRQ)异常;例如:定时器中断、串行口通讯中断、外部信号中断和A/D 处理中断等。
IRQ中断是可屏蔽的。
{下面是《ARM体系结构与编程》书中的一段摘录}P269************通常当处理器执行完当前指令后,查询IRQ中断引脚及FIQ中断引脚,并且查看系统是否允许IRQ及FIQ中断。
如果有中断引脚有效,并且系统允许该中断产生,处理器将产生IRQ 或FIQ异常中断。
这时,程序计数器PC的值已经更新,它指向当前指令后面的第3条指令(对于ARM 指令来说,它指向当前指令地址+12字节位置;对于Thumb指令来说,它指向当前指令地址+6字节的位置)。
处理器这时将值(PC-4)保存到异常模式下的寄存器LR_mode中。
这时(PC-4)即指向当前指令后面的第2条指令。
因此返回操作可以通过下面的指令实现:SUBS PC, LR, #4该指令将寄存器LR中的值减4后,复制到程序计数器PC中,实现程序返回,同时将SPSR_mode 寄存器内容复制到当前程序状态寄存器CPSR中。
**********{摘录结束}在状态寄存器中的I位就是IRQ的屏蔽位。
当I=1时。