Ho appena iniziato a imparare l'assembly x64 e ho una domanda su funzioni, argomenti e stack. Per quanto ho capito, i primi quattro argomenti in una funzione vengono passati ai registri rcx, rdx, r8 e r9 (e xmm0-xmm3 per i float) in Windows. Quindi, una funzione aggiunta banale con quattro parametri sarebbe simile a questa:È necessario riservare lo spazio di stack per funzioni inferiori a quattro argomenti?
add:
mov r10, rcx
add r10, rdx
add r10, r8
add r10, r9
mov rax, r10
ret
Tuttavia, ho incontrato documentation that mentions this:
Come minimo, ogni funzione deve prenotare 32 byte (quattro 64- valori bit) nello stack. Questo spazio consente ai registri passati nella funzione di essere facilmente copiati in una posizione di stack nota. La funzione callee non è necessaria per riversare i parametri del registro di input nello stack, ma la prenotazione dello spazio di stack assicura che sia possibile se necessario.
Quindi, devo prenotare lo spazio di stack anche se le funzioni che sto eseguendo richiedono quattro parametri o meno, o è solo una raccomandazione?
http://www.agner.org/ optimize/optimizing_assembly.pdf capitolo 4 ha un esempio che sembra indicare che devi * sempre * riservare spazio. – user786653
Dannazione, troppo tardi per la modifica. [oldnewthing] (http://blogs.msdn.com/b/oldnewthing/archive/2004/01/14/58579.aspx) post di blog sulla convenzione di chiamata amd64. – user786653
Un altro pezzo del puzzle per te: hai una funzione *** ***, il che significa che non chiama altre funzioni. – jww