ARM LDAXR/STLXR指令是什么意思?

逆向工程 艾达 拆卸 手臂
2021-07-01 08:19:03

通常在反汇编ARM文件时,我会看到一些具有以下模式的代码片段:

loc_BB30:
.text:C0 FE 5F 88 LDAXR           WZR, W0, [X22]
.text:00 04 00 51 SUB             W0, W0, #1
.text:C0 FE 01 88 STLXR           W1, W0, [X22]
.text:A1 FF FF 35 CBNZ            W1, loc_BB30

这被翻译成以下反编译代码:

  do
  {
    v2 = __ldaxr((unsigned int *)v1);
    v1 = (unsigned int)(v1 - 1);
  }
  while ( __stlxr(v1, v3) );

这段代码的含义是什么?什么样的 c 代码实际上会产生这种片段?

1个回答

当修改原子变量时,通常会看到这种排他访问指令的一般模式。

C++ 示例(C++11 或更高版本)

  #include <atomic>

  void release( std::atomic<int>& refcount ) {
      refcount--;
  }

您可以在 Godbolt 上看到 GCC 对上述内容的 ARM64 编译生成了您的汇编代码。

C 示例 (C11)

#include <stdatomic.h>

void release( _Atomic int* refcount ) {
    (*refcount)--;
}

Godbolt 版本在这里

C 示例(在 C11 之前,使用 GCC 内置函数)

void release( int* refcount ) {
    __atomic_sub_fetch( refcount, 1, __ATOMIC_ACQ_REL );
}

Godbolt 版本在这里