Registre las reglas de asignación en el código generado por los principales compiladores de C / C ++

votos
4

Recuerdo algunas reglas de hace un tiempo (procesadores Intel pre-32bit), cuando era bastante frecuente (al menos para mí) tener que analizar la salida de ensamblaje generada por los compiladores C / C ++ (en mi caso, Borland / Turbo en ese momento) para encontrar cuellos de botella de rendimiento y para mezclar de forma segura las rutinas de ensamblaje con el código C / C ++. Cosas como usar el registro SI para este puntero, AX se usa para valores devueltos, que los registros 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 las piezas para crear uno. Ideas?

Publicado el 01/11/2008 a las 22:00
fuente por usuario
En otros idiomas...                            


5 respuestas

votos
11

Usted está preguntando acerca de la "interfaz binaria de la aplicación" (ABI) y las 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 "convención de llamadas". Algunos puntos de partida de Wikipedia y Debian para ARM .

Respondida el 01/11/2008 a las 22:43
fuente por usuario

votos
0

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á registrada o no, o incluso forzar a GCC a colocar esa variable en un registro utilizable con sus instrucciones. También puede declarar qué registros guarda su bloque de ensamblaje en línea (para que el compilador genere un código de guardado / restauración apropiado alrededor de su pieza en línea, si es necesario)

Respondida el 01/11/2008 a las 22:47
fuente por usuario

votos
0

Creo, pero de ninguna manera estoy seguro de que GCC use Itanium ABI para la mayor parte de su función; las incompatibilidades entre él y el ABI que utiliza están documentadas .

Respondida el 01/11/2008 a las 23:11
fuente por usuario

votos
1

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

  • 10.4.1 Transferencia de argumentos utilizando convenciones de llamadas basadas en registros
  • 10.4.6 Uso de convenciones de llamadas basadas en pila
  • 10.5 Convenciones de llamada para aplicaciones basadas en 80x87
Respondida el 03/11/2008 a las 09:05
fuente por usuario

votos
4

Agner del documento "convenciones de llamada" niebla resume, entre otras cosas, el Windows y Linux de 64 y 32 bits ABIs: http://www.agner.org/optimize/calling_conventions.pdf . Ver Tabla 4 en la página 10 para un resumen del uso del registro.

Una advertencia de la experiencia personal: No incrustar suposiciones acerca de la ITB en ensamblador en línea. Si se escribe una función en ensamblador en línea que asume retorno y / o parámetro de transferencia de registros particulares (por ejemplo, EAX, RDI, RSI), se romperá si / cuando la función se colocarán en línea por el compilador.

Respondida el 07/08/2012 a las 20:35
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more