mret

mret

RISC-V 汇编 参考

lyszt.net 更详细地介绍了 mret 和其他 RISC-V 指令。

描述

mret 从陷阱处理程序返回。当处理器停止正在运行的程序以便处理程序接管时,就会发生陷阱。处理程序是位于固定地址的例程。设备引发中断,例如 GPIO 板上的按钮,就会启动陷阱。该名称代表 machine-mode return。

mret

当陷阱启动时,处理器将被中断指令的地址存入 mepc,将原因记录到 mcause,清除 mstatus 的全局中断使能位,并跳转到 mtvec 中保存的处理程序地址。mret 会撤销这些操作。它将 mepc 中的地址加载到程序计数器,并恢复陷阱开始时 mstatus 保存的中断使能位。被中断的程序随后从它即将执行的指令处继续运行。

mret 不接受操作数。没有它,处理器会越过处理程序的末尾,继续执行后面的任何代码。

中断可能在任何两条指令之间到达,而被中断的程序对此没有任何准备。因此,处理程序会保存它更改的每个寄存器,并在 mret 之前恢复它们。

按钮处理程序还会在 mret 之前清除按钮的挂起位。如果该位保持置位,那么 mret 一重新打开中断,同一个中断就会再次触发。

该示例将 target 的地址写入 mepc 并运行 mret,从而跳转到那里。在真实陷阱之外,这展示了跳转本身。有关写入 CSR,请参见 csrw。

示例

la t0, target
csrw mepc, t0
mret          # pc = mepc, so execution continues at target
target:
nop