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 Studio C下编译++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 ;
_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,所以一切都更好:-)