の違いについて教えてくださいこれにはx86NOPとFNOP指示?
質問
私の読み込み インテル取扱説明書 いにありNOP"の指示があるもののメインCPU、'FNOP"の指示が何もしないのFPU.なぜが別途指示が何もしない?
にもなったような例ですと、時計のための例外からFNOPかどうかを検知がFPU可能です。ないその他のメカニズムのようにCPUID検出する。どの実践的な理由があって二つの別々のスポンスNOP指示?
解決
拡大レイモンド-Chen、ハンス-Passantのコメントがあり歴史的理由があって二つの別々の指導やかなものでも結果は同じです。
いの指示 NOP
や FNOP
, た設計としての明示的な操作。の NOP
指示がなければならないマシンで、そのエイリアスを指導 XCHG AX,AX
.(または32ビットモード XCHG EAX, EAX
.) 早期のIntelプロセッサか実際には何も行いません。が明らかにしてくれるものではないを外部に見える効果内部で実行したように XCHG
指導において、多くのサイクルを実行することを示しています。の486した最初のインテル®プロセッサーでは特に、これを実行し NOP
1サイクルでした3サイクルの実施その他の登録簿への登録 XCHG
ました。
治療 XCHG AX,AX
指導の特別な非常に重要な現代のIntelプロセッサです。また実際に交換し、同じ登録そのものを導入することが考えられパイプラインの屋台場近くの指導もの AX
登録できます。による治療でのCPUを終わらないとの NOP
ニーズをお待ち前の指示を設定する AX
または、以下の指示のニーズに NOP
.
このことがたくさんの異なる指示となっ XCHG AX,AX
中で唯一の単一のbyteとして特別な場合には、 交換-登録-with-アキュムレータシングルバイト XCHG
エンコーディング).しばしばこの説明は単一の指導に代わ連 NOP
指示が整列のループパフォーマンス上の理由のため.例えばたい場合には6バイトのレスポンスNOPを使用できる LEA EAX,[EAX + 00000000]
.インテルが追加された明示的に複数のバイトNOP。(でもなく、追加として正式に文書化され、指示されていたのか、Pentium Pro.) しかしながらシングルバイトの形態は特;複数のバイトNOPsを生成する屋台の場合は近隣の指示と同じ登録する
時AMD加え64ビットの支援をCpuかったです。 NOP
がなくなり、相当 XCHG EAX,EAX
64ビットモードになります。問題のひとつに"インテル®命令セットには多くの指示を変更するだけの一部登録できます。例えば、 MOV BX,AX
のみを変更す下位16ビットの EBX
の上位16ビットの更.これらの部分的変更を作ることが困難になる場合もあり、CPUを避ける屋台、AMD決めるのを防ぐため、使用時の32ビットの指示に64ビットモードになります。きの結果の32ビットの動作が格納される(64-bit)登録 この値はゼロ拡張64ビットのように全体の登録変更.この意味 XCHG EAX,EAX
なNOP、クリアの上位32ビットの EAX
(この場合は明示的に書き XCHG EAX,EAX
, ではできな組み立てて0x90としての利用 87 C0
エンコーディング)64-bitモード NOP
現在、明示的なノップしてあるかないかを問わない。
としての FNOP
指導の8087で完全に明らかにFPUてこれらの指示もんなんで取り扱いは明示的にとらないということのない操作です。少なくとも一つの古いインテル、マニュアルの ASM86語Rerefenceマニュアル なドキュメントって何かをするのはなんの影響"店舗のスタックトップのスタックトップ").からその位置にopcode地図のようになうエイリアスのいずれか FST ST
または FLD ST
, というコピーのトップのスタックトップのスタックです。しかしかったか特別な処理が実行され、平均13サイクルの代わりに平均18 20サイクル用スタックをスタック FST
または FLD
指導する。またテルのポリシーにしたがって、運転指導いに期待していることの表れであきもとして多数あり8087指示できる実行時間が半分に短縮されます。
この FNOP
命令の動作とは異なっ NOP
でのFPUの指示に使用で実現することでインテルプロセッサです。CPUもな支援の浮動小数点演算ではなくこれらの業務に従事への積み込んでオプションの浮動小数点コプロセッサーは、もともとの8087.の良いところはのコプロセッサで実行の指示並列のCPUを搭載しています。しかしこのことはCPU時々のニーズにFPUに仕上がりです。CPUの自動的に待ちで仕上がりを実行する前指示の前で別の指示が、コンピュータプログラムが明示的に待つのものを使用し WAIT
指示)できるようになる前に読み込むためには、コプロセッサが書いた。
なのでコプロセッサで働並行しまった場合FPU指導に発生する浮動小数点例外の検出にはこのCPUで動を実行する。通常は指示を例外のCPUでの取り扱いとな指導が行われているものがFPUの指導、例外が生成され、CPUがすでに完成し実行する指示によりお渡しでのFPU.の代わりに中断し、CPUおよびお届けの浮動小数点例外を非同期的には、CPUのみ通知の場でお待ちしておりますので、コプロセッサは、明示的又は黙示的に.
現代のプロセッサのFPUはなくなり、コプロセッサでの一部のCPUを搭載しています。このプログラムになっているのを待つのFPUへの書き値を記憶です。しかし、FPUの例外の扱いは変わりません。(ここで示されているデータの提供の例外ではありませんがを実行することが困難な現代のCpuう強みを活かした一例がなかったっています。) なので以前のFPUの指示を生み出届の浮動小数点例外は、 NOP
の例外が届かなかった原因は、 FNOP
, でのFPUの指導いてくは暗黙的に"待つ"この結果は浮動小数点例外れています。
こうしたことを考える
FLD1 ; push 1.0 onto the FPU stack
FLDZ ; push 0.0
FDIV ; divide 1.0 by 0.0
NOP ; does nothing
NOP ; does nothing
FNOP ; signals a FP zero-divide exception and then does nothing