2

Intel 8086 について読み始めたばかりで、そのメモリについて質問があります。

アドレス バスは 20 ビット幅、つまりアドレス空間は 1MB であり、この空間はセグメントに分割されていると読みました。

質問は:

  1. CS、、、およびの 4 つのセグメント レジスタは読み取り専用ですかDS、それとも値を設定できますか?また、それらのデフォルト値はどれですか?SSES

  2. 次のアセンブリ チュートリアルを見ました。

    ORG 100h
    MOV AX, 0B800h ; set AX = B800h (VGA memory).
    MOV DS, AX ; copy value of AX to DS.
    MOV CL, 'A' ; CL = 41h (ASCII code).
    MOV CH, 01011111b ; CL = color attribute.
    MOV BX, 15Eh ; BX = position on screen.
    MOV [BX], CX ; w.[0B800h:015Eh] = CX.
    RET
    

最初の行に関しては、このコードが0x100コード セグメント空間またはアドレス空間全体のアドレスに存在することを意味しますか?

と行:

MOV [BX], CX

命令でアドレスを参照するたびMOVに、データセグメントの開始アドレスからアドレスを推定する必要があるということですか? (彼が書いたように、宛先は値+データセグメントregの値です)

4

2 に答える 2

11

まず、あなたがここで 8086 の「リアル モード」アドレッシングについて話しているように思われることを指摘せざるを得ません。ほとんどすべての最新のオペレーティング システムは「保護モード」で動作し、多くの拡張機能 (フラットな 32 ビットおよび 64 ビット メモリ空間のアドレス指定、仮想メモリなど) をサポートし、これらすべての動作を大幅に変更します。

私の知る限り、最近のほとんどのオペレーティング システムには、このようなコードを (リアル モードで) 実行する方法さえありません。から学ぶためのより最近の情報源を見つけるために。

そうは言っても、これを行う何らかの理由がある場合 (特定の組み込みプロセッサを使用する場合など)、または単に歴史的な目的に興味がある場合:

  1. はい、8086 リアルモード セグメント レジスタは変更できます。これを行うための命令とオプションは、より汎用的なレジスタを変更するよりも少し制限されています (たとえば、値を直接セグメント レジスタにロードする命令はありません。そのため、引用したコードでは、値は最初に にロードされAX、次に) にAXロードされDSます。また、使用しているセグメント レジスタによっても異なります。

    一般に、CS(「コード セグメント」) レジスタを直接変更することは決してありません。これは、プロセッサが実行しているコードをすぐに変更することになるためです (おそらく、実際には望ましくない方法で)。変更する通常の方法CSは、「ロング ジャンプ」または「ロング コール」命令を使用することです。これにより、CSIP(命令ポインタ) の両方が同時に更新されます。同様に、SS(「スタック セグメント」) は、通常、プログラムの実行の開始時に設定され、変更されることはありません (ただし、技術的には、そうする必要がある本当にやむを得ない理由がある場合はそうなる可能性があります)。

    DSおよびESは汎用データセグメントレジスタであり、プログラムがこれらを変更することはかなり一般的でしたが、使用したいメモリに最適にアクセスしたいと考えていました (上記のサンプルコードが示すように)。

    これらのレジスタの初期値は、通常、プログラムのコードを呼び出す前にオペレーティング システムによって決定されます。従来、MS-DOS では、.COM ファイルまたは .EXE ファイルとしてプログラムを記述する 2 つの方法がありました。(ORG 100h上記のコードの行は、それが COM プログラムとして実行されることを意図していたことを示唆しています。) COM の場合、MS-DOS は最初にすべてのセグメント レジスタを同じに設定しますCS(つまり、それらはすべてプログラムを呼び出す前に、DOS がプログラムをメモリにロードすることを決定した場所を指します)。EXE ファイル形式はやや洗練されており、別の「データ セグメント」を指定することができましたDSES代わりに、プログラムを開始する前にそのセグメントを指すようにします。EXE プログラムでは、通常、DOS はそれらに対しても別のスタック セグメント ( ) をセットアップしSSます。

  2. The ORG 100h行は、アセンブラに「次のコードがアドレス 100h にロードされると仮定する」ことを伝えます。リアルモード コードでは、このようなアドレスは常に に対して相対的です(したがって、コードが に対して 100h になるように が正しい値に設定されてCSいる限り、プログラムは実際にはメモリ内の多くの場所にロードされる可能性があります)。CSCS

  3. データ操作 ( など) のほとんどのMOVアドレスは、デフォルトで相対的に計算さDSれます (一部の命令では、使用する別のセグメントを明示的に指定することで変更できますが、それを実行できるかどうか、およびその方法は、オペコードとその方法によって異なります)。使用しています)。ただし、デフォルトで他のセグメントを使用するように設計された命令がいくつかあります。要約すると、知りたい各オペコードのドキュメントを読んで、どのセグメントレジスタがどのように使用されているかを判断することをお勧めします。

于 2013-09-17T00:07:14.897 に答える