装配堆栈持久性

时间:2010-04-11 18:57:11

标签: assembly

我想知道在调用函数之后,我在堆栈中的数据是否持久。比如,我想知道是否(假设cdecl约定)我可以这样做(独立于函数 X 并且与优化无关):

push 1
push 2
push 3
call X
call X
call X
add 12 esp

另外,假设在调用之前我保存了推送值在全局变量中的位置。我可以在 X 中通过访问全局变量来改变它包含的值吗?就像,由于某种原因,我希望在 X 中我能够改变堆栈中的值,以便第二次和第三次调用 X 接收不同的值。

2 个答案:

答案 0 :(得分:1)

cdecl中,调用者在被调用者返回后清除堆栈。返回值放在EAX中,所以我认为可以安全地假设调用者可以按照您描述的方式清除堆栈 - 否则,cdecl将如何在实践中工作?

是的,X可以改变堆栈的内容。在装配中,一切都是开放的,实际上,限制很少。

答案 1 :(得分:0)

是的,你可以用i386 cdecl做到这一点(用x64这些args会在寄存器中。)但为什么呢?在函数中执行单个call并循环不是更简单(也更快)吗?你可以节省分支。