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 コード (カーネル スピン ロックから取得したように見えますか?) は、1 を に追加し、元がゼロ*nかどうかをテストします。*n十分な数のスレッドが同時にこれを試行すると*n、ロックの取得が許可されていなくても、オーバーフローしてゼロになる可能性があります。

于 2013-07-18T22:15:54.560 に答える