我正在尝试在汇编程序中使用线程安全的局部变量。我在网上搜索过,但我没有找到任何简单的东西。
我目前正在使用 GCC 汇编器,因为该程序是 C 代码和汇编的混合体,但最终程序将包含多平台/调用约定的代码。
现在,我已经使用.lcomm
伪操作声明了我的变量。据我了解,这些变量将放在该.bss
部分中。所以我想它们将被所有线程共享。
有没有办法在程序集中直接使用一种 TLS 变量,或者我应该使用特定于平台的实现,比如在 Windows 上pthread
还是__declspec
在 Windows 上?
希望它足够清楚。不要犹豫,询问是否需要更多信息。
谢谢大家,
编辑
这是有问题的代码:
.lcomm stack0, 8
.lcomm stack1, 8
.globl _XSRuntime_CallMethod
_XSRuntime_CallMethod:
pushq %rbp
movq %rsp, %rbp
xor %rax, %rax
popq stack0( %rip )
popq stack1( %rip )
callq *%rdi
pushq stack1( %rip )
pushq stack0( %rip )
leave
ret
基本上,它用于将调用重定向到 C 函数。
C原型是:
extern uint64_t XSRuntime_CallMethod( void ( *m )( void * self, ... ), ... );
它需要一个函数指针作为第一个参数,因此是callq *%rdi
, 因为我正在使用系统 V ABI 进行测试。
汇编代码非常简单,我想保持这种方式,这样它就可以很容易地维护。
问题是:如何使stack0
和stack1
变量线程安全。