未定义的指令、中断及数据中止异常的返回地址为什么要对R14进行偏移量计算并且偏移量不尽相同
时间: 2023-06-01 12:02:16 浏览: 84
在ARM架构中,R14寄存器通常被用作链接寄存器(Link Register,LR),它保存着函数返回地址。当程序执行到一个函数时,当前函数的返回地址会被保存到LR中,以便在函数执行完毕后回到调用函数的位置继续执行。
对于未定义的指令、中断及数据中止异常,CPU需要从当前的执行位置跳转到异常处理程序的入口地址。因此,CPU会将异常处理程序的入口地址保存到LR中,并将LR中原有的返回地址保存到堆栈中,以便在异常处理完毕后回到原有的执行位置继续执行。
偏移量的计算是因为不同的异常处理程序所需的堆栈空间可能不同,因此需要将返回地址保存到不同的位置。例如,某些异常处理程序可能需要保存更多的寄存器值,因此需要更多的堆栈空间。为了确保堆栈空间被正确使用,CPU会计算偏移量,将LR中原有的返回地址保存到正确的位置。偏移量的大小取决于异常处理程序所需的堆栈空间大小。
总之,对R14进行偏移量计算是为了正确保存返回地址,并确保异常处理程序能够正确地使用堆栈空间。
相关问题
请问未定义的指令、中断及数据中止异常的返回地址为什么要对R14进行偏移量计算并且偏移量不尽相同
未定义的指令、中断及数据中止异常的返回地址需要对R14进行偏移量计算是因为R14寄存器存储了异常返回地址,而异常处理程序需要知道从哪里返回到正常代码执行的位置。偏移量不尽相同是因为不同的异常类型可能会有不同的返回地址,需要根据具体的异常类型进行计算。例如,对于未定义的指令异常,返回地址需要减去4个字节,因为异常指令的长度为4个字节;而对于数据中止异常,返回地址需要减去8个字节,因为数据中止异常会导致2个指令被丢弃,每个指令长度为4个字节。因此,偏移量需要根据具体的异常类型进行计算,以确保异常处理程序能够正确地返回到正常代码执行的位置。
分析下表中不同的异常返回指令偏移不同的原因。 异常或入口 返回指令 返回地址 未定义的指令 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
异常返回指令偏移的不同是由于不同的异常处理程序返回地址不同所致。
对于未定义的指令异常和预取指中止异常,异常返回指令是 MOVS PC, R14_und 和 SUBS PC, R14_abt, #4,返回地址分别是 R14 和 R14-4。这是因为在处理这两种异常时,返回到异常发生的下一条指令处,即 R14 所指向的地址或者 R14-4 所指向的地址。
对于中断异常和数据中止异常,异常返回指令是 SUBS PC, R14_irq, #4 和 SUBS PC, R14_abt, #8,返回地址分别是 R14-4 和 R14-8。这是因为在处理这两种异常时,需要保存当前指令的地址,返回到当前指令的下一条指令处,即 R14-4 或者 R14-8 所指向的地址。
因此,不同异常处理程序需要保存不同的返回地址,导致了异常返回指令偏移的不同。