2011-08-21 11 views
7

Sto imparando l'assembly x64 su Windows per "divertimento". Il MSDN documentation for the x64 calling convention on Windows dice:Nell'ABI Win64, è possibile utilizzare lo spazio di stack degli argomenti riservati per l'archiviazione generica?

Il chiamante è responsabile per l'allocazione dello spazio per i parametri per il chiamato, e deve sempre allocare lo spazio sufficiente per i parametri 4 registri, anche se il chiamato non ha che molti parametri. Questo aiuta nella semplicità del supporto delle funzioni non prototipate C e delle funzioni vararg C/C++.

Poiché le funzioni non sono funzioni C senza prototipo o varargs C/C++ funzioni, questo significa che posso sempre usare [rsp+8] a [rsp+32] (assumendo un valore non modificato di rsp subito dopo una chiamata) per la memorizzazione di uso generale nel mio funzione , come per le variabili locali?

risposta

6

Sì, è possibile utilizzare lo spazio di modifica dei parametri in entrata per qualsiasi scopo. Ma questo lo sapevi già: il permesso di farlo è già implicito nella legalità di modificare i parametri in entrata.

void somefunction(int arg1) 
{ 
    arg1 = anyvalue; // mov [rsp+8], anyvalue 
} 
+0

Grazie per la risposta chiara. Comunque la modifica dei parametri in entrata sarebbe piuttosto 'mov rcx, anyvalue' dato che l'argomento è passato tramite 'rcx', motivo per cui non ero sicuro di' [rsp + 8] '. – Trillian

+3

Ma ti è anche permesso di versare i parametri in entrata. Ecco perché lo spazio riservato è lì, dopo tutto. 'void somefunction (int arg1) {/ * spill: mov [rsp + 8], rcx */arg1 = anyvalue;/* mov [rsp + 8], qualsiasi valore * /} ' –

1

Penso che quello che sta cercando di fare è più o meno così:

*(decltype(&anyvalue))((PBYTE)&arg1+8) = anyvalue; // mov [rsp+8+8], anyvalue 

Per quanto ho capito, Microsoft afferma che si sono tenuti a destinare uno spazio sufficiente per il chiamato per memorizzare quattro registri (rcx, rdx, r8. r9), anche in una funzione che richiede solo un argomento (in rcx).

Nota: Mi dispiace per il codice c brutto e il casting vecchia scuola mescolato con la nuova parola chiave decltype