- ベストアンサー
8086のメモリ管理について
- 8086のメモリ管理方法について疑問があります。
- セグメントとオフセットを使い、2MBのメモリが使用できることは理解できました。
- しかし、セグメントアドレス X 10Hがどこで行われているのか分かりません。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
No.1 です。 ちょっと説明が足りませんでした。 >というわけで、セグメントレジスタの16bitを、物理アドレス20bitに変換する方法が >「16倍して(=4bitシフトして)下位4bit"0000"とする」という事なのです。 これで「セグメントの物理アドレス20bitが決定する」し、 これに加えてオフセットの16bitを「加算」して目的の物理アドレス20bitを作ります。 セグメントを特に使わないと4セグメントレジスタは全部ゼロ、 物理アドレスに1MByte搭載可能でも先頭の64KByteアドレスしか使わない、 という事になります。 「MMU はない」のは確かですが、先のような簡単なアドレス変換程度は 「MMUの真似事ように」行われている、というわけです。 繰り返しになりますが、プログラムは0番地相対で書いておけば、 使う時に、プログラムを置く物理アドレスが変わった時にも プログラムは変更なく(再アセンブルもせず) 実行直前にセグメントに適正な値を与えてやれば済みます。 (もちろん、プログラム中でセグメントを理的に指定するような作りなら この限りではありません)
その他の回答 (3)
- shinh
- ベストアンサー率39% (363/926)
>どこの箇所(例えばCPUの中)で行われているのでしょうか? CPUの中 で 良いのでは。 参考に http://ldlabo.hishaku.com/NO20/main.htm
お礼
Shinhさん、ご回答頂き誠に感謝申し上げます。 ご提示して頂いたサイトを拝見させて頂きました。 セグメントの箇所大変、勉強になりました。 セグメントレジスタの箇所は自分で頑張って、理解してみます。 ご教示頂き、本当にありがとうございました。
- notnot
- ベストアンサー率47% (4901/10362)
実効アドレスの生成はCPUの中です。CPUから出るアドレスバスの段階で20bitになっています。2の20乗は約百万なので、1MBのメモリ空間にアクセスできます。
お礼
notnotさん、ご教示頂き誠に感謝申し上げます。 ご教示頂いた後、電卓できちんと計算してみたところ1048575という数値が出ました。 FFFFFを10進に変換しました。 notnotさんの仰る通り、百万と48575とですので、1MBのメモリ量と同等となる事が分かりました。 ご教示頂き、本当にありがとうございました!
- shokker02
- ベストアンサー率45% (204/446)
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はありません。
お礼
shokker02さん、ご回答頂き誠に感謝申し上げます。 ご教示頂いた、 >・物理アドレス20bitを指定したいが、レジスタ群は16bitなので扱いにくい >・セグメントのアドレスは、1番地きざみの必要はないだろう(細かい必要がなかろう) >ということで、セグメントアドレスのうち下位4bitを"0000"固定とし、 >上位側16bitをセグメントレジスタで指定する事にしました。 とても勉強になりました。 そして、20bit物理アドレス変換はCPUの中で行われているのですね! 沢山のご教示頂き、更に知識が深まりました。 本当にありがとうございました!
お礼
shokker02さん、再度ご教示頂き誠に感謝申し上げます。 >セグメントを特に使わないと4セグメントレジスタは全部ゼロ、 >物理アドレスに1MByte搭載可能でも先頭の64KByteアドレスしか使わない、 という事になります。 つまり、オフセットで指定出来るアドレスが16bitしかないから64kbyteしか使わないと言う事ですね! ますます理解が深まって来ました。 >繰り返しになりますが、プログラムは0番地相対で書いておけば、 >使う時に、プログラムを置く物理アドレスが変わった時にも >プログラムは変更なく(再アセンブルもせず) >実行直前にセグメントに適正な値を与えてやれば済みます。 すごい裏技というか、ハック方法を教わった気がします。 今後、8086アセンブリでプログラムする際、一度実験してみます! 沢山のご教示本当に心から感謝申し上げます!