在汇编程序OS独立的原子比较和交换

Ful*_*Int 2 c linux windows assembly atomic

我正在编写独立于操作系统的无锁队列,队列工作正常(使用默认的windows\linux原子CAS),但我想让队列工作,而不需要在linux和windows中进行任何更改.所以我猜我应该在汇编程序中编写自己的CAS,还是有其他方法可以实现?

到目前为止,我有这个代码:

global _CAS

_CAS:

    mov eax, [esp+4]    
    mov edx, [esp+8]    
    mov ecx, [esp+12]   

    ;XCHG eax, edx  <- this function works fine
     CMPXCHG  ecx, eax, ebx 

    ret
Run Code Online (Sandbox Code Playgroud)

我知道我lock之前仍然需要添加CMPXCHG,它应该与结构一起使用,但是现在我对使它工作更感兴趣.

我用这个命令使用nasm-2.10.05进行编译nasm.exe -f elf -o cas.o cas.asm ,我得到了这个错误testas\cas.asm:14: error: invalid combination of opcode and operands

Die*_*Epp 12

你可以在两个平台上使用内在函数来完成它,不需要汇编:

#ifdef _MSC_VER
# include <intrin.h>
# define CAS(ptr, oldval, newval) \
    _InterlockedCompareExchange(ptr, newval, oldval)
#elif __GNUC__
# if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 1)
#  error "requires GCC 4.1 or greater"
# endif
# define CAS(ptr, oldval, newval) \
    __sync_val_compare_and_swap(ptr, oldval, newval)
#else
# error "CAS not supported on this platform"
#endif
Run Code Online (Sandbox Code Playgroud)

这两个都支持以下接口:

/* If the current value of *ptr is oldval, then write newval
   into *ptr.  Returns the initial value of *ptr.  */
long CAS(long *ptr, long oldval, long newval);
Run Code Online (Sandbox Code Playgroud)

请参阅MSDN文档,GCC文档.这也应该对Clang起作用而不做任何修改,因为Clang宣传__GNUC__了与其预定义宏的兼容性.


Ola*_*che 5

根据http://web.itu.edu.tr/kesgin/mul06/intel/instr/cmpxchg.htmlcmpxchg需要两个而不是三个参数。

也许,http://git.kernel.org/?p = linux/ kernel/git/torvalds/linux.git;a = blob; f = arch/ x86/include/asm/cmpxchg.h 也很有趣。