TL; DR;
「FS」/「GS」レジスタの目的は何ですか?
デフォルトのデータセグメント(DS)を超えてデータにアクセスするだけです。ESとまったく同じです。
長い読み:
だから私は次のレジスタとその使用法が何であることになっているのか知っています:
[...]
まあ、ほとんどですが、DSは「一部の」データセグメントではなく、デフォルトのセグメントです。すべての操作はデフォルトで行われました(* 1)。これは、すべてのデフォルト変数が配置されていた-本質的にdata
とbss
です。これは、x86コードがかなりコンパクトである理由の一部です。最も頻繁にアクセスされるすべての重要なデータ(およびコードとスタック)は、16ビットの短距離内にあります。
ESは、その他すべて(* 2)、DSの64 KiBを超えるすべてにアクセスするために使用されます。ワードプロセッサのテキストのように、スプレッドシートのセル、またはグラフィックプログラムの画像データなど。想定されることが多いのとは異なり、このデータはあまりアクセスされないため、プレフィックスが必要な場合でも、より長いアドレスフィールドを使用するよりも害はありません。
同様に、文字列操作を実行するときにDSとESをロード(および再ロード)する必要があるのはわずかな煩わしさです-これは少なくとも、当時の最良の文字処理命令セットの1つによって相殺されます。
ユーザーデータが64 KiBを超え、運用を開始する必要がある場合、本当に痛いです。一部の操作は一度に1つのデータ項目に対して単純に行われますが(考えてくださいA=A*2
)、ほとんどの場合、2つ(A=A*B
)または3つのデータ項目(A=B*C
)が必要です。これらのアイテムが異なるセグメントにある場合、ESは操作ごとに数回リロードされ、かなりのオーバーヘッドが追加されます。
当初、8ビットの世界からの小さなプログラム(* 3)と同じように小さなデータセットで、それは大した問題ではありませんでしたが、すぐに主要なパフォーマンスのボトルネックになりました。プログラマー(およびコンパイラー)。Intelは386で2つのセグメントを追加することでようやく安心を実現しました。そのため、メモリ内に要素が展開されている一連の単項、二項、または三項演算は、ESを常にリロードしなくても実行できます。
プログラミング(少なくともアセンブリ)とコンパイラーの設計では、これはかなりの利益でした。もちろん、それ以上の数でもかまいませんが、3つでボトルネックは基本的になくなったので、無理する必要はありません。
名前の付け方は、F / Gという文字は、Eの後に続く単なるアルファベットの続きです。少なくとも、CPU設計の観点からは、何も関連付けられていません。
* 1-単純に2つのセグメントレジスタが必要なため、文字列の宛先にESを使用することは例外です。これらがなければ、あまり役に立ちません-または常にセグメント接頭辞が必要です。これにより、驚くべき機能の1つである(反復しない)文字列命令を使用すると、1バイトエンコーディングのために極端なパフォーマンスが発生する可能性があります。
* 2-後から考えると、「その他すべてのセグメント」の方が「追加のセグメント」よりも優れたネーミングだったでしょう。
* 3-8086 は8800が完成するまでのストップギャップ対策としてのみ意図されたものであり、主に組み込み世界が8080/85の顧客を維持することを目的としていたことを常に覚えておくことが重要です。