我想知道在调用函数之后,我在堆栈中的数据是否持久。比如,我想知道是否(假设cdecl约定)我可以这样做(独立于函数 X 并且与优化无关):
push 1
push 2
push 3
call X
call X
call X
add 12 esp
另外,假设在调用之前我保存了推送值在全局变量中的位置。我可以在 X 中通过访问全局变量来改变它包含的值吗?就像,由于某种原因,我希望在 X 中我能够改变堆栈中的值,以便第二次和第三次调用 X 接收不同的值。
答案 0 :(得分:1)
在cdecl
中,调用者在被调用者返回后清除堆栈。返回值放在EAX
中,所以我认为可以安全地假设调用者可以按照您描述的方式清除堆栈 - 否则,cdecl
将如何在实践中工作?
是的,X
可以改变堆栈的内容。在装配中,一切都是开放的,实际上,限制很少。
答案 1 :(得分:0)
是的,你可以用i386 cdecl
做到这一点(用x64这些args会在寄存器中。)但为什么呢?在函数中执行单个call
并循环不是更简单(也更快)吗?你可以节省分支。