3

我有一个 x86 汇编代码:

unsigned int oldval;

__asm__ __volatile__ (
"movl   $1, %0  \n"
"lock xaddl %0, (%1)    \n"
: "=a" (oldval) :  "b" (n))l;

return oldval;

我想把它翻译成手臂组件。手臂组件中是否有任何前缀与此处的“锁定”功能相同?

4

2 回答 2

4

我不了解 ARM,但是从对手册的掩饰来看,以下内容应该近似于您的原子交换和添加:

foo:
    LDREX R1, [R0]         ;  R0 is "n", load linked
    ADD   R2, R1, 1        ;  R2 = R1 + 1
    STREX R3, R2, [R0]     ;  store conditionally, R3 = 0 if and only if success
    CBNZ  R3, foo          ;  on failure, try again

    ;; now return R1 to "oldval"

与 x86 不同,这段代码似乎需要任意长时间才能成功,但我不确定是否有任何保证最终会成功。

但是,请注意 ARM 方法更安全,因为条件存储会在它应该成功的时候准确地成功。相比之下,您的 x86 代码(看起来像是取自内核自旋锁?)只是*n加一并测试原始代码*n是否为零。如果有足够多的线程同时尝试此操作,则*n即使您未被允许获取锁,也可能会溢出并为零。

于 2013-07-18T22:15:54.560 回答
1

lock前缀仅对内存访问有用。由于ARM不能对内存进行算术运算,所以没有直接对应的操作。如果您使用的是足够高的 ARM 内核版本,则可以使用dmbdsbisb指令进行同步。否则,您将需要某种互斥锁。

于 2013-07-18T20:41:28.047 回答