测试和设置和测试&测试并在AS中为C设置LOCK实现

时间:2010-11-17 22:06:23

标签: c assembly x86 mutex

在ASMx86(x86架构)程序集中搜索一些测试和设置,测试和测试并设置LOCK实现,以便在我的C代码中使用。我不希望在C中实现,而是简单的汇编。

请指出一些有用的内容。

提前致谢!

2 个答案:

答案 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.