例2.4 x86命令コンプレックス

  複合体の代表として、x86命令セットは、当然かなり複雑な命令がたくさんあるでしょう。 このセクションでは、そのうちのいくつかは、代表的な例で表示されます。
  操作コマンド列は、各要素にメモリを動作させるためのデータ列です。 要素は、バイトまたはワードと呼ばれることがあります。 この文字列は非常に長くすることができ、それが64キロバイトに到達することが可能である、x86のは、5つの異なる操作コマンド列を提供し、 そして、それは文字列操作命令で使用することができ、繰り返しプリフィックスの3種類があります。 この表は、文字列操作命令と3つのリピートプレフィックスの5種類を示しています。 のは、グループのプレゼンテーションを選択してみましょう。この命令フォーマットは、何のオペランドは、非常に単純で 、その機能は、別の指定した場所にメモリ内のバイト位置で指定されたメモリセルに転送されません。 しばしば繰り返さREPプリフィックス、と交配され 、多くの接頭辞、接頭辞があるのx86アーキテクチャの CXレジスタの値が文字列を繰り返し演算命令で実行され、ゼロに等しくないときに意味が。 だから、このディレクティブは任意のオペランドを持っていないことを不思議です。実際には、我々は、x86それらの多くがあることに注意すべき 命令のオペランドがそうではないですが、それは彼らが命令のオペランドのそれよりも単純であることを意味するものではありません。 彼らはオペランドを書いていないので、おそらく操作の数が多すぎるので、それは、説明書に書き込むことができない、何のオペランドがありませんので 、彼らは実際にいくつかの暗黙のオペランドを持っているので。 この転送命令シーケンスに対して、送信すべきデータ系列は、その元の文字列と呼ぶことにします。 DSでのソース文字列のデフォルトアドレス:セットのSI・ロケーション・レジスタポイント。 送信すべきオブジェクトが、我々は、ESのデフォルト文字列の宛先アドレスと呼ばれる:DIは、レジスタの組の位置を指し、 送信すべき文字列の長さは、CXレジスタの中に配置されます。 書面によるオペランドがありませんが、我々は、それを見ることができますが、それは実際にそのオペランドとして5つのレジスタを持っています。 それだけでいくつかの暗黙的な操作は、に加えて、そこにある、オペランドを暗示していません ストリング送信添加は、この操作が完了した後、これらの動作は、ハードウェアで自動的に行われる: 第一の変形例SIおよびDIは、次の文字列要素を指すように、登録します。 そして、リピートプリフィックスを使用するかどうかを決定し、もしそうであれば、その後、CXレジスタの内容は、1だけデクリメントし 、プログラマがソフトウェアで指定する必要はない、これらのハードウェアの操作が自動的に行われることに留意すべき。 
  ここでは、例を見てみましょう。我々はメモリを実施したいとし たデータ列転送。最初のアドレス12040位置のソース文字列、 3バイトの合計は、我々は、起動するローカル12060に転送したいです。 それは私たちがこれを書いたプログラムである、という仮定は、以前のデータセグメントがDS 1000年、登録設定されている このプログラムの最初の2つの命令を実際に登録するには、データ・セグメントの内容を転送される 追加のセグメントに登録します。しかし、直接セグメントレジスタ、そう借りAXとの間で転送することができない 、オブジェクト列オフセットアドレスレジスタにDIに、およびレジスタのうちソース文字列SIに格納されたオフセットアドレス レジスタDSのセットとSIがを指すようにソース文字列。 そしてレジスタES及びDIのセットは、文字列オブジェクトを指します。 伝送の方向が決定されるCLD、次の命令は、1について説明します。 3は、それらをレジスタCXに格納され、これは、文字列の転送命令です。 リピートプレフィックスが前に、このような構成は、この連続実行転送命令列の3倍に相当します。 第1の送信を行った後、最初のバイトは、文字列のオブジェクトの位置に転送され、 転送が完了した後にSIとDIが自動的に増加され、CXが自動的にデクリメント。これらの操作は、CPUによって実行されます。 同時に、私はこのバイトが実際に12040個のCPUに開始されている、いわゆる転送を説明したいと思い 、アドレス読み取りCPUに読み込まれ、その後、メモリ12060のアドレスへの書き込み動作を開始し 、対応するバイトに書き込みますユニット。二次転写後、SIおよびDI 1が追加され、CXは、1だけデクリメントされ、 第3の転送が完了した後、SIおよびDI 1ながら追加していくない、 しかしCX 0まで減少しているので、もはや実行します。 さらに、文字列の搬送方向を設定することができることに留意されたいです。 DF = 0は、ソース文字列の先頭アドレスから送信された場合、転送中、SIおよびDIが増分自動的に変更され、ローです。 DF- = 1の場合、送信中に、高い文字列から送信された元の開始アドレス、SIおよびDI修飾の自動減少。 この表は、SIおよびDIに変更方法を示しています。そのそれDFフラグを変更する方法? 実際には、x86のフラグの二つの制御命令が操作する提供します。 STDは、DFフラグです。CLDは、私たちがちょうどその命令で、DFがクリアされている例です。 これは、文字列転送の方向を決定することが可能となります。そのような方向性を提供することは 、実際に元の文字列と可能なオブジェクトの重なりの問題の文字列に対する応答です。 私たちは、単に言い換えを見てください。メモリ内の送信元と宛先の文字列が相互にしている場合は 重複しない相、DFのこの時間は、0または1に設定し、それは問題ではありません。 しかし、あなたの元の文字列と文字列オブジェクトが重なっている場合、 それは低アドレスに高いからDF 1順次転送開始アドレスに設定する必要があります、または 緑の重なる部分には、それが結果として、送信の開始時にカバーされます誤った結果。 文字列は重複の形態であることを送信元と宛先の文字列場合、DFは、ゼロに設定されなければなりません。 
低アドレスから転送を開始、その理由は同じです。 また、転送命令列において、文字列操作の他のタイプがあります。例えば、データに ストリーム、特定のデータを見つけるために、または二つのデータ列を比較して同一です。 だから、プログラマは動作するようにデータのチャンクのために、非常に便利な手段を持っています。 したがって、文字列操作コマンドは非常に強力なコマンドがありますが、間のデータ列ので、 要素の数が多いがあるかもしれないので、文字列操作命令実行時間も非常に長くなることがあり、 これは注意を払う必要があります。
  最後に、興味深い例から、我々はx86命令の複雑さを見て。 この図は、一般的なx86命令フォーマットです。 各セルは少し命令フォーマットの特定のフィールドです。 そして、私たちは人々に命令を書き込むことができ、この命令は追加ですが、 接頭辞LOCKがあり、私達はちょうど同じREPプレフィックスは命令であることを学びました。 ソース・オペランドは、32ビット即値であり、このほか、。別のソース・ オペランドとデスティネーション・オペランドはメモリセルのうち、32ビットのメモリです。 メモリセルは、データセグメントをデフォルトが、ここで追加のセグメントに必須として指定する必要があり、 レジスタEAX、ECXレジスタによるメモリセルのアドレス と計算によって得られた即値。メモリ・アドレスを計算するには 、オフセットアドレスを取得するために、1個の乗算二の加算を必要とするセグメント・ベース、及びその後 の操作をシフト及び加算後のビットの数を得るために、記憶部32にアクセスします。 この即値12345678で、このメモリセルにアクセスする、に寄託の数は、 15バイトの総数をコードするこの命令は、最長のx86命令と考えることができます x86命令の複雑さは明らかです。
  だけの簡単な指示を与えられたプログラマは、 コンピュータが自然に非常に良いことは非常に複雑なタスクを完了することができます。 コンピュータがそのように設計されているようだが、残念ながら世界はそれほど単純ではありません、それは全く逆のアプローチを示唆された、我々は次のセクションを言います。
 
参考:北京大学呂Junlin教師コンピュータアーキテクチャコース
お知らせ:侵害は、お知らせください、私は削除する場合は、あなたに感謝!

おすすめ

転載: www.cnblogs.com/morwing/p/11794921.html