我记得曾经看到一种使用扩展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/

10-11 22:39
查看更多