• ベストアンサー

ジャンプ命令について

一つ教えて頂きたいことがあるのですが本で読んで気づいてのですがMSーDOSでジャンプ命令で例えばアセンブラなのですがjmp2000:000で2000の部分がMS-DOSが勝手に書き換えてしまうというとことなんですがこの勝手にとは何を基準に書き換えてるのでしょうか?拙いですが分かる方 いらしたらご教授よろしくお願いします。 環境はMS-DOSです。

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

昔のCPU(インテルの8080あたり)のJMP命令は絶対アドレス指定で あったため、プログラムをメモリの何処に置くかは重要でした。 つまり、「空いたメモリ空間に適当にロードすれば実行できる」という モノではなかったのです。これでは不便であるということで、命令 自体が相対アドレス指定になったり、セグメント+オフセットのような メモリアドレス構造をとることで、「アドレスの制約」から自由に なりました。(リロケータブルという) 現CPU(80386系)におけるリアルモード(MS-DOSはコレ)では メモリアドレスはセグメント+オフセットで表されています。 オフセットはプログラムの先頭からの相対位置を示し、セグメントは プログラムがOSによりロードされた実アドレスを示します。 オフセットを参照する限り、実アドレスが何処であっても正しい操作が 可能になります。セグメントはOSがプログラムをロードする時に空いて いるメモリを割り当てます。「勝手に書き換える」とはこの割り当てる 行為の事を指していると思います。プログラムにセグメントまで参照 する命令がある場合はexeヘッダにこの命令のセグメント部分が記録 されているので、OSはこの情報を元にプログラム内のセグメント参照を 解決します。一方、オフセットしか参照しない命令でプログラムを 作成してあれば、exeヘッダは不要になります。これがCOMモデルです。 ファイルの拡張子が.COMになっているのがソレです。

79562
質問者

お礼

空いているメモリを割り当てるのですね。わかりやすい説明ありがとうざいました。

その他の回答 (1)

  • baa756
  • ベストアンサー率43% (28/64)
回答No.1

MS-DOSは、仮想アドレスをサポートしていません。 CPUのi8086も仮想アドレスをサポートする、MMUを持っていません。 しかし、プログラムが実メモリにロードされる、実アドレスは固定されていません。プログラムが実メモリにロードされる時に、実アドレスが決まるのです。 プログラム・ローダー(MS-DOSではこの名称だったか記憶に無いのですが)が、プログラムを実アドレスにロードする時に、実アドレスに合わせて、変換しています。

79562
質問者

お礼

回答ありがとうございました。

関連するQ&A