GCC: interdire l’utilisation de certains registres

C’est une demande étrange mais j’ai le sentiment que cela pourrait être possible. Ce que j’aimerais, c’est insérer des pragmas ou des directives dans des zones de mon code (écrites en C) afin que l’allocateur de registres de GCC ne les utilise pas.

Je comprends que je peux faire quelque chose comme ça, ce qui pourrait mettre de côté ce registre pour cette variable

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

Le problème est que j’insère de nouvelles instructions (pour un simulateur matériel) directement et que GCC et GAS ne les reconnaissent pas encore. Mes nouvelles instructions peuvent utiliser les registres à usage général existants et je veux m’assurer que certains d’entre eux (par exemple, r12-> r15) sont réservés.

En ce moment, je travaille dans un environnement de maquette et je veux faire mes expériences rapidement. Dans l’avenir, je vais append GAS et append des éléments insortingnsèques à GCC, mais je cherche actuellement une solution rapide.

Merci!

    Lors de l’écriture de l’assembleur en ligne GCC, vous pouvez spécifier une “liste d’éléments” – une liste de registres susceptibles d’être écrasés par votre code d’assembleur en ligne. GCC fera alors tout ce qui est nécessaire pour sauvegarder et restaurer les données de ces registres (ou éviter d’abord les utiliser) au cours du segment inline asm. Vous pouvez également lier des registres d’entrée ou de sortie à des variables C.

    Par exemple:

     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" ); } 

    Pour plus d’informations, consultez le GCC-Inline-Asm-HOWTO .

    Si vous utilisez des variables de registre explicites globales , celles-ci seront réservées dans toute l’unité de compilation et ne seront utilisées par le compilateur pour rien d’autre (il peut toujours être utilisé par les bibliothèques du système, choisissez donc quelque chose qui sera restauré par ces bibliothèques). Les variables de registre locales ne garantissent pas que votre valeur sera dans le registre à tout moment, mais uniquement lorsqu’elle est référencée par code ou en tant qu’opérande asm .

    Si vous écrivez un bloc asm en ligne pour vos nouvelles instructions, certaines commandes informent GCC des registres utilisés par ce bloc et de la manière dont ils sont utilisés. GCC évitera alors d’utiliser ces registres ou au moins sauvegardera et rechargera leur contenu.