C 线程局部变量和内联程序集
我试图在内联汇编中使用线程局部变量,但当我看到离散汇编代码时,编译器似乎没有生成正确的代码。对于以下内联代码,其中保存的\u sp全局声明为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线程长保存的\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变量。编译器肯定能正确地完成它,而汇编程序似乎做得不好。