「NOP」の版間の差分

867 バイト追加 、 4 か月前
*後で命令を追加する予定の場所にダミーとして置く
**たとえば[[遅延スロット]]にとりあえず置く、あるいは置ける命令がない時に置く
**[[VLIW]]などのようなアーキテクチャでは、より積極的にNOPが必要である
*NOPスレッドによる命令ポインタの制御
*[[マイクロコントローラ|ワンチップマイコン]]の[[PROM]]では、0x00か0xffのどちらか「上書き可能なほう」で潰すと NOP になるようにしておくと、再利用に便利
 
などの用途で使用される。
 
規則的に命令を決めた結果、何の意味も持たない命令(同一レジスタでの移動、次の番地へのジャンプ)が出来たのでそれをNOPとすることもあれば([[TMS9900]]など。また、[[x86]]の場合 <code>XCHG AX, AX</code> である。ただし内部的な「AXレジスタを操作する」という意味は近年の高性能化プロセッサではそのまま解釈すると並列化の邪魔になるので、AXの参照を伴わないよう特別に解釈される)、専用の命令([[オペコード]])をとして用意されることもある。
 
=== 歴史 ===
1950年代の[[EDSAC]]において既に NOP に相当する命令はあっ設計者らには認識されていた(コード 'X' であるが、何もしないという命令は命令でないと考えたためか命令一覧では省かれていることがあり、[[文字コード]]一覧に命令も添えてある表のほうで確認できる(EDSACでは[[文字コード]]と[[オペコード]]を一致させていた))。
 
[[TMS9900]]は規則的なパターンのためにできた無意味となる場合をNOPとした例である。
 
[[x86]]では、命令の並びからは <code>XCHG AX, AX</code> に当たる部分がNOPであり、8086に始まる16ビット時代には内部的にはそのまま動作していたものもあったと思われる。しかし80386以降の後に[[IA-32]]と呼ばれるような高性能プロセッサになってくると、「AXレジスタを操作する」という意味には並列化の邪魔になるなど弊害が現れるため、AXの参照を伴わない真にNOPであるという解釈が明確化された。さらに[[x64|AMD64]]では、32ビットと64ビットの調整のために作られた「暗黙のゼロ拡張」という仕様により、64ビットレジスタRAXに対し、32ビット操作で <code>XCHG EAX, EAX</code> に相当する動作をした場合は、64ビットのうち上位32ビットがリセットされなければならないため、特別扱いであるNOPだと再定義された。
1950年代の[[EDSAC]]において既に NOP に相当する命令はあった(コード 'X' であるが、何もしないという命令は命令でないと考えたためか命令一覧では省かれていることがあり、[[文字コード]]一覧に命令も添えてある表のほうで確認できる(EDSACでは[[文字コード]]と[[オペコード]]を一致させていた))。
 
== 高水準言語 ==