汇编-线程安全局部变量
|
我正在尝试在汇编程序中使用线程安全的局部变量。
我已经在网上搜索过,但没有发现任何简单的东西。
我目前正在使用GCC汇编程序,因为该程序是C代码和汇编的混合,但是最终程序将包含用于多平台/调用约定的代码。
现在,我已经使用
.lcomm
伪操作声明了变量。
据我了解,这些变量将放在“ 1”部分。
所以我想它们将被所有线程共享。
是否可以直接在汇编中使用某种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
,因为我正在使用系统V ABI对其进行测试。
汇编代码非常简单,我想保持这种方式,因此可以轻松维护。
问题是:如何使stack0
和stack1
变量安全。
没有找到相关结果
已邀请:
5 个回复
攫怂绵十
是这样的吗? 如果是这样,跳到间接过程而不是调用它会不会更容易?然后,您不需要任何其他变量来保存调用者标志/返回,并且间接过程将直接返回给调用者。 只是一个建议-自从我做汇编程序以来。 如果必须将调用方地址存储在某个位置,请先确定SP,然后输入(输入?)并使用堆栈帧。在某些时候,其他任何事情都可能是线程不安全的。 Rgds, 马丁 好吧,使用TLS可能不是线程不安全的,但是任何递归调用呢?您最终在TLS中拥有另一个堆栈来覆盖此内容,因此您也可以使用\'SP \'堆栈 马丁
系漏
如您所见,它使用由CRT初始化的特殊变量。 在最新的Linux上,GCC可以使用TLS特定的重定位:
如果您希望具有可移植性,那么最好不要依赖于此类特定于操作系统的详细信息,而应使用诸如pthread之类的通用API或使用Martin提出的基于堆栈的方法。但是我想,如果您想要可移植性,就不要使用汇编程序:)
僻朵庙惩竣
坝镰补翔奋
徐百晴墓斜
(或与之等效的其他OS)(进行调用)执行类似的操作。返回的索引可以一次存储在全局集中,只读变量易于使用。 根据var持有的内容以及使用它们的代码的作用,您也许可以摆脱原子操作的束缚,但这可能会产生其自身的问题。