函数返回后esp的值是多少?

sav*_*v0h 3 c x86 assembly nasm

在C/x86中,当从函数返回时,我们通常:

  1. pop ebp 恢复上一个函数的帧指针
  2. ret其中(据我所知)包含一个隐式,pop eip以便调用函数可以继续从返回地址执行

在这一点上,我可以期待esp包含什么?它是指向返回地址正上方的指针,还是esp的值也被隐含地改变了ret

谢谢 :)

Mat*_*att 9

它是指向返回地址正上方的指针,还是esp的值也被ret隐式改变了?

有两种形式ret:只是retret N.第一种形式只是弹出eip(这通常意味着"从eip中添加ep,加上esp,4")并继续执行,所以esp指向调用函数时推送的最后一个参数 - 这意味着调用者必须通过以下方式处理随后add esp, N.

ret N表示在弹出eip之后,esp在同一指令中按值N添加,因此调用者不需要这样做.缺点是你不能使用可变数量的args,因为'N'只能是常量值.