我试图在装配程序中拥有线程安全的局部变量。 我在网上搜索过,但我还没有找到任何简单的东西。装配 - 线程安全局部变量
我目前使用GCC汇编程序,因为程序是C代码和程序集的混合,但最终程序将包含多平台/调用约定的代码。
现在,我已经使用.lcomm
伪操作声明了我的变量。 据我了解,这些变量将被放置在.bss
部分。 所以我想他们将被所有线程共享。
有没有办法在程序集中直接生成一种TLS变量,还是应该使用平台特定的实现,例如Windows上的pthread
或__declspec
?
希望它很清楚。不要犹豫,询问是否需要更多信息。
感谢大家,
编辑
这里是有问题的代码:
.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
,如我测试这与System V ABI。
汇编代码非常简单,我想保留它,所以它可以很容易地维护。
现在的问题是:如何使stack0
和stack1
变量线程安全。
为什么在编写汇编程序时,担心平台特定的问题? – 2011-05-24 13:29:48
因为拥有一种“跨平台”的方式会更容易,而且更易于维护。 – Macmade 2011-05-24 13:41:32
请参阅编辑... – Macmade 2011-05-24 13:46:40