1. ホーム
  2. assembly

[解決済み] x86アセンブリの「rep; nop;」とはどういう意味ですか?pause "命令と同じですか?

2023-03-04 09:12:15

質問

  • どのような rep; nop は何を意味するのでしょうか?
  • と同じなのでしょうか? pause 命令と同じですか?
  • と同じなのでしょうか? rep nop (セミコロンなし) と同じですか?
  • 単純な nop 命令と何が違うのでしょうか?
  • AMD と Intel のプロセッサで動作が異なるのですか?
  • (ボーナス) これらの命令の公式ドキュメントはどこにありますか。

この質問の動機

のコメントでいくつかの議論をした後 別の質問 のコメントで議論した結果、私は rep; nop; はx86(またはx86-64)アセンブリで何を意味するのか分からないことに気づきました。そしてまた、私は Web 上で良い説明を見つけることができませんでした。

私が知っているのは rep を意味する接頭辞です。 次の命令を繰り返す cx 回" (という命令(少なくとも、昔の16ビットx86アセンブリではそうでした)があります。これによると によると、ウィキペディアの要約表 によると、どうやら repmovs , stos , cmps , lods , scas (といった具合です(ただし、新しいプロセッサーではこの制限はなくなったのかもしれません)。従って、私なら rep nop (セミコロンなし) を繰り返すことになります。 nop 操作 cx 回です。

しかし、さらに検索してみると、さらに混乱しました。それは、どうやら rep; noppause は全く同じオペコードにマッピングされます であり、かつ pause とは少し違う動作をします。 nop . いくつかの 2005年からの古いメール は異なることを述べています。

  • 電力をあまり消費しないようにする。
  • "2バイトのエンコードだけで'nop'と同等です。
  • intel ではマジックです。そのため、'nop but let the other HT sibling run' " のようになります。
  • intel では pause、Athlon では fast padding です。

このように様々な意見があり、正しい意味を理解することができませんでした。

Linuxカーネルで使われている(両方の i386 x86_64 ) と共に、このコメント /* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */ また が使われているのは、BeRTOSの にも同じコメントがついています。

どのように解決するのですか?

rep; nop は確かに pause 命令 (オペコード F390 ). をサポートしないアセンブラに使用されるかもしれません。 pause 命令をまだサポートしていないアセンブラに使用されるかもしれません。以前のプロセッサでは、これは単に何もせず、ちょうど nop と同じように何もしませんが、2 バイトになります。ハイパースレッディングをサポートする新しいプロセッサでは、これはプロセッサにスピンループを実行していることを示すヒントとして使用され、パフォーマンスを向上させます。以下から インテルの命令リファレンス :

<ブロッククオート

スピン待ちループのパフォーマンスを向上させます。Pentium 4 または Intel Xeon プロセッサは、「スピン ウェイト ループ」を実行すると、メモリ順序違反の可能性を検出するため、ループを終了するときに深刻なパフォーマンス低下に見舞われます。PAUSE 命令は、コードシーケンスがスピンウェイトループであることをプロセッサに伝えるヒントを提供します。プロセッサはこのヒントを使用して、ほとんどの状況でメモリ順序違反を回避し、プロセッサのパフォーマンスを大幅に向上させます。このため、すべてのスピンウェイトループに PAUSE 命令を配置することが推奨されます。