Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 线程局部变量和内联程序集_C_Gcc_X86 64_Inline Assembly - Fatal编程技术网

C 线程局部变量和内联程序集

C 线程局部变量和内联程序集,c,gcc,x86-64,inline-assembly,C,Gcc,X86 64,Inline Assembly,我试图在内联汇编中使用线程局部变量,但当我看到离散汇编代码时,编译器似乎没有生成正确的代码。对于以下内联代码,其中保存的\u sp全局声明为\u线程长保存的\u sp __asm__ __volatile__ ( "movq %rsp, saved_sp\n\t"); 分解过程如下所示 mov %rsp,0x612008 这显然是不对的,因为我知道gcc使用fs段作为线程局部变量。它应该会产生类似的结果 mov %rsp, fs:somevalue 事实并非如此。为什

我试图在内联汇编中使用线程局部变量,但当我看到离散汇编代码时,编译器似乎没有生成正确的代码。对于以下内联代码,其中保存的\u sp全局声明为
\u线程长保存的\u sp

__asm__ __volatile__ (
        "movq %rsp, saved_sp\n\t");
分解过程如下所示

mov    %rsp,0x612008
这显然是不对的,因为我知道gcc使用fs段作为线程局部变量。它应该会产生类似的结果

mov %rsp, fs:somevalue

事实并非如此。为什么会这样?在内联程序集中使用线程局部变量有问题吗?

一件简单的事情肯定会奏效,那就是获取一个指向线程局部变量的指针,并将其写入。
您的编译器肯定会正确执行
long*saved\u fp\p=&saved\u fp
,而内联程序集只处理
saved\u fp\p
,这是一个局部变量

您还可以使用gcc的输入和输出语法:

__asm__ __volatile__ (
    "mov %%rsp, 0(%0)" : : "r" (&saved_sp)
);
这使编译器负责解析保存的_fp的地址,而汇编代码将其放入寄存器中

我们发现这也行

__asm__ __volatile__ asm ("mov %rsp,%0" : "=m" (saved_sp))

我认为gcc无论如何都不会修改您的内联汇编代码。很可能必须显式指定段覆盖前缀。尝试在“movq%rsp,saved_sp\n\t”之前插入
。.byte 0x64\n\t“
。这是一个很好的解决方案,但我更愿意直接写入saved_sp,而不是使用寄存器来指向它。也许
asm(“mov%rsp,%0:“m”(saved_fp))
会起作用。重要的部分是让编译器而不是汇编程序处理保存的_fp变量。编译器肯定能正确地完成它,而汇编程序似乎做得不好。