我试图在内联汇编中使用线程局部变量,但是当我看到反汇编代码时,似乎编译器没有生成正确的代码。对于以下内联代码, saved_sp 全局声明为__thread long saved_sp
,
__asm__ __volatile__ (
"movq %rsp, saved_sp\n\t");
反汇编如下所示。
mov %rsp,0x612008
这显然不是正确的,因为我知道gcc使用 fs 段来表示线程局部变量。它应该产生类似
的东西mov %rsp, fs:somevalue
它不是。为什么会这样?在内联汇编中使用线程局部变量是否有问题?
答案 0 :(得分:4)
一个肯定会工作的简单方法是获取一个指向线程局部变量的指针,然后写入它
您的编译器肯定会正确执行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))