こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

8086のメモリ管理について。

8086のメモリ管理について。

いつもお世話になっております。

小生、現在ポケコンZ-1GRでx86アセンブリを勉強中のアセンブリ初心者です。

今回質問させて頂きたいのは8086のメモリ管理についてです。
8086はメモリ管理にセグメントとオフセットという方法を使い、全部で2MBのメモリが使用できるのは、理解できました。

理解できないのは、物理メモリへの変換の際、(セグメントアドレス X 10H) + オフセットで物理メモリにアクセスできるという箇所です。

セグメントアドレス X 10Hで20bitのアドレス空間を操作できるのは分かるのですが、
問題はセグメントアドレス X 10Hがどこの箇所(例えばCPUの中)で行われているのでしょうか?

MMUはもちろんないはずだと思います。

お忙しい中、大変申し訳ございませんが、先輩方ご教示宜しくお願い致します。

投稿日時 - 2010-05-16 19:51:11

QNo.5899783

すぐに回答ほしいです

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

No.1 です。
ちょっと説明が足りませんでした。

>というわけで、セグメントレジスタの16bitを、物理アドレス20bitに変換する方法が
>「16倍して(=4bitシフトして)下位4bit"0000"とする」という事なのです。

これで「セグメントの物理アドレス20bitが決定する」し、
これに加えてオフセットの16bitを「加算」して目的の物理アドレス20bitを作ります。

セグメントを特に使わないと4セグメントレジスタは全部ゼロ、
物理アドレスに1MByte搭載可能でも先頭の64KByteアドレスしか使わない、
という事になります。

「MMU はない」のは確かですが、先のような簡単なアドレス変換程度は
「MMUの真似事ように」行われている、というわけです。
繰り返しになりますが、プログラムは0番地相対で書いておけば、
使う時に、プログラムを置く物理アドレスが変わった時にも
プログラムは変更なく(再アセンブルもせず)
実行直前にセグメントに適正な値を与えてやれば済みます。
(もちろん、プログラム中でセグメントを理的に指定するような作りなら
この限りではありません)

投稿日時 - 2010-05-16 20:36:28

お礼

shokker02さん、再度ご教示頂き誠に感謝申し上げます。

>セグメントを特に使わないと4セグメントレジスタは全部ゼロ、
>物理アドレスに1MByte搭載可能でも先頭の64KByteアドレスしか使わない、
という事になります。

つまり、オフセットで指定出来るアドレスが16bitしかないから64kbyteしか使わないと言う事ですね!
ますます理解が深まって来ました。

>繰り返しになりますが、プログラムは0番地相対で書いておけば、
>使う時に、プログラムを置く物理アドレスが変わった時にも
>プログラムは変更なく(再アセンブルもせず)
>実行直前にセグメントに適正な値を与えてやれば済みます。

すごい裏技というか、ハック方法を教わった気がします。
今後、8086アセンブリでプログラムする際、一度実験してみます!

沢山のご教示本当に心から感謝申し上げます!

投稿日時 - 2010-05-18 10:33:03

このQ&Aは役に立ちましたか?

9人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

>どこの箇所(例えばCPUの中)で行われているのでしょうか?
CPUの中 で 良いのでは。

参考に
http://ldlabo.hishaku.com/NO20/main.htm

投稿日時 - 2010-05-16 20:14:57

お礼

Shinhさん、ご回答頂き誠に感謝申し上げます。

ご提示して頂いたサイトを拝見させて頂きました。

セグメントの箇所大変、勉強になりました。
セグメントレジスタの箇所は自分で頑張って、理解してみます。

ご教示頂き、本当にありがとうございました。

投稿日時 - 2010-05-18 10:26:02

ANo.2

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

投稿日時 - 2010-05-16 20:07:15

お礼

notnotさん、ご教示頂き誠に感謝申し上げます。

ご教示頂いた後、電卓できちんと計算してみたところ1048575という数値が出ました。
FFFFFを10進に変換しました。

notnotさんの仰る通り、百万と48575とですので、1MBのメモリ量と同等となる事が分かりました。

ご教示頂き、本当にありがとうございました!

投稿日時 - 2010-05-18 10:21:14

ANo.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はありません。

投稿日時 - 2010-05-16 20:03:01

お礼

shokker02さん、ご回答頂き誠に感謝申し上げます。

ご教示頂いた、
>・物理アドレス20bitを指定したいが、レジスタ群は16bitなので扱いにくい
>・セグメントのアドレスは、1番地きざみの必要はないだろう(細かい必要がなかろう)
>ということで、セグメントアドレスのうち下位4bitを"0000"固定とし、
>上位側16bitをセグメントレジスタで指定する事にしました。

とても勉強になりました。

そして、20bit物理アドレス変換はCPUの中で行われているのですね!

沢山のご教示頂き、更に知識が深まりました。
本当にありがとうございました!

投稿日時 - 2010-05-18 10:13:28

あなたにオススメの質問