2010-04-11 92 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和循環會不會更簡單(也更快)?你會節省分支。