コンピュータサイエンスにおいて、NOP、no-op、またはNOOP (「ノー・オプ」と発音し、no operationの略) は、何も実行しないマシン言語命令とそのアセンブリ言語ニーモニック、プログラミング言語ステートメント、またはコンピュータプロトコルコマンドです。
機械語命令
一部のコンピュータ命令セットには、プログラマがアクセス可能なレジスタ、ステータス フラグ、またはメモリの状態を変更しないことを明示的な目的とする命令が含まれています。多くの場合、実行には明確に定義されたクロック サイクル数が必要です。他の命令セットでは明示的な NOP 命令はありませんが、アセンブリ言語ニーモニック NOP は NOP として機能する命令を表します。たとえば、SPARC
では、sethi 0, %g0
NOP はメモリにアクセスしてはなりません。メモリ フォールトまたはページ フォールトが発生する可能性があります。
NOP は、タイミングの目的、メモリ アラインメントの強制、ハザードの防止、分岐遅延スロットの占有、ジャンプなどの既存の命令の無効化、実行命令のターゲット、またはプログラム開発の後の段階でアクティブな命令に置き換えられるプレースホルダ (または、再編成が問題になるか時間がかかる場合に削除された命令を置き換える) として最も一般的に使用されます。場合によっては、NOP に軽微な副作用があることがあります。たとえば、モトローラ 68000シリーズのプロセッサでは、NOP オペコードによってパイプラインが同期されます。[1]
以下に、いくつかの CPU アーキテクチャの NOP 命令を示します。
ハードウェア設計の観点から見ると、バスのマップされていない領域はゼロを返すように設計されていることがよくあります。NOPスライドの動作が望ましい場合が多いため、すべてゼロのオペコードでコーディングすることが推奨されます。
コード
関数またはプログラミング言語ステートメントのシーケンスは、効果がない場合、NOP または null ステートメントです。特定のコンテキストでは、一部の言語の 構文によって null ステートメントが必要になる場合があります。
エイダ
Adaでは、null文はNOPとして機能します。[9]構文では制御文や関数が空になることが禁止されているため、null文は必要なアクションがないことを示すために使用する必要があります。(したがって、プログラマが一連の文を記述し忘れると、プログラムはコンパイルに失敗します。)
C とその派生語
C で最も単純な NOP ステートメントはnull ステートメントです。これは、ステートメントを必要とするコンテキスト内の単なるセミコロンです。
ほとんどの C コンパイラは、歴史的およびパフォーマンス上の理由により、 nullステートメントを無視することに注意してください。
;
空のブロック (複合ステートメント) も NOP であり、読みやすくなるかもしれませんが、コンパイラによって無視されます。
{}
関数本体などの一部のケースでは、ブロックを使用する必要がありますが、これは空でもかまいません。C では、ステートメントを空にすることはできません。単純なステートメントは;(セミコロン) で終了する必要がありますが、複合ステートメントは (中括弧) で囲まれており{}、それ自体にはセミコロンは必要ありません。したがって、文法的にステートメントが必要なコンテキストでは、このようなヌル ステートメントを使用できます。
null ステートメントはそれ自体では役に立ちませんが、ループのコンテキスト内など、より広いコンテキストでは構文的に使用できます。
while ( getchar () != '\n' ) {}
あるいは、
getchar () != '\n 'である間;
あるいはもっと簡潔に言うと:
getchar () != '\n 'である間;
(最後の形式は混乱を招く可能性があり、一部のコンパイラまたはコンパイラ オプションでは警告が生成されます。セミコロンは通常、行末の括弧の後に置かれると関数呼び出し命令の終了を示します)。
getchar()上記のコードは、(改行) 文字を返すまで関数を呼び出し続け\n、基本的に標準入力の現在の読み取り位置を次の行の先頭に早送りします。
フォートラン
Fortranでは、CONTINUEステートメントは DO ループの最後のステートメントなどの一部のコンテキストで使用されますが、どこでも使用でき、機能はありません。
JavaScript
JavaScript言語には NOP ステートメントが組み込まれていません。さまざまな実装が可能です。
- C言語およびその派生言語の例と同じように、
;空のステートメント[10]または{}空のブロックステートメントを使用します。 - 前の方法が構文で許可されていない場合は、
undefinedまたはnull式を完全なステートメント (式ステートメント) として使用します。
機能が必要な場合の代替手段は次のとおりです。
Function.prototype()任意の引数を受け入れて返す組み込み関数を使用するundefined。[11]- サードパーティのライブラリで利用可能な NOP 関数を使用します (以下を参照)。
- 次の例のように、カスタム NOP 関数を定義します ( ES6矢印関数構文を使用)。
定数noop = () => {};
アンギュラー
AngularJSフレームワークは、何も操作を実行しない angular.noop 関数を提供します。
jQuery
jQueryライブラリはjQuery.noop()何もしない関数を提供します。 [12]
ロダシュ
Lodashライブラリは関数を提供しており_.noop()、これはundefinedを返して何もしない。[13]
パスカル
C と同様に、 Pascalでは ; を単独で使用するとヌル ステートメントとして使用できます。実際、言語の仕様により、 BEGIN / END ブロックでは END ステートメントの前のセミコロンはオプションであるため、そこで使用されるセミコロンは不要です。
また、 で構成されるブロックは、 BEGIN END;別の BEGIN / END ブロック内に配置された場合でも、アクションがないことを示すプレースホルダーとして使用できます。
パイソン
Pythonプログラミング言語には、実行時に効果がなく、NOP として機能するステートメントがあります。これは主に、Python のインデントに敏感な構文により正しい構文を確保するために使用されますpass。たとえば、クラス定義の構文では、クラス ロジックを含むインデントされたブロックが必要ですが、空であるべきときに として表現する必要がありますpass。
シェルスクリプト (bash、zsh など)
' :' [コロン] コマンドは、"NOP" (何もしない操作) と同様の効果を持つシェル組み込みコマンドです。これは、特殊パラメータ $? (最後のコマンドの終了ステータス) を 0 に変更するため、技術的には NOP ではありません。これは、シェル組み込みコマンド 'true' の同義語と見なすことができ、その終了ステータスは true (0) です。[14] [15] [16]
TeX マクロ言語 (ConTeXt、LaTeX など)
TeX印刷システムのマクロ言語にはコマンドがあります。[17]それ自体は何もしませんが、直前のコマンドが後続のトークンを解析するのを防ぐために使用できます。[ 18]\relax
NOPプロトコルコマンド
Telnetなどの多くのコンピュータ プロトコルには、クライアントが他のアクションを要求せずにサーバーからの応答を要求するために発行できる NOP コマンドが含まれています。このようなコマンドを使用すると、接続がまだ有効であることや、サーバーが応答していることを確認できます。NOOP コマンドは、次のプロトコルの一部です (これは部分的なリストです)。
リストされている他のプロトコルとは異なり、IMAP4 NOOP コマンドには特定の目的があり、サーバーが保留中の通知をクライアントに送信できるようにすることに注意してください。
ほとんどのtelnetやFTPサーバはNOOPコマンドに対して「OK」または「+OK」で応答しますが、一部のプログラマはクライアントに奇妙な応答を追加しています。たとえば、MINIXftpdのデーモンはNOOPに対して次のメッセージで応答します: [19]
あなたにも200NOOPをプレゼント !
クラッキング
NOP は、シリアル番号、特定のハードウェアまたはソフトウェアの要件、ハードウェアドングルの有無などをNOP スライドの形式でチェックするソフトウェアをクラッキングするときによく使用されます。このプロセスは、関数とサブルーチンを変更してセキュリティ チェックをバイパスし、代わりにチェックされている期待値を返すことによって実行されます。セキュリティ チェック ルーチンの命令のほとんどは使用されないため、これらは NOP に置き換えられ、バイナリで後続するすべての位置を変更することなく、ソフトウェアのセキュリティ機能を削除します。
セキュリティ上の脆弱性
NOP オペコードはNOP スライドを形成するために使用できます。これにより、命令ポインターの正確な値が不確定な場合 (たとえば、バッファー オーバーフローによってスタック上の関数の戻りアドレスが上書きされる場合) でもコードを実行できます。
参照
- コメント(コンピュータプログラミング) – コンパイラやインタープリタでは無視される、プログラマ向けの注釈。
- コンピュータアーキテクチャ
- フィラーテキスト
- Halt and Catch Fire – CPUも一時停止します
- HLT(x86命令) – CPUを一時停止する
- 恒等関数– NOPに相当する関数型プログラミング
- IEFBR14 – メインフレームのトートロジー
- xyzzy (コンピューティング) – NOP の代わりに使用されるコマンド
- X86命令リスト#P5/P6クラスのプロセッサで追加-
NOPL、公式の長いNOP
参考文献
- ^ ab 「Motorola 68000 プログラマーズリファレンスマニュアル」(PDF)。
- ^ abcd 「Intel 64 および IA-32 アーキテクチャ ソフトウェア開発者マニュアル: 命令セット リファレンス AZ」。2012 年 3 月 1 日閲覧。
- ^ AMD、Am29050 マイクロプロセッサ ユーザーズ マニュアル、1991 年、223 ページと 257 ページ。
- ^ 「4.8.4. NOP ARM疑似命令」。RealView Compilation Tools for BREW アセンブラ ガイド。
- ^ 「5.6.3. NOP Thumb 疑似命令」。RealViewコンパイル ツール for BREW アセンブラ ガイド。
- ^ ab Hewlett-Packard、PA-RISC 2.0 Architecture、1995年、2-21ページおよび7-103ページ。2020年6月21日にアーカイブ。
- ^ RISC-V Foundation、RISC-V命令セットマニュアル、第1巻:ユーザーレベルISA、バージョン2.2、2017年5月7日、p.79。
- ^ Weaver, DL; Germond, T. 編 (1994). SPARC アーキテクチャ マニュアル バージョン 9 (PDF) . Prentice Hall . ISBN 0-13-825001-4. 2012-01-18 にオリジナル(PDF)からアーカイブされました。2014-01-09に取得。
NOP は、imm22 = 0 および rd = 0 の SETHI 命令の特殊なケースであることに注意してください。
- ^ Ada リファレンス マニュアル — null ステートメント。「null_statement を実行しても効果はありません。」
- ^ MDN JavaScript リファレンス – 空のステートメント。「空のステートメントはセミコロン (
;) であり、JavaScript 構文で必要な場合でもステートメントが実行されないことを示します。」 - ^ ECMAScript 言語仕様 – エディション 5.1 – 関数プロトタイプ オブジェクトのプロパティ
- ^ jQuery API ドキュメントの jQuery.noop()
- ^ 「Lodash ドキュメント」。lodash.com。2017年 12 月 15 日閲覧。
- ^ 上級 Bash スクリプトガイド > 第 3 章 特殊文字
- ^ bash マニュアルページ > シェル組み込みコマンド
- ^ zsh マニュアルページ (zshbuiltins) > シェル組み込みコマンド
- ^ Bausum, David (2002). 「TeX Primitive Control Sequences」。TeX リファレンス マニュアル。Kluwer Academic Publishers。2020年4 月 1 日閲覧。The
TeXbook によると、 に遭遇しても「TeX は何も行いません」
。実際には、
は TeX に「これでこれまでの作業は終わりです」と伝える可能性があります。
\relax\relax - ^ TeX ウィキブック – リラックス
- ^ "ftpd.c" . 2016年6月19日閲覧。
