code assembler asm c gcc assembly gas register-allocation

assembler - GCC: Prohibir el uso de algunos registros



use assembler in c (3)

Esta es una petición extraña, pero tengo la sensación de que podría ser posible. Lo que me gustaría es insertar algunos pragmas o directivas en áreas de mi código (escritas en C) para que el asignador de registro de GCC no las use.

Entiendo que puedo hacer algo como esto, que podría dejar de lado este registro para esta variable

register int var1 asm ("EBX") = 1984; register int var2 asm ("r9") = 101;

El problema es que estoy insertando nuevas instrucciones (para un simulador de hardware) directamente y GCC y GAS aún no las reconocen. Mis nuevas instrucciones pueden usar los registros de propósito general existentes y quiero asegurarme de que tengo algunos de ellos (es decir, r12-> r15) reservados.

En este momento, estoy trabajando en un entorno de maqueta y quiero hacer mis experimentos rápidamente. En el futuro, agregaré GAS y agregaré intrínsecos a GCC, pero en este momento estoy buscando una solución rápida.

¡Gracias!


Al escribir el ensamblador en línea de GCC, puede especificar una "lista de palabras clave": una lista de registros que puede sobrescribir el código del ensamblador en línea. GCC hará lo que sea necesario para guardar y restaurar datos en esos registros (o evitar su uso en primer lugar) en el transcurso del segmento de AS en línea. También puede vincular registros de entrada o salida a variables C.

Por ejemplo:

inline unsigned long addone(unsigned long v) { unsigned long rv; asm("mov $1, %%eax;" "mov %0, %%ebx;" "add %%eax, %%ebx" : /* outputs */ "b" (rv) : /* inputs */ "g" (v) /* select unused general purpose reg into %0 */ : /* clobbers */ "eax" ); }

Para obtener más información, consulte GCC-Inline-Asm-HOWTO .


Si escribe un bloque de ASM en línea para sus nuevas instrucciones, hay comandos que le informan a GCC qué registros usa ese bloque y cómo se usan. GCC evitará usar esos registros o al menos guardará y volverá a cargar sus contenidos.


Si utiliza variables de registro explícitas globales , éstas se reservarán en toda la unidad de compilación, y el compilador no las utilizará para nada más (aún puede ser utilizado por las bibliotecas del sistema, por lo tanto, elija algo que las restaure). las variables de registro local no garantizan que su valor estará en el registro en todo momento, sino solo cuando se lo referencia por código o como un operando de asm .