【ARM64 常见汇编指令学习 21 -- ARM RET 与 ERET】

请阅读【嵌入式开发学习必备专栏 】


文章目录

    • [ARM RET 与 ERET](#ARM RET 与 ERET)
      • [ARMv8 ERET 指令](#ARMv8 ERET 指令)
      • [RET 与 ERET 的区别](#RET 与 ERET 的区别)

ARM RET 与 ERET

在 ARMv8 架构中,RET 指令用于从函数或者过程返回。它主要负责从当前过程跳转回调用者,并恢复调用者的程序计数器 (PC) 的值。

语法:

assembly 复制代码
RET {Xn} 

Xn 是一个可选的寄存器,通常为 X30(也称为 LR,链接寄存器),其中包含返回地址。如果没有指定寄存器,则默认为 X30。

工作原理:

  1. 将 Xn(通常是 LR)寄存器中的值加载到程序计数器 PC 中,从而跳回到调用过程之后的地址。
  2. 根据需要更新程序状态,如堆栈指针 SP 和其他调用约定相关的寄存器。

示例:

assembly 复制代码
func: 
	// 函数内容 
	RET // 返回到调用者,等同于 RET X30 

another_func: 
	// 另一个函数内容 
	RET X29 // 如果X29寄存器中存放了返回地址,则使用它返回 

ARMv8 ERET 指令

ERET 指令用于从异常返回,特别是从中断或陷阱处理程序返回到之前的执行上下文。ERET 还原 Exception Level (EL) 发生变化前的程序状态,它通常在处理操作系统级别的代码中使用。
语法:

assembly 复制代码
ERET 

ERET 指令没有操作数。

工作原理:

  1. 从 ELR_ELx(Exception Link Register)恢复程序计数器 PC。
  2. 从 SPSR_ELx(Saved Program Status Register)恢复程序状态寄存器 CPSR(Current Program Status Register),包括标志位和执行状态(例如 ARM 或 Thumb 模式)。

示例:

assembly 复制代码
// 假设处于异常处理程序内部 
// 执行 ERET 会返回到触发异常的指令之后的程序地址 
	ERET 

RET 与 ERET 的区别

  • RET 用于标准的函数返回,而 ERET 用于从异常或中断处理程序返回。
  • RET 只是简单地将链接寄存器 LR 的值加载到程序计数器 PC 中,不会改变当前的执行级别或恢复程序状态。
  • ERET 会加载 ELR_ELx 中的值到 PC,并从 SPSR_ELx 恢复状态寄存器。它会改变处理器的执行级别,通常是从更高的异常级别(EL1, EL2, EL3)返回到较低的应用级别(EL0)。
  • ERET 是一个更复杂的指令,它用于在更严格和受控的环境中切换上下文,如操作系统的中断处理。
相关推荐
xxwl5852 分钟前
区域赛算法模版第八章---贪心(Greedy)
c++·笔记·学习·算法
qq_284274051 小时前
S7-1200 PLC硬件与启保停实训:CPU选型与DC/DC/DC、循环扫描五阶段、博途组态及电动机启停自锁梯形图(含考点)
笔记·学习·自动化·制造
dear_bi_MyOnly2 小时前
栈和队列:从原理到应用全解析
c语言·开发语言·c++·学习·分类
遇印记3 小时前
应用层,网络管理
运维·网络·windows·学习·安全
乌暮4 小时前
从 `println` 到生产级日志:Spring Boot 日志体系完全指南
java·开发语言·jvm·spring boot·后端·学习·面试
szxinmai主板定制专家4 小时前
ZYNQ PL+PS 架构拆解|工业自动化与电力物联网高速数据采集、预处理与协议上云
arm开发·人工智能·物联网·fpga开发·数据采集卡·rk3576
xian_wwq4 小时前
【学习笔记】Milvus 是什么?为什么 RAG 系统经常使用它?-14
笔记·学习·milvus
szxinmai主板定制专家5 小时前
告别 ARM 实时性短板:基于 ZYNQ 的电力故障录波 + 工业振动数据采集系统设计
arm开发·人工智能·fpga开发·zynq·数据采集卡·arm+fpga·rk3588+fpga
自信150413057595 小时前
重生之从0开始学习c++之string(下)
c++·学习·stl
kmomo..5 小时前
Linux 驱动开发学习笔记:UART、触摸屏与 ADC 驱动实战
linux·驱动开发·学习