在ASMx86(x86架构)程序集中搜索一些测试和设置,测试和测试并设置LOCK实现,以便在我的C代码中使用。我不希望在C中实现,而是简单的汇编。
请指出一些有用的内容。
提前致谢!
答案 0 :(得分:3)
您可以在IA32 x86
下进行简单的test& set设置//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!!!
请记住,在循环中等待将冻结应用程序线程,因此它也很聪明,也可以阻止最长的等待循环时间。
答案 1 :(得分:1)
根据体系结构,您可以在单个指令中执行此操作,也可以通过禁用中断来执行此操作。
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.