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
Visual C++ tiene un modificador '__declspec (naked)' que impide que el compilador genere el prólogo y el epílogo. –
__declspec (naked) no es compatible cuando se compila para objetivos x64 (y también en el ensamblaje en línea). – Andrey