news 2026/6/12 8:56:49

汇编返回指令ret iret retf区别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
汇编返回指令ret iret retf区别

这是 8086 汇编中三个最容易混淆的返回指令。它们的区别在于从栈上弹出什么数据以及如何恢复 CPU 执行状态

核心区别一览表

指令操作码弹出字节数弹出的内容典型配对使用场景
RETC32IPCALL NEAR段内返回
RETFCB4IPCSCALL FAR段间返回
IRETCF6IPCSFLAGSINT n中断返回

详细分析

1. RET (Return from Near Call)

操作:

IP ← [SP] SP ← SP + 2

特点:

  • 只恢复指令指针 IP

  • 不改变 CS(仍在同一代码段)

  • 不恢复 FLAGS

对应调用:CALL NEAR(段内调用)

示例:

CALL NEAR func ; 压入 IP ... func: RET ; 弹出 IP,返回调用处

2. RETF (Return from Far Call)

操作:

IP ← [SP] ; 先弹出 IP SP ← SP + 2 CS ← [SP] ; 再弹出 CS SP ← SP + 2

特点:

  • 恢复IPCS(实现段间跳转)

  • 不恢复 FLAGS

对应调用:CALL FAR(段间调用)或手动PUSH CS+PUSH IP+RETF

你的监控程序中的例子(源码第 552 行):

522 C287 A108FF MOV AX,[USER_CS] ; AX = 0000H 523 C28A 50 PUSH AX ; 压入 CS 524 C28B A106FF MOV AX,[USER_IP] ; AX = 0400H 525 C28E 50 PUSH AX ; 压入 IP ...(恢复其他寄存器) 552 C2B2 CB RETF ; 弹出 IP=0400, 弹出 CS=0000 ; 跳转到 0000:0400(用户程序)

3. IRET (Return from Interrupt)

操作:

IP ← [SP] ; 弹出 IP SP ← SP + 2 CS ← [SP] ; 弹出 CS SP ← SP + 2 FLAGS ← [SP] ; 弹出 FLAGS SP ← SP + 2

特点:

  • 恢复IPCSFLAGS

  • 通常还会恢复中断允许标志(IF)(因为INT指令会自动清除 IF)

对应调用:INT n(软件中断)或硬件中断

栈帧对比图

执行 CALL NEAR 后的栈

执行 CALL func 前 执行 CALL func 后 SP → [旧数据] SP → [返回 IP(2 字节)] SP+2 → [旧数据]

执行 CALL FAR 后的栈

执行 CALL FAR func 前 执行 CALL FAR func 后 SP → [旧数据] SP → [返回 IP(2 字节)] SP+2 → [返回 CS(2 字节)] SP+4 → [旧数据]

执行 INT n 后的栈

执行 INT n 前 执行 INT n 后 SP → [旧数据] SP → [返回 IP(2 字节)] SP+2 → [返回 CS(2 字节)] SP+4 → [FLAGS(2 字节)] SP+6 → [旧数据]

常见错误

RET代替IRET:会导致 FLAGS 没有被弹出,栈不平衡,返回地址错误

IRET代替RET:会多弹出 2 字节当作 FLAGS,导致 IP 和 CS 错位

RETF代替IRET:FLAGS 没有被恢复,中断标志可能错误

正确原则:用什么指令调用,就用对应的指令返回

  • CALL NEARRET

  • CALL FARRETF

  • INT nIRET

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/6 17:19:55

低配 Windows 设备调试 OpenClaw 流畅运行方案

🦞避开 90% 安装报错,OpenClaw v2.7.9 Windows11 系统化部署指南 ✨适用系统:Windows 11 专业版 / 家庭版全系列版本 OpenClaw(圈内俗称小龙虾)是一款人气很高的开源本地 AI 智能体,能够自主操控电脑设备…

作者头像 李华
网站建设 2026/6/6 17:19:02

新手零基础入门:在快马平台通过实践代码理解LangChain核心概念

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 请生成一份面向初学者的LangChain入门示例代码。代码需要演示LangChain最基础的三个概念:1、链(Chain):创建一个简单的提示模板链&a…

作者头像 李华
网站建设 2026/6/6 17:16:15

LabVIEW驱动改造:让老旧USB采集卡变身虚拟示波器

1. 项目缘起与核心价值几年前,我在整理一批老旧的数据采集设备时,翻出了一块型号为MSP-010501的USB数据采集卡。这块卡是12位精度的,硬件底子其实不错,但最大的问题是,原厂配套的软件要么早已丢失,要么就是…

作者头像 李华