我試圖在裝配程序中擁有線程安全的局部變量。 我在網上搜索過,但我還沒有找到任何簡單的東西。裝配 - 線程安全局部變量
我目前使用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