EPC和ErrorEPC
EPC :Exception Program Counter (CP0 Register 14, Select 0), 异常返回地址寄存器,用于存储异常返回地址。 ErrorEPC :ErrorEPC Register (CP0 Register 30, Select 0),发生复位异常时的异常地址寄存器。 EPC和ErrorEPC的相同点: 两个寄存器都是可读可写的,存储32bit地址,通常情况下发生异常时由硬件更新。软件也可以去写这两个寄存器。 用于记录发生异常时的指令的虚拟地址。 如果发生异常的指令在分支延迟槽里(cause[BD]=1),EPC和ErrorEPC指向前一条分支或跳转指令。 EPC和ErrorEPC是eret指令的返回地址。 EPC和ErrorEPC的不同点: EPC发生异常或中断时会被更新,记录的是当前这次发生异常的虚拟地址。 ErrorEPC发生reset异常时会被更新,记录的是上一次异常的虚拟地址。 当SR(EXL)=1时,cpu不去写EPC。只有SR(EXL)=0时,EPC会被更新。 下图是mips官方文档对这两个寄存器的描述: ErrorEPC寄存器可以在重启之后对系统上一次reset前的异常进行debug,使用方法如下: __asm__ __volatile__ ( "mfc0 %0, $30, 0 \n\t" "nop \n\t" :"=r"