第56章 メモリモデル


さて、今回はメモリモデルについて少しだけ解説します。 これは、8086系といわれるCPUに特有の問題です。 筆者はあまり詳しくないので触れたくない問題でもあります。 8086用の処理系ではこのメモリモデルを設定しなくてはいけません。

まず、8086というのは16ビットCPUです。以後の話は 厳密な意味では正しくない可能性がありますが、理解する上には わかりやすいでしょう。

16ビットで表せる数値は16進で0000hからFFFFhまでです。 10進では0から65535であることはすでにご存知のことと思います。 メモリのアドレスを表す場合0番地から65535番地までは 16ビットあれば足ります。しかしこれより後の番地は16ビット では表すことができません。これを解決するために セグメンテーション(segmentation)という概念が必要になってきます。 すなわちセグメントの先頭と、その先頭からいくつ進んだ所かで 表すことが可能です。 FFFFh番地の次は10000h番地ですね。 これを

(1000h:0000h)

その次を

(1000h:0001h)

というように表せば16ビットの2つの組み合わせで (0000h:0000h)番地から(FFFFh:FFFFh)番地まで表すことができます。 最初の数値を16倍して後の数値を足せば 絶対的な番地が求まります。

わかったような、わからん話だな!

さて、プログラムについ考えると、変数などのデータ部 とプログラムのコード部がすべて64Kに収まれば 問題はないのですがどちらかがこれを越えると 問題が生じそうですね。 実はメモリモデルというのはコードとデータが64K を越えるかどうかで決まってくるのです。 どちらも64K以内である物をスモールメモリモデル、 コードのみが64Kを越える物をミディアムメモリモデル、 データのみが64Kを越える物をコンパクトメモリモデル、 どちらも64Kを越える物をラージメモリモデルといいます。 では、ちょっとした実験をしてみましょう。

これは、入門書などにはよく出ているプログラムです。 これをいろいろなメモリモデルでコンパイルして実行してみましょう。 たとえばスモールメモリモデルならば、結果は次のようになるはずです。

今度は、これをラージメモリモデルでコンパイルして実行してみましょう。

これで、少しメモりモデルの意味が分かったでしょうか。


[Index][総合Index] [Previous Chapter] [Next Chapter]

Update Mar/07/1997 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。