函数 returns 后 esp 的值是多少?
What is the value of esp after a function returns?
在 C / x86 中,当 return 从函数中调用时,我们通常:
pop ebp
恢复上一个函数的帧指针
ret
其中(据我了解)包含隐式 pop eip
以便调用函数可以从 return 地址继续执行
此时,我期望 esp 包含什么?它会是指向 return 地址正上方的任何内容的指针,还是 esp 的值也被 ret
隐式更改?
谢谢:)
在 ret
之后,如果中间没有发生恶作剧,esp
应该包含与相应 call
之前相同的值。 call
指令将 return 值压入堆栈,ret
指令将其弹出。所以是的,你的直觉是正确的。
在 ret 之后,sp 应该与调用函数时的位置相同。
所以它会指向最后被压入堆栈的内容。
Will it be a pointer to whatever was directly above the return address, or is the value of esp also implicitly changed by ret ?
ret
有两种形式:ret
和ret N
。第一种形式简单地从堆栈中弹出 eip(这通常意味着 "take eip and add esp,4")并继续执行,因此 esp 指向调用函数时压入的最后一个参数 - 这意味着调用者必须通过后续 add esp, N
.
ret N
表示弹出 eip 后,esp 在同一条指令中加上值 N,因此调用者不需要这样做。缺点是你不能使用可变数量的参数,因为 'N' 只能是常量值。
在 C / x86 中,当 return 从函数中调用时,我们通常:
pop ebp
恢复上一个函数的帧指针ret
其中(据我了解)包含隐式pop eip
以便调用函数可以从 return 地址继续执行
此时,我期望 esp 包含什么?它会是指向 return 地址正上方的任何内容的指针,还是 esp 的值也被 ret
隐式更改?
谢谢:)
在 ret
之后,如果中间没有发生恶作剧,esp
应该包含与相应 call
之前相同的值。 call
指令将 return 值压入堆栈,ret
指令将其弹出。所以是的,你的直觉是正确的。
在 ret 之后,sp 应该与调用函数时的位置相同。
所以它会指向最后被压入堆栈的内容。
Will it be a pointer to whatever was directly above the return address, or is the value of esp also implicitly changed by ret ?
ret
有两种形式:ret
和ret N
。第一种形式简单地从堆栈中弹出 eip(这通常意味着 "take eip and add esp,4")并继续执行,因此 esp 指向调用函数时压入的最后一个参数 - 这意味着调用者必须通过后续 add esp, N
.
ret N
表示弹出 eip 后,esp 在同一条指令中加上值 N,因此调用者不需要这样做。缺点是你不能使用可变数量的参数,因为 'N' 只能是常量值。