Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何初始化GNU C全局寄存器变量_C_Gcc_Assembly_Inline Assembly_Cpu Registers - Fatal编程技术网

如何初始化GNU 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() {

不能有初始值设定项。这不会编译为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()
{
    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,其中yes
r12
是call clobbered。@PeterCordes我是在假设ARM。