2010-01-15 16 views
5

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

+0

Visual C++ ha un modificatore '__declspec (naked)' che impedisce al compilatore di generare prologo ed epilogo. –

+0

__declspec (nudo) non è supportato durante la compilazione per destinazioni x64 (e anche per l'assembly in linea). – Andrey

risposta

3

Per la documentazione su convenzioni di chiamata e di come sono il parametro passato a una funzione (in registri? Che? Cosa c'è sullo stack, ecc) hanno uno sguardo al Agner Fog's document.

Quindi, è possibile dare un'occhiata al codice sorgente libffi per vedere come lo fanno.

+0

Grazie per aver risposto; Non sapevo libffi, lo controllerò, è grandioso. – Matthieu

+0

Se fossi in te, se possibile, farei semplicemente affidamento su libffi. È stabile, gestito e gestisce molti casi d'angolo –

+0

OK, il documento Agner Fog è molto utile. Ma libffi non salva tutti i registri, in particolare i registri YMM (non ancora?). A proposito, dovrei essere in grado di fare qualcosa con quello! Grazie mille. – Matthieu

Problemi correlati