我试图在内联汇编中使用线程局部变量,但是当我看到反汇编代码时,编译器似乎没有生成正确的代码。对于以下内联代码,其中 saved_sp globally 声明为 __thread long saved_sp
,
__asm__ __volatile__ (
"movq %rsp, saved_sp\n\t");
反汇编如下所示。
mov %rsp,0x612008
这显然是不对的,因为我知道 gcc 使用 fs 段作为线程局部变量。它应该产生类似
的东西mov %rsp, fs:somevalue
事实并非如此。为什么呢?在内联汇编中使用线程局部变量有问题吗?
最佳答案
一个肯定可行的简单方法是获取一个指向线程局部变量的指针,然后写入它。
您的编译器肯定会正确执行 long *saved_fp_p = &saved_fp
,而内联汇编只会处理 saved_fp_p
,这是一个局部变量。
也可以使用gcc的输入输出语法:
__asm__ __volatile__ (
"mov %%rsp, 0(%0)" : : "r" (&saved_sp)
);
这让编译器负责解析 saved_fp 的地址,汇编代码将其放入寄存器。
我们发现这也行,
__asm__ __volatile__ asm ("mov %rsp,%0" : "=m" (saved_sp))
关于c - 线程局部变量和内联汇编,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8811069/