是否可以为C代码的特定部分保留寄存器?
-ffixed-reg选项或声明全局寄存器变量并不是我要寻找的答案。我想要在特定作用域内(比如特定函数)保留寄存器的值。
使用本地寄存器变量是不可能的,因为它不能保证在整个作用域内保持寄存器的值。
我正在寻找类似于asm volatile中的clobber列表,但用于C语句。
是否可以为C代码的特定部分保留寄存器?
-ffixed-reg选项或声明全局寄存器变量并不是我要寻找的答案。我想要在特定作用域内(比如特定函数)保留寄存器的值。
使用本地寄存器变量是不可能的,因为它不能保证在整个作用域内保持寄存器的值。
我正在寻找类似于asm volatile中的clobber列表,但用于C语句。
register int *foo asm ("r4");
。#define RESERVE_REG(reg) register int RR_##reg asm (#reg) \
__attribute__((unused))
int bar(int a) {
RESERVE_REG(R4);
int b;
b += CRAZY_ASM(a);
return b;
}
void foo(void) {
RESERVE_REG(R4);
CRAZY_ASM_SET_R4(82);
printf("value is %d\n", bar(1));
}
asm
clobber)可以实现某些变量寿命和用途的相同效果。在大多数情况下,人们只会声明一个参数。也就是说,最好让编译器知道你正在使用它,因为它可以根据需要进行明智的决策。R0-R3
,因为这将限制可以在例程之间传递的参数。ARM ABI在R0-R3
中传递参数。鉴于您可以灵活选择寄存器,请选择R4-R9
(甚至可能R9
不可用),因为这些是没有任何特殊用途的'callee'保存寄存器。此外,如果您选择R0-R3
,则可能无法调用标准'C'库例程,或者保留的寄存器将保存在堆栈上。
参考资料:GCC本地寄存器变量
ARM寄存器调用约定
R9
;而99%的ARM代码都不使用。也就是说,在某些系统中,R9
可能是一个“保留寄存器”,通常是共享库的数据部分。请参见:ARM静态链接共享库。 - artless noise