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
相关产品推荐
相关产品推荐

