Pregunta

Tengo que hacer una interfaz (por ejemplo, un contenedor) que permiten una llamada de código ensamblador 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 "independiente del compilador" (juste modificación de la envoltura), por lo que estoy buscando algo que pone registros / pila en la materia compilador espalda. Ya he Mira aquí: de llamadas personalizado convención para P / Invoke y C # y que ha llegado cerca de lo que he de hacer. Actualmente, estoy usando GCC, pero consejos de otros compiladores son bienvenidos!

Por 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í trabajo será el de despachar las llamadas entre otras funciones C. Por lo que este envoltorio necesita encontrar% r11, guardar todos los registros y preparar la pila para su posterior llamada. ¿Hay una manera correcta de hacer esto en C (con un poco de asm en línea)?

Muchas gracias

¿Fue útil?

Solución

Para obtener documentación acerca de convenciones de llamada y cómo están parámetro pasado a una función (en los registros? Lo que? Lo que hay en la pila, etc.) echar un vistazo a documento de Agner Fog .

A continuación, se puede echar un vistazo a libffi 's código fuente para ver cómo lo hacen.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top