up

セグメント:オフセット

    セグメント:オフセット、これは 感覚的なものと 実際に 手計算したもので 別に意味は無いのですが 感覚が おかしかった ということを 認識するためのものです。セグメント:オフセット 方式でアドレスを表すので すが 直感的なものと 大いな相違があるという事です。

     これは適当に見つけたものですので、本当のもの は個々のデーターシートなりを 参照の事

8008   8bit CPU  18 pin     d0-d7        16KBytes     2^14=   16384
8080   8bit CPU  40 pin     A0-A15       64KBytes     2^16=   65536
8088  16bit CPU  40 pin     A0-A19        1MBytes     2^20= 1048576
8086  16bit CPU  40 pin     A0-A19        1MBytes     2^20= 1048576     
80286 16bit CPU  68?        A0-A23       16MBytes     2^24=16777216

2^16=65536
FFFFh --->65535d

通常 16bit ということで考えられる事は 2^16 ということで 65Kbytes を アクセスするということに なると考えられます 何で 8bit CPU が 2^8 つまり 256 でなく 16KByte とか 64KByte とかという メモリを アクセスする事が出来 るのかは わかりません。CPU に なんらかの変換機能を持たせておく事が必要で は無いかと 考えられます。XX bit CPU といっても アドレスに付いては一致し たものが 無いようです

ここで まず 8088 ものを考えると この場合は たまたま アドレスが 20 個 の 端子で 使用可能ということで 2^20= 1048576 つまり 1MBytes を アクセス することが出来ます。 一方 16bit という制限から 2^16=65536 64Kbytes しか 取り扱えない事になります。ほたら 16bit 2個使えば良いということでそのま ま考えると 2^32=4294967296 4Gbytes 可能となりますが これは アドレスが 20 個敷かないので 最大でも 1MBytes しか扱えないようです。つまり この 数を増 やせば もっと多く取り扱える様です。

16bit のものを 2個使用してメモリのアドレスを 決める方法として segment:offsetというもので 取り扱うように 決めたようです。こういう仕様な のですから とやかくいうわけには ならないようです。

表し方としてまあ 2^16=65536 を 基本にかんがえたのか どうかは 不明です が 64KBytesを 一つの塊として 扱う方法を考えたようです

FFFFFh  ---> 1048575d (2^20=1048576)
FFFFh   --->   65535d (2^16=  65536)   (2^4=16)

F0000h + FFFFh = FFFFFh
F000h X 10h + FFFFh =FFFFFh
という 考えかどうかは 知りませんが F000 の 部分 と FFFF の 部分に 分けて
アクセスするように 考えているようです

理解しにくかったのは このことです つまり F000 の部分は F000 で もうそ れ以上の 数は 意味がないという 前提が成り立つということがわからなかった のです。ちなみに F000 の部分を セグメント とというようです FFFF の 部分 を オフセット というようです

F000h      X 10h +      FFFFh   =  FFFFFh
セグメント X 10h +  オフセット = 実際のアドレス

ここで例えば セグメント は F000 で もうそれ以上は意味が無いよ といっ ても データーとして F001h というものは考える事は可能です。一方同じ値を 別の表現で表す事も出来ます。

F000h X 10h + 0000h = F0000  (983040d)
...
EFFFh X 10h + 0020h = F0010  (983056d) ---- 
F000h X 10h + 0010h = F0010  (983056d) ---- 同じ値であるが
F001h X 10h + 0000h = F0010  (983056d) ---- 
...
F000h X 10h + FFFFh = FFFFF  (1048575d) ---- 上限と考えられるもの
...
F001h X 10h + FFFFh = 10000F (1048591d) ---- 本来は 無視されるもの
FFFFh X 10h + FFFFh = 10FFEF (1114095d)

16進数というのは 16個で 桁が上がる ということで 10FFEFh というもの に 10h 加えると 10FFFFh に なります FFFFh というのは 64KBytes というので それより 16bytes 少ない ということです。

勘違いその1

セグメント:オフセット での アドレスを 表すのであるが セグメント が 一個異るというのは 高々 16個の 相違にしか過ぎない 感覚としては セグメ ントと セグメント は 分離されているような感覚であった。

勘違いその2

アドレスをどのように表すかは置いといて 考え方としては セグメント の 値として FFFFh というものもある もしアクセスできるのであれば このアドレ スまでアクセスは可能ということですが 幸いというか不幸というか 余分にアク セス出来るのは 高々 64KBytes より 16bytes 少ない値であるということ、感 覚としては もっと多いように感じられる。

にゃんたろう 拝!
2008年 3月20日 (木) 21:42:12 JST


up

Copyright © 2006.-2008. nyantarou All Rights Reserved.