首页 > 解决方案 > 如何初始化 GNU C 全局寄存器变量

问题描述

GNU C 全局寄存器变量不能有初始值设定项。这不会编译为 C 或 C++:

// at global scope.
register int i asm ("r12") = 10;

给(上帝螺栓error: global register variable has initial value。本地范围当然没问题,但 GNU C本地寄存器变量是完全不同的东西。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 的顶部?

标签: cgccassemblyinline-assemblycpu-registers

解决方案


您无法初始化全局寄存器变量。

GCC 文档说明了这一点:

全局寄存器变量不能有初始值,因为可执行文件无法为寄存器提供初始内容。

另请注意以下段落:

选择寄存器时,请选择通常由机器上的函数调用保存和恢复的寄存器。这确保了不知道此保留的代码(例如库例程)将在返回之前将其恢复。

您不应该使用r12,它不会跨调用保存。


推荐阅读