2010-04-11 93 views
1

我想知道如果在调用函数后,我在堆栈中的数据是持久的。就像,我想知道,如果(假设cdecl调用约定)我可以做到这一点(独立的什么是独立的X优化的函数来完成):汇编堆栈持久性

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

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

回答

1

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

是的,X可以改变堆栈的内容,如果它想。在汇编中,一切都是开放的,真的,有很少的限制。

0

是的,你可以用i386 cdecl这样做(用x64这些参数将在寄存器中)。但为什么?在功能中做单个call和循环会不会更简单(也更快)?你会节省分支。