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

