You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GAS中retf $12指令的语法含义及作用是什么?

关于retf $12的含义与作用解析

1. retf指令的基础作用

retf是x86架构的远返回指令,用于从远调用(如call far、跨特权级的系统调用入口)返回。不带立即数时,它的执行流程是:

  • 从栈顶弹出值到EIP(指令指针寄存器,恢复返回地址)
  • 从新的栈顶弹出值到CS(代码段寄存器,恢复用户态代码段选择子)
  • 跳转到CS:EIP指向的用户态指令继续执行

2. 带立即数的retf $imm16的特殊行为

当retf后跟立即数(如这里的$12)时,除了完成上述远返回操作,还会执行栈指针调整:
ESP += imm16
也就是将栈指针向上移动指定字节数,跳过栈上对应长度的数据。

3. 结合你的系统调用处理代码分析

从代码上下文可以看出,用户态触发系统调用时,会先将3个参数(每个4字节,共12字节)压入栈,再通过远调用进入内核态的syscall_handler:

; 用户态代码示例
push arg3
push arg2
push arg1
call far syscall_handler  ; 远调用会自动将用户态CS、EIP压栈

进入syscall_handler后,栈结构(从栈顶到栈底)大致为:

  • pusha压入的8个寄存器(32字节)
  • push %ds压入的用户态数据段选择子(4字节)
  • 远调用自动压入的用户态CS、EIP(8字节)
  • 用户态手动压入的3个参数(12字节)

syscall_handler中通过push 13*4(%ebp)等操作,将用户态压入的3个参数传递给do_syscall处理。当处理完成后:

  • popa和pop %ds恢复内核态栈到进入syscall_handler时的状态
  • retf $12执行远返回:先恢复用户态的CS和EIP,再将ESP加12,刚好跳过用户态压入的3个参数,让用户态栈回到调用系统调用前的状态,无需用户态手动清理栈空间。

内容的提问来源于stack exchange,提问作者Markity

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 12:45:43