c - 线程局部变量和内联汇编

标签 c gcc x86-64 inline-assembly

我试图在内联汇编中使用线程局部变量,但是当我看到反汇编代码时,编译器似乎没有生成正确的代码。对于以下内联代码,其中 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/

相关文章:

64-bit - 为什么 x64 操作系统可以运行为 x86 机器编译的代码

C 程序 - Uni 处理器系统上的输出?

c - 如何理解d_hash()的函数?

c - OSX/Clang 版本的 __progname 获取可执行文件的绝对路径?

c - 浮点值具有额外的精度值

assembly - 进入新功能时rsp不移动

c++ - C++ : why does free not accept a const void*, 中的 malloc/free 有更好的方法吗?

c - 链接中 undefined reference 错误

c - 如何使用 CLION 在 Windows 中复制 Linux C 环境?

assembly - 如何在保持一个值不变的情况下翻转 SSE 中的范围?