2012-08-23 19 views
5

ho letto Microsoft's documentation, ma lo schema è così imbarazzante, ho pensato di doppio controllo per assicurarsi che sto comprensione correttamente ...x64 convenzione di chiamata (stack) e varargs

mia comprensione è il metodo generico con cui vengono passati parametri è questo:

--- 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 ----- 

sembra così imbarazzante nell'attuazione va_arg e tale ... questo è in realtà corretta?

+0

Questo non può essere corretto: lo spazio ombreggiato per args 1-4 è adiacente all'indirizzo di ritorno, secondo http://msdn.microsoft.com/en-us/library/ew5tede7 –

+0

Anche l'indirizzo di ritorno è in fondo alla pila, non in alto. –

+0

@HarryJohnston: Oh mio male, hai ragione, grazie ... non sono sicuro di cosa stavo pensando lì; fisso. Il resto è corretto? – Mehrdad

risposta

6

Lo schema è corretto

--- 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] 

L'indirizzo di ritorno è in cima alla pila (più recentemente spinto), seguito da uno spazio ombra per i primi quattro parametri, seguiti dai parametri 5 e poi.

I parametri vengono spostati da destra a sinistra: l'ultimo parametro (N) viene premuto per primo, quindi è il più vicino al fondo della pila.

+0

Tieni duro - lo stack cresce verso il basso, non è così, quindi il primo elemento da spingere è più vicino al * top *? Come nella seconda frase qui: http://msdn.microsoft.com/en-us/library/ew5tede7 –

+0

@HarryJohnston Dal momento che gli stack crescono verso il basso, l'elemento in cima allo stack (il più recente premuto) ha l'indirizzo più basso. Si trova nella parte inferiore dello stack frame dopo aver sottratto spazio per le variabili locali. Stack frame = parameters [bottom], return address [middle], locals [top]. Vedi lo schema. Stai confondendo lo spazio dei parametri con l'intero frame dello stack. –

+0

Sì, ho decisamente confuso la terminologia. Sono ancora un po 'perplesso sul significato della frase nell'articolo MSDN di riferimento - vuol dire che l'area dei parametri si trova in fondo allo stack * dal punto di vista del callee *? –

Problemi correlati