2010-04-09 67 views

回答

4

它完全取決於實現如何將參數傳遞給函數。

函數參數可能不會傳遞到堆棧;例如,它們可以通過寄存器傳遞。

您將需要查找特定平臺的信息以確定參數如何傳遞。維基百科有一整頁致力於the various x86 calling conventions

+0

是的,在sparc上,前六個參數在寄存器中,但後來發現寄存器窗口溢出... – 2010-04-09 03:08:47

1

將參數壓入堆棧時,C會從右向左進行。但是,根據體系結構和參數數量,可能不會使用堆棧(或僅部分使用),而是使用寄存器來代替。

爲了論證,讓我們說我們正在處理x86架構(32位)。堆棧幀將看起來像...

(Stack grows down. High stack address is here) 
arg3 
arg2 
arg1 
ret addr   <--- Auto pushed by 'call' 
old base ptr  <--- Called function typically saves the old base ptr 
...    <--- Carve space for local variables 
(Low stack address is here.) 

與繼續以上實例,被調用的函數可以使用以下訪問參數...

movl 8(%ebp), %eax // move arg1 into EAX 
movl 12(%ebp), %edx // move arg2 into EDX 

等。

如果我沒有記錯的話,PowerPC有八個(8)寄存器可用於傳遞參數 - r3 ... r10(含)。至於其他體系結構,您必須查看它們。

希望這會有所幫助。

+0

「C從右到左」是特定於實現的。它描述了x86上C實現通常使用的「cdecl」調用約定。一個實現可以自由地將參數從左向右或以任何其他順序推送。 – 2010-04-09 18:46:00