Ø 从SWI和Undef异常返回时使用:
MOVS PC, LR;
Ø 从FIQ、IRQ和预取终止返回时使用:
SUBS PC, LR,#4;
Ø 从数据异常返回时使用:
SUBS PC, LR,#8
在使用上述指令异常返回时,如果LR之前被压栈的话使用LDM “∧”, 例如:
LDMFD SP!, {PC}∧
退出异常处理
SWI和未定义指令异常中断是由当前执行的指令自身产生的。当SWI和未定义指令异常中断产生时,程序计数器PC的值还未更新,它指向当前指令后面第2条指令(对于ARM指令来说+8字节;对于Thumb指令来说+4字节的位置)。当SWI和未定义指令异常中断产生时,处理器将值(PC-4)保存到异常模式下的寄存器LR_mode中。这时(PC-4)即指向当前指令的下一条指令地址。因此返回 *** 作可以通过下面的指令来实现:MOV PC,LR
该指令将寄存器LR中的值复制到程序计数器PC中实现程序返回,同时将SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。
在指令预取时,如果目标地址是非法的,该指令将被标记成有问题的指令。这时,流水线上该指令之前的指令继续执行。当执行到该被标记成有问题的指令时,处理器产生指令预取中止异常中断。
当发生指令预取中止异常中断时,程序要返回到该有问题的指令处,重新读取并执行该指令。因此指令预取中止异常中断程序应该返回滑森到产生该指令预取中止异常中断的指令处,而不是返回到发生中断的指令的下一条指令。
指令预取中止异常中断是由当前执行的指令自身产生的,当指令预取中止异常中断产生时,程序计数器PC的值还未更新,它指向当前指令后面第2条指令(对于ARM指令来说,它指向当前指令地址加8个字节的w位置;对于Thumb指令来说,它指向当前指令地址加4个字节的位置)。当指令预取中止异常中断产生时,处理器将(PC-4)值保存到异常模式下的寄存器LR_mode中。这时(PC-4)即指向当前指令的下一条指令。因此返回 *** 作可以通过下面的指令来实现:SUBS PC,LR,#4
该指令将寄存器LR中的值减4后,复制到程序计数器PC中,实现程序返回,同时将SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。
发生数据访问异常中断时,程序要返回到该有问题的指令处,重新访问该数据,因此数据访问异常中断应该返回到产生该数据访问中止异常中断的指令处,而不是当前指令的下一条指令。
数据访问异常中断由当前执行的指令自身产生,当数据访问异常中断发生时,程序计数器pc的值已经更新,它指向当前指令后面第3条指令(对于ARM指令,它指向当前指令地址加12字节的位置;对于Thumb指令,它指向当前指令地址加6字节的位置)。此时处理器将值(pc-4)保存到lr_abt中,它指向当前指令后面第2条指令,所以返回 *** 作可以通过下面指令实现:subs pc, lr, #8
该指令将lr中的值减8后传给程序计数器pc中,实现程序返回,同时将SPSR_abt寄存器内容复制到当前程序状态寄存器CPSR中;
通常处理器执行完当前指令后,查询IRQ中断引脚,并查看誉贺是否允庆让派许IRQ中断,如果某个中断引脚有效,并且系统允许该中断产生,处理器将产生IRQ异常中断,当IRQ异常中断产生时,程序计数器pc的值已经更新,它指向当前指令后面第3条指令(对于ARM指令,它指向当前指令地址加12字节的位置;对于Thumb指令,它指向当前指令地址加6字节的位置),当IRQ异常中断产生时,处理器将值(pc-4)保存到IRQ异常模式下的寄存器lr_irq中,它指向当前指令之后的第2条指令,因此返回 *** 作可以通过下面指令实现:subs pc, lr, #4
与IRQ异常中断一样,处理器执行完当前指令后,查询FIQ中断引脚,并查看是否允许FIQ中断,如果中断引脚有效,并且系统允许该中断产生,处理器将产生FIQ异常中断,当FIQ异常中断产生时,程序计数器pc的值已经更新,它指向当前指令后面第3条指令(对于ARM指令,它指向当前指令地址加12字节的位置;对于Thumb指令,它指向当前指令地址加6字节的位置),当FIQ异常中断产生时,处理器将值(pc-4)保存到IRQ异常模式下的寄存器lr_fiq中,它指向当前指令之后的第2条指令,因此返回 *** 作可以通过下面指令实现:subs pc, lr, #4
简单郑孝茄的说,异常是由内部或者外部的触发源引起的,当异常发生后,ARM处理器将中断当前 *** 作转而跳到异常向量地址处执行相关的异常服务程序,也叫中断服务程序。除了上电复位异常之外,其他的异常服务程序跳转执行前,处理器将自动保存当前的程序状态,异常服务执行完成后,将返回被中断的程序继续执行。详细的来说,在ARM中有7种异常类型,分别是复位,未定义指令,SWI软件中断,预取指令中止,预取数据中止,IRQ中断,FIQ快速中断。当某种异常发生后,程序的返回地址保存在该异常模式下的R14(lr)中,程序状态CPSR保存在该异常模式下的SPSR中。然后,CPSR的M[4:0]被置为该异常模式,如果发生的异常为复位或这IFQ异常,还要屏蔽快速中断,最后屏蔽常规中断,PC只想异常向量表中该异常向量的地址处。慎数
当异常服务处理程序处理完成后,系统将SPSR复制到SCPR,R14(lr)复制到PC,程序将从PC处继喊察续执行,这样就完成了异常返回,继续进行下一步代码。
希望对你有用!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)