在搜索周圍一些測試&集和測試&測試上ASMx86(x86架構)&組LOCK實現大會在我的C碼使用。我不想用C語言實現,只是簡單的彙編。測試和設定,並試驗&試驗&在ASM設置LOCK實現對C
請指點我一些有用的。
提前致謝!
在搜索周圍一些測試&集和測試&測試上ASMx86(x86架構)&組LOCK實現大會在我的C碼使用。我不想用C語言實現,只是簡單的彙編。測試和設定,並試驗&試驗&在ASM設置LOCK實現對C
請指點我一些有用的。
提前致謝!
野兔您對自己在IA32 86一個簡單的實現測試&一套
//eax = pointer on 32 bit lock variable
//Variable must be 4 byte aligned
//edx = bit test and set number from 0..31
lock bts dword ptr [eax], edx
setnc al //al is 1 if bts instruction was successful
野兔你有一個簡單的實現迴路測試&設置
的//eax = pointer on 32 bit lock variable
//Variable must be 4 byte aligned
//edx = bit test and set number from 0..31
@wait:
pause //CPU hint for waiting in loop
lock bts dword ptr [eax], edx
jc @wait //waiting in loop!!!
還記得wai在循環中會凍結應用程序線程,所以它也很明智,也可以阻止最大等待循環時間。
+1,特別是使用「PAUSE」 – Necrolis 2010-11-22 13:58:33
根據體系結構,您可以在單個指令中執行此操作,也可以禁用中斷。
80386和更高版本的兼容體系結構有bts
指令,該指令將對進位標誌中的測試結果進行原子測試和設置。 Here是如何使用PPC指令來實現互斥體的一個很好的解釋。
其他要求是這樣的:
cli ;; Clear interrupts flag.
move r0, r1 ;; Copy the value into r0.
ori r1, 1 ;; Set the bit in r1 (r1 holds the value to test-and-set.)
sti ;; Re-enable interrupts.
感謝您的代碼和鏈接。但是沒有找到有用的彙編代碼用於兩者。包含鎖的兩個實現的彙編代碼的任何其他鏈接? – johnshaddad 2010-11-17 23:16:02
我不認爲這個答案是非常有用的。除非您正在編寫自己的操作系統,否則'cli'和'sti'不可用,即便如此,它們也不會幫助您在多個cpus/cores之間實現同步。你需要使用鎖前綴而不是復活80年代和90年代不斷的系統崩潰的原因...... – 2010-11-17 23:50:19
@R:我只有在編寫自己的操作系統時才需要實現這些類型的事情,核心嵌入式芯片。當使用現代處理器時,我使用具有諸如'HAL_TAS_SET'之類的現代操作系統。 – nmichaels 2010-11-18 00:07:24
什麼架構? – nmichaels 2010-11-17 22:08:55
x86架構 – johnshaddad 2010-11-17 22:09:55
測試並設置了究竟是什麼?位?原子值? – MSN 2010-11-17 22:13:04