ハードウエアに 8087、80287 等の数値演算コプロセッサを装着している場合は、浮動小数点数やパック BCD 数に対する演算命令など、数値演算コプロセッサ専用の命令が使用できます。
数値演算コプロセッサのレジスタ構成
データレジスタ(80 ビット×8 本)
コプロセッサは、10 バイトのデータレジスタを 8 本持っており、これらは「ST(0)」「ST(1)」...「ST(7)」のように呼びます。ST(0) はスタックトップともいい、単に「ST」と記すことがあります。
数値演算コプロセッサのデータレジスタは、8086 のレジスタと違って、スタック構造を取っています。メモリ値のロードとストアは、すべて ST レジスタ(スタックトップ)に対して行われます。
ST に対してロード、ストアなどを行うとき、同時にレジスタのプッシュ、ポップ動作を行うことができます。プッシュ、ポップの各動作においては、レジスタの値が次のように移動します。
データレジスタのほかにも、数値演算コプロセッサは以下のような制御レジスタを持っています。
コントロールワード(16 ビット)
整数への丸め方や無限大の扱い方などを指定します。
ステータスワード(16 ビット)
中央プロセッサにおけるフラグレジスタのような機能を持っています。よく使用するフラグビットを示します。
これらのフラグを検査する場合は、ステータスワードをメモリや中央プロセッサのレジスタに転送してから検査します。
タグワード(16 ビット)
各データレジスタの状態(空/有効値/ゼロ/無限大等)を表します。タグワードによって「空」とされているレジスタをポップしたり、「空」でないレジスタにプッシュしたりすると不法操作例外処理が発生します。
エラーポインタレジスタ(16 ビット×4 本)
コプロセッサが最後に実行した命令と対象データを記憶しています。エラーが発生した場合、その場所を知らせるために存在します。
データ形式
コプロセッサは、4 バイト型と 8 バイト型の IEEE 形式の実数、2 バイト型と 4 バイト型の符号付き整数、10 バイト型のパック BCD 数を直接オペランドに指定することが可能です。これらの数値はロード時に 10 バイト型 IEEE 形式の実数に変換され、プロセッサ内部の計算はすべて 10 バイト型 IEEE 形式で行われます。
中央プロセッサ(CPU)との同期
コプロセッサは中央プロセッサ(CPU)と同時に作動しますが、独自のレジスタを持ち、中央プロセッサとは独立しています。中央プロセッサとの同期を必要とするところでは、WAIT 命令(別名 FWAIT 命令)を挿入する必要があります。この命令は、コプロセッサがここまでの命令の処理を終えるまで、中央プロセッサを待機させます。
80287 では中央プロセッサとの同期を自動的に行うため、WAIT 命令は必要ありません。
LASM では .286 文が指定されていない限り、コプロセッサ命令の前には自動的に WAIT 命令を挿入します。.286 文が指定されている場合は 80287 を使用するものと見なし、WAIT 命令は挿入しません。なお .286 文が指定されていない場合でも、特に「WAIT 命令を挿入しない」とされている FNINIT などの命令については、WAIT 命令の挿入は行いません。
コプロセッサを使用する命令の例
数値演算コプロセッサ命令の例をいくつか示します。数値演算コプロセッサの命令の綴りは必ず「F」で始まっています。
FLD ST(2) ; ST に ST(2) をプッシュ FLD DWORD PTR REAL4 ; ST に 4 バイト実数をプッシュ FLD QWORD PTR REAL8 ; ST に 8 バイト実数をプッシュ FILD WORD PTR INT2 ; ST に 2 バイト整数をプッシュ FILD DWORD PTR INT4 ; ST に 4 バイト整数をプッシュ FADD ; ST をポップし新 ST(旧 ST(1))に加算 FADD ST,ST(2) ; ST に ST(2) を加算 FADD ST(2),ST ; ST(2) に ST を加算 FADDP ST(2),ST ; ST(2) に ST を加算し ST をポップ FADD DWORD PTR REAL4 ; ST に 4 バイト実数を加算 FIADD WORD PTR INT2 ; ST に 2 バイト整数を加算