海湾合作委员会:禁止使用某些登记册

这是一个奇怪的请求,但我有一种感觉,它可能是可能的。 我想要的是将一些pragma或指令插入到我的代码区域(用C语言编写),这样GCC的寄存器分配器就不会使用它们。

我知道我可以做这样的事情,这可能会为这个变量留下这个寄存器

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

问题是我直接插入新指令(用于硬件模拟器),而GCC和GAS还没有识别出这些指令。 我的新指令可以使用现有的通用寄存器,我想确保我保留了一些(即r12-> r15)。

现在,我正在模拟环境中工作,我想快速完成我的实验。 将来我会添加GAS并将内在函数添加到GCC中,但是现在我正在寻找快速修复。

谢谢!

在编写GCC内联汇编程序时,您可以指定“clobber list” – 可能被内联汇编程序代码覆盖的寄存器列表。 然后,GCC将在内联asm段的过程中执行保存和恢复这些寄存器中的数据(或首先避免使用它们)所需的任何操作。 您还可以将输入或输出寄存器绑定到C变量。

例如:

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

有关更多信息,请参阅GCC-Inline-Asm-HOWTO 。

如果使用全局显式寄存器变量 ,它们将在整个编译单元中保留,并且编译器不会将其用于任何其他内容(它可能仍由系统库使用,因此选择将由这些库恢复的内容)。 本地寄存器变量不保证您的值始终在寄存器中,但仅在代码引用或作为asm操作数引用时。

如果为新指令编写内联asm块,则会有一些命令通知GCC该块使用哪些寄存器以及如何使用它们。 然后GCC将避免使用这些寄存器或至少保存和重新加载其内容。