Pregunta

Recuerdo algunas reglas de hace un tiempo (procesadores Intel anteriores a 32 bits), cuando era bastante frecuente (al menos para mí) tener que analizar la salida del ensamblaje generado por los compiladores C / C ++ (en mi caso, Borland / Turbo en ese tiempo) para encontrar cuellos de botella en el rendimiento y mezclar de manera segura las rutinas de ensamblaje con el código C / C ++. Cosas como el uso del registro SI para el puntero this , el uso de AX para valores de retorno, que deben conservarse cuando se devuelve una rutina de ensamblaje, etc.

Ahora me preguntaba si hay alguna referencia para los compiladores C / C ++ más populares (Visual C ++, GCC, Intel ...) y procesadores (Intel, ARM, ...), y si no, dónde encontrar el Piezas para crear una. Ideas?

¿Fue útil?

Solución

Está preguntando acerca de la "interfaz binaria de aplicación" (ABI) y convenciones de llamadas. Por lo general, los establecen los sistemas operativos y las bibliotecas, y los compiladores y vinculadores los aplican. Google para " ABI " o "convenio de llamada". Algunos puntos de partida de Wikipedia y Debian para ARM .

Otros consejos

Convenciones de llamadas de Agner Fog " El documento resume, entre otras cosas, las ABI de Windows y Linux de 64 y 32 bits: http: // www .agner.org / optimise / calling_conventions.pdf . Consulte la Tabla 4 en la p.10 para obtener un resumen del uso del registro.

Una advertencia de la experiencia personal: no inserte suposiciones sobre el ABI en el ensamblaje en línea. Si escribe una función en un ensamblaje en línea que asume la devolución y / o la transferencia de parámetros en registros particulares (por ejemplo, eax, rdi, rsi), se interrumpirá si / cuando el compilador la integra.

El compilador Open Watcom C / C ++ admite dos convenciones de llamada, basadas en el registro (predeterminado) y en la pila (muy cerca de lo que usan otros compiladores). La Guía del usuario para este compilador los describe y está disponible de forma gratuita en línea , junto con el compilador en sí . Puede encontrar estos temas en la Guía del usuario especialmente útiles:

  • 10.4.1 Pasar argumentos utilizando convenciones de llamadas basadas en registros
  • 10.4.6 Uso de convenciones de llamadas basadas en la pila
  • 10.5 Convenciones de llamadas para aplicaciones basadas en 80x87

Bueno, hoy si la optimización está activada, no hay ninguna. Pero GCC le permite declarar que su instrucción de ensamblaje debe usar una variable particular independientemente de si está en el registro o no, o incluso forzar a GCC a poner esa variable en un registro que pueda usar con su instrucción. También puede declarar qué registra sus reservas de bloque de ensamblaje en línea para sí mismo (por lo que el compilador debe generar un código apropiado para guardar / restaurar alrededor de su pieza en línea, si es necesario)

Creo, pero de ninguna manera estoy seguro de que GCC use Itanium ABI para la mayor parte de su función; Las incompatibilidades entre este y el ABI que utiliza son documentado .

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