2010-01-15 13 views
5

Tengo que hacer una interfaz (por ejemplo, un contenedor) que permita una llamada desde el código de ensamblado X86_64 usando su convención de llamada a la función C, con otra convención de llamada. Lo mejor sería ser bastante "compilador independiente" (juste modificando el wrapper), así que estoy buscando algo que coloque registros/pila de cosas en el compilador. Ya lo busqué aquí: Custom calling convention for P/Invoke and C# y está muy cerca de lo que tengo que hacer. Actualmente, estoy usando GCC, ¡pero las sugerencias de otros compiladores son bienvenidas!Convención de llamada personalizada X86_64 a C llamada a función

lo tanto, aquí está la cosa, para una mejor vista del problema (la convención de codificación personalizada es extraño):

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 

tengo que ser capaz de llamar a una función "especial" (envoltorio) C ; aquí el trabajo será enviar llamadas entre otras funciones de C. Por lo tanto, este contenedor necesita encontrar% r11, guardar todos los registros y preparar la pila para futuras llamadas. ¿Hay una forma adecuada de hacer esto en C (con algunos asm en línea)?

Muchas gracias

+0

Visual C++ tiene un modificador '__declspec (naked)' que impide que el compilador genere el prólogo y el epílogo. –

+0

__declspec (naked) no es compatible cuando se compila para objetivos x64 (y también en el ensamblaje en línea). – Andrey

Respuesta

3

Para obtener documentación acerca de convenciones de llamada y cómo son el parámetro que se pasa a una función (en los registros? Lo que? Lo que hay en la pila, etc.) tienen un vistazo a Agner Fog's document.

Luego, puede echar un vistazo al código fuente libffi para ver cómo lo hacen.

+0

Gracias por responder; No sabía Libffi, voy a comprobar esto, suena genial. – Matthieu

+0

Si yo fuera tú, si es posible, solo confiaría en libffi. Es estable, mantenido y maneja muchos casos de esquina –

+0

OK, el documento de Agner Fog es muy útil. Pero libffi no guarda todos los registros, en particular los registros YMM (¿todavía no?). Por cierto, ¡debería poder hacer algunas cosas con eso! Muchas gracias. – Matthieu

Cuestiones relacionadas