1. ホーム
  2. c++

[解決済み] x86アセンブリの「ロック」命令の意味を教えてください。

2022-02-03 12:35:13

質問内容

Qtのソースにx86のアセンブリがあったのですが、これは何ですか?

q_atomic_increment:
    movl 4(%esp), %ecx
    lock 
    incl (%ecx)
    mov $0,%eax
    setne %al
    ret

    .align 4,0x90
    .type q_atomic_increment,@function
    .size   q_atomic_increment,.-q_atomic_increment

  1. ググってみてわかったのは lock 命令はCPUにバスをロックさせますが、CPUがバスを解放するタイミングがわかりません?

  2. 上記のコード全体についてですが、このコードがどのように Add ?

解決方法は?

  1. LOCK は命令そのものではなく、次の命令に適用される命令接頭辞です。その命令は、メモリに対して読み込み・変更・書き込みを行うものでなければなりません ( INC , XCHG , CMPXCHG など) --- この場合、それは incl (%ecx) という命令があります。 incl に保持されているアドレスにあるオングワードです。 ecx レジスタに登録します。

    は、その LOCK プレフィックスは、CPU が操作の間、該当するキャッシュラインの排他的な所有権を持つことを保証し、さらに特定の順序付け保証を提供します。これは、バスロックをアサートすることで実現できるかもしれませんが、CPU は可能な限りこれを回避します。バスがロックされた場合、それはロックされた命令の間だけです。

  2. このコードでは、スタックからインクリメントされる変数のアドレスを ecx レジスタに登録し、次に lock incl (%ecx) で、その変数をアトミックに 1 つインクリメントします。 eax レジスタ(関数の戻り値を格納)に、変数の新しい値が0なら0、そうでないなら1を格納します。この演算は インクリメント であり、加算ではありません(だからこの名前なのです)。