Visual c++ 在visualc+中是否存在X64固有的8位原子CAS(cmpxchg)+;? 32位VisualStudioC++中的以下代码是可能的。在VisualStudioC++ + 64版中不支持内嵌ASM,是否使用内嵌的64位等效? FORCEINLINE bool bAtomicCAS8(volatile UINT8 *dest, UINT8 oldval, UINT8 newval) { bool result=false; __asm { mov al,oldval mov edx,dest mov cl,newval lock cmpxchg byte ptr [edx],cl setz result } return(result); }

Visual c++ 在visualc+中是否存在X64固有的8位原子CAS(cmpxchg)+;? 32位VisualStudioC++中的以下代码是可能的。在VisualStudioC++ + 64版中不支持内嵌ASM,是否使用内嵌的64位等效? FORCEINLINE bool bAtomicCAS8(volatile UINT8 *dest, UINT8 oldval, UINT8 newval) { bool result=false; __asm { mov al,oldval mov edx,dest mov cl,newval lock cmpxchg byte ptr [edx],cl setz result } return(result); },visual-c++,64-bit,x86-64,inline-assembly,Visual C++,64 Bit,X86 64,Inline Assembly,以下指令在Visual Studio C下编译++ _InterlockedCompareExchange16 _InterlockedCompareExchange _InterlockedCompareExchange64 _InterlockedCompareExchange128 我要找的是一些类似于 _InterlockedCompareExchange8 但那似乎不存在。不,那不存在。如果需要的话,您可以实现它 原子_msvc_x64.asm _text SEGMENT ;

以下指令在Visual Studio C下编译++

_InterlockedCompareExchange16
_InterlockedCompareExchange
_InterlockedCompareExchange64
_InterlockedCompareExchange128
我要找的是一些类似于

_InterlockedCompareExchange8

但那似乎不存在。

不,那不存在。如果需要的话,您可以实现它

原子_msvc_x64.asm

_text   SEGMENT

; char _InterlockedCompareExchange8(volatile char*, char NewValue, char Expected) 
;      - RCX, RDX, R8

_InterlockedCompareExchange8  PROC

    mov    eax,r8d
    lock cmpxchg [rcx],dl
    ret

_InterlockedCompareExchange8  ENDP

_text  ENDS

       END

已验证Visual Studio 2012是否存在此内在特性:

char _InterlockedCompareExchange8(volatile char*, char NewValue, char Expected)

但是,它在文档中没有出现。

64位asm函数的返回变量是什么寄存器?返回值是AL、AX、EAX、RAX,具体取决于大小。这里它是由cmpxchg指令放在那里的。至少从VisualStudio2012开始,这不再是必需的,尽管没有文档记录。看我的答案。当时我正在使用2010,它没有这个内在的。我现在使用的是2012,所以一切都更好:-)