什么是ARM指令相当于英特尔的xchgl?

usr*_*usr 2 x86 assembly gcc arm

我发现LDREX并且STREX可能是使用的那些.但它们是两个指令(因此不提供原子性xchgl).我想原子交换的值是32位值.能LDREXSTREX在提供32位值的原子交换的方式使用,或者是他们其他的方式来实现它(只要它适用于armv7l或更高版本)?

通常,我使用gcc的原子内置函数或更新的(C++ 11等效)内置函数 来进行此类原子操作.但在这种情况下,我必须在C中使用内联汇编(将基于x86的futex实现移植到ARM体系结构).谢谢!

fuz*_*fuz 7

在ARM指令集中,没有原子交换指令.相反,你使用ldrexstrex代码如下:

@ exchange r0 and [r1]
ldrex r2,[r1]
strex r3, r0,[r1]
mov   r0,r2
Run Code Online (Sandbox Code Playgroud)

[r1]ldrex和之间修改时,strex或者由于某些其他原因无法保证交换是原子的,则返回1 r3并且不执行存储.如果序列是原子序列,则返回0.因此,通过在循环中执行此片段直到获得零,r3您最终可以达到原子交换操作.这实际上是gcc和clang如何实现相应的内在因素; 传递-S给编译器来观察它的作用.