Tag: 寄存器分配

GCC不在函数调用中保存/恢复保留寄存器

我在GCC有一个场景给我带来了问题。 我得到的行为不是我期望的行为。 总结一下这种情况,我提出了一些x86-64的新指令,这些指令是在硬件模拟器中实现的。 为了测试这些指令,我使用现有的C源代码并使用hex对新指令进行手动编码。 因为这些指令与现有的x86-64寄存器交互,所以我使用input / output / clobber列表来声明GCC的依赖关系。 发生的事情是,如果我调用一个函数,例如printf,则不会保存和恢复相关寄存器。 例如 register unsigned long r9 asm (“r9”) = 101; printf(“foo %s\n”, “bar”); asm volatile (“.byte 0x00, 0x00, 0x00, 0x00” : /* no output */ : “q” (r9) ); 101被分配给r9,并且内联汇编(在此示例中为假)依赖于r9。 这在没有printf的情况下正确运行,但是当它存在时,GCC不会保存和恢复r9,并且在调用自定义指令时会有另一个值。 我想也许GCC可能秘密地将赋值更改为变量 r9,但是当我这样做时 asm volatile (“.byte %0” : /* no output */ : “q” (r9) ); […]

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

这是一个奇怪的请求,但我有一种感觉,它可能是可能的。 我想要的是将一些pragma或指令插入到我的代码区域(用C语言编写),这样GCC的寄存器分配器就不会使用它们。 我知道我可以做这样的事情,这可能会为这个变量留下这个寄存器 register int var1 asm (“EBX”) = 1984; register int var2 asm (“r9”) = 101; 问题是我直接插入新指令(用于硬件模拟器),而GCC和GAS还没有识别出这些指令。 我的新指令可以使用现有的通用寄存器,我想确保我保留了一些(即r12-> r15)。 现在,我正在模拟环境中工作,我想快速完成我的实验。 将来我会添加GAS并将内在函数添加到GCC中,但是现在我正在寻找快速修复。 谢谢!

寄存器变量的地址

在C中,我们不能使用&来查找寄存器变量的地址,但在C ++中我们也可以这样做。 为什么它在C ++中合法而在C中不合法? 有人可以深入解释这个概念。