• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:8086のメモリ管理について。)

8086のメモリ管理について

このQ&Aのポイント
  • 8086のメモリ管理方法について疑問があります。
  • セグメントとオフセットを使い、2MBのメモリが使用できることは理解できました。
  • しかし、セグメントアドレス X 10Hがどこで行われているのか分かりません。

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

  • ベストアンサー
  • shokker02
  • ベストアンサー率45% (204/446)
回答No.4

No.1 です。 ちょっと説明が足りませんでした。 >というわけで、セグメントレジスタの16bitを、物理アドレス20bitに変換する方法が >「16倍して(=4bitシフトして)下位4bit"0000"とする」という事なのです。 これで「セグメントの物理アドレス20bitが決定する」し、 これに加えてオフセットの16bitを「加算」して目的の物理アドレス20bitを作ります。 セグメントを特に使わないと4セグメントレジスタは全部ゼロ、 物理アドレスに1MByte搭載可能でも先頭の64KByteアドレスしか使わない、 という事になります。 「MMU はない」のは確かですが、先のような簡単なアドレス変換程度は 「MMUの真似事ように」行われている、というわけです。 繰り返しになりますが、プログラムは0番地相対で書いておけば、 使う時に、プログラムを置く物理アドレスが変わった時にも プログラムは変更なく(再アセンブルもせず) 実行直前にセグメントに適正な値を与えてやれば済みます。 (もちろん、プログラム中でセグメントを理的に指定するような作りなら この限りではありません)

HackHack
質問者

お礼

shokker02さん、再度ご教示頂き誠に感謝申し上げます。 >セグメントを特に使わないと4セグメントレジスタは全部ゼロ、 >物理アドレスに1MByte搭載可能でも先頭の64KByteアドレスしか使わない、 という事になります。 つまり、オフセットで指定出来るアドレスが16bitしかないから64kbyteしか使わないと言う事ですね! ますます理解が深まって来ました。 >繰り返しになりますが、プログラムは0番地相対で書いておけば、 >使う時に、プログラムを置く物理アドレスが変わった時にも >プログラムは変更なく(再アセンブルもせず) >実行直前にセグメントに適正な値を与えてやれば済みます。 すごい裏技というか、ハック方法を教わった気がします。 今後、8086アセンブリでプログラムする際、一度実験してみます! 沢山のご教示本当に心から感謝申し上げます!

その他の回答 (3)

  • shinh
  • ベストアンサー率39% (363/926)
回答No.3

>どこの箇所(例えばCPUの中)で行われているのでしょうか? CPUの中 で 良いのでは。 参考に http://ldlabo.hishaku.com/NO20/main.htm

HackHack
質問者

お礼

Shinhさん、ご回答頂き誠に感謝申し上げます。 ご提示して頂いたサイトを拝見させて頂きました。 セグメントの箇所大変、勉強になりました。 セグメントレジスタの箇所は自分で頑張って、理解してみます。 ご教示頂き、本当にありがとうございました。

  • notnot
  • ベストアンサー率47% (4901/10362)
回答No.2

実効アドレスの生成はCPUの中です。CPUから出るアドレスバスの段階で20bitになっています。2の20乗は約百万なので、1MBのメモリ空間にアクセスできます。

HackHack
質問者

お礼

notnotさん、ご教示頂き誠に感謝申し上げます。 ご教示頂いた後、電卓できちんと計算してみたところ1048575という数値が出ました。 FFFFFを10進に変換しました。 notnotさんの仰る通り、百万と48575とですので、1MBのメモリ量と同等となる事が分かりました。 ご教示頂き、本当にありがとうございました!

  • shokker02
  • ベストアンサー率45% (204/446)
回答No.1

8086の物理アドレスは最大1MByteです。 アドレス信号として、A0~19 と BHE- の21本ありますが、BHE-とA0 は 16bitデータの上位8bit・下位8bitの指定に使われるもので、他のアドレスと性格が若干異なります。 (4つのセグメントで物理アドレスに分けるなら更に4倍になりますけど、普通しません) で、「セグメント」という領域の先頭アドレスを指定するのですが... ・物理アドレス20bitを指定したいが、レジスタ群は16bitなので扱いにくい ・セグメントのアドレスは、1番地きざみの必要はないだろう(細かい必要がなかろう) ということで、セグメントアドレスのうち下位4bitを"0000"固定とし、 上位側16bitをセグメントレジスタで指定する事にしました。 というわけで、セグメントレジスタの16bitを、物理アドレス20bitに変換する方法が 「16倍して(=4bitシフトして)下位4bit"0000"とする」という事なのです。 >問題はセグメントアドレス X 10Hがどこの箇所(例えばCPUの中)で行われているのでしょうか そうです。 プログラマの意識によらず、プログラムですらCS(コードセグメント)を知らないうちに使われ、 20bit物理アドレスに変換して使われています。 プログラム自体のジャンプ先などは、セグメント内のオフセット値なので、 物理アドレスを意識しない作りになっています。 >MMUはもちろんないはずだと思います はい。8086にはMMUはありません。

HackHack
質問者

お礼

shokker02さん、ご回答頂き誠に感謝申し上げます。 ご教示頂いた、 >・物理アドレス20bitを指定したいが、レジスタ群は16bitなので扱いにくい >・セグメントのアドレスは、1番地きざみの必要はないだろう(細かい必要がなかろう) >ということで、セグメントアドレスのうち下位4bitを"0000"固定とし、 >上位側16bitをセグメントレジスタで指定する事にしました。 とても勉強になりました。 そして、20bit物理アドレス変換はCPUの中で行われているのですね! 沢山のご教示頂き、更に知識が深まりました。 本当にありがとうございました!

関連するQ&A