一部のNOPコードは他とは異なる方法で処理されますか?


12

私はこれに興味があります、私が持っているとしましょう:

00000000001 90                              nop        
00000000002 90                              nop        
00000000003 90                              nop 

これとまったく同じように実行されますか?

00000000001 0F1F00                          nop        dword [ds:rax]

2番目の例は、最初の例に対してどのような効果がありますか?


1
2つ目の命令は3つではなく1つの命令であるため、2つ目の命令は1つ目の命令よりも高速に実行されます。
ローレンペクテル

1
なぜこのタグはcですか?
キーストンプソン

Google for multi byte nopでは、かなりの数の結果が見つかりました。
phant0m

1
@KeithThompson-Cおよびコーディングスタイルのタグを引き出しました。彼らは属していませんでした。

@ phant0m-そのコメントを回答に入れて、より関連性の高い結果のいくつかを要約しますか?私たち全員が、その検索クエリから何が返ってくるかを適切に理解する背景を持っているわけではありません。

回答:


2

マシンのアーキテクチャに依存します。古典的なKA-10(pdp-10)には多くのnopコードがありましたが、これはおそらく非常に規則的な命令セットの結果であり、すべてがマイクロコードではなく、離散コンポーネントによって実装されたという事実です。一部のNOPはメモリを参照し、一部はスキップしないスキップテストでしたが、スキップを引き起こす可能性のある条件をテストしました。「JFCL 0」は、マニュアルで最速のnopとして宣伝されました。


複数のNOPを単一のJMP命令に置き換えるオプションを提供していた(8085?)アセンブラーで作業しました。パフォーマンスのペナルティを支払うことなく、望んでいた整合性が得られました。PICに文字列がある場合に便利です。CPUベースのタイミングループがある場合はそれほど便利ではありません(これがデフォルトでオフになっている理由です)。
TMN

ほとんどの場合、通常はハードウェア依存性またはデバイスのエラッタ回避策の結果として、短い遅延を挿入するためにNOP命令が使用されます。パフォーマンスの低下は、NOPを使用する理由です。
uɐɪ

1
nopsには多くの難解な用途があります。一部のアーキテクチャには、ジャンプのバイトアラインメント要件があります。自己修正コード(ホラー!)はスプライスポイントとしてnopsを使用していました。バグシステムは、nopsを使用して、失敗したアサーションに関する情報を保存しました。
ddyer

@ddyer:一部のプロセッサには、メモリバイトをフェッチし、フェッチした値を完全に無視するか、プログラマが気にしないフラグを設定する以外は何もしない命令(ドキュメント化されている場合があります)があります。6502では、次の2バイトをゴブリングする手段として「BIT abs」命令を使用するのが一般的でした。フラグを更新しないことを除いて、同様に動作するドキュメント化されていないオペコードもいくつかあります。ただし、このようなトリックには注意が必要です。1バイトのアドレス空間が読み込まれます。一部の6502周辺機器は、読み取り操作に反応する場合があります。
-supercat

0

2番目の例は最初の例よりも速く実行する必要があるようです。最初の例では、3つの個別の命令が実行されます。2番目では、1つの命令のみです。マルチバイトNOPは、CPUの「ヒント」に使用することを目的としています(明らかに機密性の高い方法とタイミング)。これらは、アライメントの目的(キャッシュラインでタイトループを開始する)には役立ちますが、現在のところ他の用途はありません。CPUが実際に引数を評価するかどうかは不明であるため、命令のデコード時間を増やすか、メモリアクセスのペナルティが発生するかどうかを判断することはできません。優れたICEをお持ちの方は、これらのいずれかをテストして、バストレースに表示されるアドレスを確認したいでしょうか?


多くの6502アセンブラーは、メモリフェッチを実行する文書化されていないオペコード(たとえば、NOP $ 1FF9)にニーモニック「NOP」を使用しますが、アドレス0x1FF9を読み取り、読み取った値を無視する2バイトの命令です)、チップメーカーが特定のアドレス(0x1FF9など)の場合、アクション(コードバンク1への切り替えなど)をトリガーするハードウェアにプロセッサがフックされないという保証がないため、プログラムカウンター/命令ポインターを超える命令に対して「nop」という用語を使用します)がアクセスされ、そのようなトリガーは正確に「操作なし」ではありません。
-supercat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.