x86汇编循环中为何给栈指针esp加4?
关于x86汇编中
add esp,4指令的疑问 我正在学习逆向工程,遇到一段x86汇编的循环示例代码:
00401036 mov [ebp+var_4], 0 0040103D mov [ebp+var_8], 0 00401044 loc_401044: 00401044 cmp [ebp+var_4], 0 00401048 jnz short loc_401063 0040104A call performAction 0040104F mov [ebp+var_8], eax 00401052 mov eax, [ebp+var_8] 00401055 push eax 00401056 call checkResult 0040105B add esp, 4 0040105E mov [ebp+var_4], eax 00401061 jmp short loc_401044
我知道esp是栈指针,想请教:这段循环代码中为何要执行add esp,4指令?我原本以为只有递归调用才会有此类栈操作。
解答
这段代码里的add esp,4是用来清理栈上的函数调用参数,和递归没有直接关系,这是x86汇编中cdecl调用约定的典型操作:
- 调用
checkResult之前,用push eax把一个4字节的参数压到了栈上(32位x86环境下,寄存器是4字节宽度)。 call指令执行时会把返回地址压栈,但checkResult函数遵循cdecl约定的话,它不会负责清理自己的参数栈,而是由调用者完成这个操作。- 所以调用完
checkResult后,必须用add esp,4把栈指针往高地址移动4字节,将之前压入的参数从栈上“移除”,避免栈溢出或者后续栈操作出错。
简单来说:只要你手动给函数压了参数,且函数不负责清理参数栈,调用者就必须手动调整esp来恢复栈的平衡,不管是不是递归调用。
内容的提问来源于stack exchange,提问作者Kenneth Cox
相关产品推荐
相关产品推荐

