如何通知 GCC 不使用特定寄存器

San*_*mar 4 linux compiler-construction gcc cpu-registers

假设我有一个非常大的源代码,并且打算rdx在执行期间完全不使用寄存器,即,在生成汇编代码时,我只想通知我的编译器(GCC)它根本不应该使用rdx

注意:注册rdx只是一个例子。我可以使用任何可用的 Intel x86 寄存器。

我什至很高兴更新编译器的源代码并使用我的自定义 GCC。但是需要对源代码进行哪些更改?

chi*_*ill 6

您告诉 GCC 不要通过-ffixed-reg选项(gcc docs)分配寄存器。

  • -ffixed-reg

    将命名的寄存器reg视为固定寄存器;生成的代码永远不应该引用它(除非作为堆栈指针、帧指针或其他固定角色)。 reg必须是寄存器的名称。接受的寄存器名称是机器特定的,并在机器描述宏文件的 REGISTER_NAMES 宏中定义。

例如,gcc -ffixed-r13将使 gcc 完全不理会它。使用属于调用约定的一部分或某些指令所需的寄存器可能会出现问题。


Kos*_*taZ 5

您可以将一些全局变量放入该寄存器。对于 ARM CPU,您可以这样做:

register volatile type *global_ptr asm ("r8")

该指令使用通用寄存器“r8”来保存global_ptr指针的值。

有关实际示例,请参阅 U-Boot 中的源代码:

http://git.denx.de/?p=u-boot.git;a=blob;f=arch/arm/include/asm/global_data.h;h=4e3ea55e290a19c766017b59241615f7723531d5;hb=HEAD#l83

文件 arch/arm/include/asm/global_data.h(第 ~83 行)。

#define DECLARE_GLOBAL_DATA_PTR register volatile gd_t *gd asm ("r8")