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

x86汇编调用printf后执行add esp, 0x10指令的原因是什么?

x86汇编中add esp, 0x10指令的作用说明

这行指令的作用是清理调用printf时压入栈的参数空间,逻辑和x86 32位的C调用约定直接相关:

  • 32位环境下C标准库的printf函数默认采用cdecl调用约定,该约定明确要求:函数参数由调用者压入栈,且由调用者在函数执行完成返回后,负责清理栈上的参数空间,被调用的printf本身不会处理这部分参数的栈清理。
  • 统计call printf之前的压栈操作可以看到,代码一共执行了4次push操作,分别压入第三个参数、第二个参数、第一个参数、格式化字符串地址。32位模式下每次push会让栈指针esp向下偏移4字节,4次总共偏移了4*4=16字节,对应十六进制的0x10。
  • add esp, 0x10就是把栈指针向上回移16字节,直接释放之前压入的4个参数占用的栈空间,让栈恢复到压入这些参数之前的状态,避免栈空间泄漏,同时保证后续leave、retn指令执行时栈指针处于正确位置,不会出现返回地址错误、栈失衡的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 06:36:03