如何初始化GNU C全局寄存器变量
不能有初始值设定项。这不会编译为C或C++:如何初始化GNU C全局寄存器变量,c,gcc,assembly,inline-assembly,cpu-registers,C,Gcc,Assembly,Inline Assembly,Cpu Registers,不能有初始值设定项。这不会编译为C或C++: // at global scope. register int i asm ("r12") = 10; 给出()错误:全局寄存器变量具有初始值。当然,局部范围是可以的,但是GNUC局部寄存器变量是完全不同的。(仅保证与扩展的asm()语句进行交互。) 代码 #include<stdio.h> register int i asm ("r12"); //how to initialize i here? int main() {
// at global scope.
register int i asm ("r12") = 10;
给出()错误:全局寄存器变量具有初始值
。当然,局部范围是可以的,但是GNUC局部寄存器变量是完全不同的。(仅保证与扩展的asm()
语句进行交互。)
代码
#include<stdio.h>
register int i asm ("r12"); //how to initialize i here?
int main()
{
i=10; // Would rather avoid this workaround
printf("%d\n",i);
}
#包括
寄存器int i asm(“r12”)//如何在这里初始化i?
int main()
{
i=10;//宁愿避免这种解决方法
printf(“%d\n”,i);
}
如何在全局范围内初始化
i
,而不是等到main的顶部?您不能初始化全局寄存器变量
缔约国指出:
全局寄存器变量不能有初始值,因为可执行文件无法为寄存器提供初始内容
还请注意以下段落:
选择寄存器时,请选择通常通过计算机上的函数调用保存和还原的寄存器。这可以确保不知道此保留的代码(如库例程)在返回之前将其还原
您不应该使用
r12
,它不会跨调用保存。您试图解决什么问题?如果您使用libc
函数,则全局寄存器变量不一定会起作用。手册非常清楚:使用全局寄存器变量会更改ABI,从而使您的代码与任何库都不兼容。绝对不可能将全局或静态变量放入寄存器中。但如果我是一个自动变量,就没有问题了<代码>寄存器int i asm(“r12”)=25如果在函数中声明,则代码>完全有效。如前所述,它的有用性是有争议的。不知道为什么我的评论不断被删除,但这是最后一次。使用构造函数会被调用,但是调用它的\uu libc\u csu\u init
会覆盖r12
值。这是因为在x86-64 System V中,r12..r15
保留了以下调用:“使用全局寄存器变量会更改ABI,从而使代码与任何库不兼容”。我猜你是在假设这是ARM,其中yesr12
是call clobbered。@PeterCordes我是在假设ARM。