2012-08-23 19 views
5

varargs, ancak düzeni o kadar garipx64 çağırarak kongre (yığın) ve <a href="http://msdn.microsoft.com/en-us/library/dd2wa36c.aspx" rel="noreferrer">Microsoft's documentation</a> okudum

--- bottom of stack --- 
(return address) 
[shadow space for arg 1] 
[shadow space for arg 2] 
[shadow space for arg 3] 
[shadow space for arg 4] 
arg N 
arg N - 1 
arg N - 2 
... 
arg 6 
arg 5 
---- top of stack ----- 

va_arg ve bu tür uygularken O kadar garip görünüyor ... Bu aslında doğrudur: parametrelerin geçirilmesi hangi jenerik yöntem bu mi?

+0

Doğru olamaz: http://msdn.microsoft.com/en-us/library/ew5tede7 –

+0

adresine göre, 1-4 numaralı postalar için gölge alanı, dönüş adresinin bitişiğindedir yığının alt kısmında, üstte değil. –

+0

@HarryJohnston: Oh, kötüyüm, haklısın, teşekkürler ... orada düşündüğümden emin değilim; sabit. Gerisi doğru mu? – Mehrdad

cevap

6

doğru diyagram gönderici adresi yığının üst kısmında

--- Bottom of stack --- RSP + size  (higher addresses) 
arg N 
arg N - 1 
arg N - 2 
... 
arg 6 
arg 5 
[shadow space for arg 4] 
[shadow space for arg 3] 
[shadow space for arg 2] 
[shadow space for arg 1] 
(return address) 
---- Top of stack ----- RSP   (lower addresses) 
[grows downward] 

grup parametre 5 ve ileriye ardından takip eden dört parametre, gölge alanı, ardından (son eklenen).

Parametreler sağdan sola doğru itilir: İlk parametre (N) önce itilir, böylece yığının en yakınına doğrudur.

+0

Bekle - yığın aşağı doğru büyür, öyle değil mi? Böylece ilk itilecek öğe en üste * en yakın * mı? Buradaki ikinci cümlede olduğu gibi: http://msdn.microsoft.com/en-us/library/ew5tede7 –

+0

@HarryJohnston Yığınlar aşağı doğru büyüdüğünden, yığının üstündeki (en son itilen) öğe en düşük adrese sahiptir. Yerel değişkenler için alan çıkardıktan sonra yığın çerçevesinin en altındadır. Yığın çerçevesi = parametreler [alt], dönüş adresi [orta], yerliler [üst]. Diyagrama bakınız. Parametre boşluğunu tüm yığın çerçevesiyle karıştırıyorsunuz. –

+0

Evet, kesinlikle terminolojimin kafası karışmıştı. Yine de, başvurulan MSDN makalesindeki tümcenin anlamıyla ilgili biraz şaşkınım - bu, parametre alanının, beklemenin * noktasından * yığınının altında olduğu anlamına mı geliyor? –