我记得曾经看到一种使用扩展gcc内联汇编读取寄存器值并将其存储到C变量中的方法。
尽管我一生都无法记住如何形成asm语句。
最佳答案
编者注:这种使用本地register-asm变量的方式是now documented by GCC as "not supported" 。它通常仍然可以在GCC上正常运行,但会因c声而中断。 (我认为,在发布此答案后,文档中的措词已添加。)
全局固定寄存器变量版本对于32位x86(只有7个GP整数寄存器(不计算堆栈指针))具有较高的性能成本。这样会将其减少到6。仅当您拥有所有代码都大量使用的全局变量时,才考虑这样做。
到目前为止,我的答案与其他答案不同,因为我不确定您想要什么。
GCC Manual § 5.40 Variables in Specified Registers
GCC Manual § 3.18 Options for Code Generation Conventions
这样可以更简单地复制Richard的答案,
int main() {
register int i asm("ebx");
return i + 1;
}
尽管这毫无意义,因为您不知道ebx
寄存器中的内容。如果您将两者结合在一起,请使用
gcc -ffixed-ebx
进行编译,#include <stdio.h>
register int counter asm("ebx");
void check(int n) {
if (!(n % 2 && n % 3 && n % 5)) counter++;
}
int main() {
int i;
counter = 0;
for (i = 1; i <= 100; i++) check(i);
printf("%d Hamming numbers between 1 and 100\n", counter);
return 0;
}
您可以确保始终使用C变量驻留在寄存器中以进行快速访问,并且不会被其他生成的代码所破坏。 (很方便,在通常的x86调用约定下,ebx
是被调用者保存的,因此,即使它被未使用-ffixed-*
编译的其他函数的调用所破坏,也应将其还原。)另一方面,由于您限制了编译器的自由度,因此这绝对不是可移植的,通常也不是性能上的好处。
关于c - 将寄存器值读入C变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2114163/