Devo eseguire un'interfaccia (ad esempio un wrapper) che consenta una chiamata dal codice assembly X86_64 utilizzando la sua convenzione di chiamata alla funzione C, con altre convenzioni di chiamata. La cosa migliore sarebbe essere piuttosto "compilatore indipendente" (giusto modificare il wrapper), quindi sto cercando qualcosa che metta registri/stack roba sul compilatore. Ho già guardato qui: Custom calling convention for P/Invoke and C# ed è arrivato vicino a quello che devo fare. Attualmente sto usando GCC, ma i suggerimenti di altri compilatori sono i benvenuti!Convenzione di chiamata X86_64 personalizzata alla chiamata di funzione C
Così, qui è la cosa, per una migliore vista del problema (la convenzione di codifica personalizzato è strano):
pushq %r11 # saves r11 for call
movq 64bits_address %r11 # move a 64 bits address that points on a data structure
callq *8(%r11) # calls an address in the data structure
popq %r11 # restores %r11 ; return value is in the structure
ho bisogno di essere in grado di chiamare una funzione C "speciale" (involucro) ; qui il lavoro sarà quello di inviare chiamate tra le altre funzioni C. Quindi questo wrapper deve trovare% r11, salvare tutti i registri e preparare lo stack per ulteriori chiamate. C'è un modo corretto per farlo in C (con qualche in linea asm)?
Grazie mille
Visual C++ ha un modificatore '__declspec (naked)' che impedisce al compilatore di generare prologo ed epilogo. –
__declspec (nudo) non è supportato durante la compilazione per destinazioni x64 (e anche per l'assembly in linea). – Andrey