请阅读【嵌入式开发学习必备专栏 】
ARM RET 与 ERET
在 ARMv8 架构中,RET
指令用于从函数或者过程返回。它主要负责从当前过程跳转回调用者,并恢复调用者的程序计数器 (PC) 的值。
语法:
RET {Xn}
Xn
是一个可选的寄存器,通常为 X30
(也称为 LR
,链接寄存器),其中包含返回地址。如果没有指定寄存器,则默认为 X30
。
工作原理:文章来源:https://www.toymoban.com/news/detail-846087.html
- 将
Xn
(通常是LR
)寄存器中的值加载到程序计数器PC
中,从而跳回到调用过程之后的地址。 - 根据需要更新程序状态,如堆栈指针
SP
和其他调用约定相关的寄存器。
示例:文章来源地址https://www.toymoban.com/news/detail-846087.html
func:
// 函数内容
RET // 返回到调用者,等同于 RET X30
another_func:
// 另一个函数内容
RET X29 // 如果X29寄存器中存放了返回地址,则使用它返回
ARMv8 ERET 指令
ERET
指令用于从异常返回,特别是从中断或陷阱处理程序返回到之前的执行上下文。ERET
还原 Exception Level (EL) 发生变化前的程序状态,它通常在处理操作系统级别的代码中使用。
语法:
ERET
ERET
指令没有操作数。
工作原理:
- 从
ELR_ELx
(Exception Link Register)恢复程序计数器PC
。 - 从
SPSR_ELx
(Saved Program Status Register)恢复程序状态寄存器CPSR
(Current Program Status Register),包括标志位和执行状态(例如 ARM 或 Thumb 模式)。
示例:
// 假设处于异常处理程序内部
// 执行 ERET 会返回到触发异常的指令之后的程序地址
ERET
RET 与 ERET 的区别
-
RET
用于标准的函数返回,而ERET
用于从异常或中断处理程序返回。 -
RET
只是简单地将链接寄存器LR
的值加载到程序计数器PC
中,不会改变当前的执行级别或恢复程序状态。 -
ERET
会加载ELR_ELx
中的值到PC
,并从SPSR_ELx
恢复状态寄存器。它会改变处理器的执行级别,通常是从更高的异常级别(EL1, EL2, EL3)返回到较低的应用级别(EL0)。 -
ERET
是一个更复杂的指令,它用于在更严格和受控的环境中切换上下文,如操作系统的中断处理。
到了这里,关于【ARM64 常见汇编指令学习 21 -- ARM RET 与 ERET】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!