【发布时间】:2020-02-07 19:07:11
【问题描述】:
GNU C global register variables 不能有初始化器。这不会编译为 C 或 C++:
// at global scope.
register int i asm ("r12") = 10;
提供 (Godbolt) error: global register variable has initial value。本地范围当然没问题,但 GNU C local 寄存器变量是完全不同的东西。 (仅保证在与扩展 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);
}
如何在全局范围内初始化i,而不是等到main的顶部?
【问题讨论】:
-
你想解决什么问题?
-
如果你使用
libc函数,全局寄存器变量不一定会起作用。手册很清楚:使用全局寄存器变量会更改 ABI,从而使您的代码与任何库不兼容。 -
绝对不可能将全局或静态变量放入寄存器中。但如果 i 是自动变量,则没有问题。
register int i asm ("r12")=25;如果在函数中声明 in 则完全有效。如前所述,它的实用性值得商榷。 -
不知道为什么我的 cmets 不断被删除,但这是最后一次。使用correct syntax 调用构造函数,但调用它的
__libc_csu_init恰好覆盖r12值。那是因为fuz quoted:“使用全局寄存器变量会更改 ABI,从而使您的代码与任何库不兼容”
标签: c gcc assembly inline-assembly cpu-registers