线程局部变量和内联汇编

时间:2012-01-10 21:54:41

标签: c gcc x86-64 inline-assembly

我试图在内联汇编中使用线程局部变量,但是当我看到反汇编代码时,似乎编译器没有生成正确的代码。对于以下内联代码, saved_sp 全局声明为__thread long saved_sp

__asm__ __volatile__ (
        "movq %rsp, saved_sp\n\t");

反汇编如下所示。

mov    %rsp,0x612008

这显然不是正确的,因为我知道gcc使用 fs 段来表示线程局部变量。它应该产生类似

的东西
mov %rsp, fs:somevalue

它不是。为什么会这样?在内联汇编中使用线程局部变量是否有问题?

1 个答案:

答案 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))