未定义的指令、中断及数据中止异常的返回地址为什么要对R14进行偏移量计算并且偏移量不尽相同
时间: 2023-06-01 16:02:16 浏览: 159
在ARM架构中,R14寄存器通常被用作链接寄存器(Link Register,LR),它保存着函数返回地址。当程序执行到一个函数时,当前函数的返回地址会被保存到LR中,以便在函数执行完毕后回到调用函数的位置继续执行。
对于未定义的指令、中断及数据中止异常,CPU需要从当前的执行位置跳转到异常处理程序的入口地址。因此,CPU会将异常处理程序的入口地址保存到LR中,并将LR中原有的返回地址保存到堆栈中,以便在异常处理完毕后回到原有的执行位置继续执行。
偏移量的计算是因为不同的异常处理程序所需的堆栈空间可能不同,因此需要将返回地址保存到不同的位置。例如,某些异常处理程序可能需要保存更多的寄存器值,因此需要更多的堆栈空间。为了确保堆栈空间被正确使用,CPU会计算偏移量,将LR中原有的返回地址保存到正确的位置。偏移量的大小取决于异常处理程序所需的堆栈空间大小。
总之,对R14进行偏移量计算是为了正确保存返回地址,并确保异常处理程序能够正确地使用堆栈空间。
相关问题
请问未定义的指令、中断及数据中止异常的返回地址为什么要对R14进行偏移量计算并且偏移量不尽相同
未定义的指令、中断及数据中止异常的返回地址需要对R14进行偏移量计算是因为R14寄存器存储了异常返回地址,而异常处理程序需要知道从哪里返回到正常代码执行的位置。偏移量不尽相同是因为不同的异常类型可能会有不同的返回地址,需要根据具体的异常类型进行计算。例如,对于未定义的指令异常,返回地址需要减去4个字节,因为异常指令的长度为4个字节;而对于数据中止异常,返回地址需要减去8个字节,因为数据中止异常会导致2个指令被丢弃,每个指令长度为4个字节。因此,偏移量需要根据具体的异常类型进行计算,以确保异常处理程序能够正确地返回到正常代码执行的位置。
3、请分析下表中不同的异常返回指令偏移不同的原因。 异常或入口 返回指令 返回地址 未定义的指令 MOVS PC,R14_und R14 预取指中止 SUBS PC,R14_abt,#4 R14-4 中断 SUBS PC,R14_irq,#4 R14-4 数据中止 SUBS PC,R14_abt,#8 R14-8
在ARM体系结构中,异常处理分为两种:中断(Interrupt)和异常(Exception)。其中,中断是由外部设备触发的异步事件,而异常是由指令执行引起的同步事件。
在ARM处理器执行异常处理程序时,需要从异常模式(Exception Mode)返回到原来的执行模式。为了实现这一过程,需要使用异常返回指令(Exception Return Instruction)将程序计数器(PC)置为返回地址。不同的异常或入口对应不同的异常返回指令和返回地址,具体如下:
1. 未定义的指令异常(Undefined Instruction Exception):当ARM处理器遇到未定义的指令时,会触发该异常。在异常处理程序中,需要使用MOVS PC,R14_und指令将PC置为R14_und的值,返回地址为R14。
2. 预取指中止异常(Prefetch Abort Exception):当ARM处理器无法从内存中预取指令时,会触发该异常。在异常处理程序中,需要使用SUBS PC,R14_abt,#4指令将PC置为R14_abt-4的值,返回地址为R14-4。
3. 中断异常(Interrupt Exception):当外部设备触发中断时,会触发该异常。在异常处理程序中,需要使用SUBS PC,R14_irq,#4指令将PC置为R14_irq-4的值,返回地址为R14-4。
4. 数据中止异常(Data Abort Exception):当ARM处理器无法从内存中读取或写入数据时,会触发该异常。在异常处理程序中,需要使用SUBS PC,R14_abt,#8指令将PC置为R14_abt-8的值,返回地址为R14-8。
因为不同的异常或入口对应不同的异常返回指令和返回地址,所以偏移量也不相同。
阅读全文