雑記帳
ここはhideyosiの雑記帳です。テケトーに書き散らしてるだけなので間違っていたりとは普通にしてます。信用度は相当低いことをあらかじめご了承を。またご覧のようにWikiを使ってますが、hideyosi意外は書き込めません。
2: 2007-01-08 (月) 15:35:39 ソース バックアップ No.2 を復元して編集 現: 2024-01-06 (土) 22:39:13 ソース 編集
Line 7: Line 7:
セグメントとはなんじゃらほい? セグメントとはなんじゃらほい?
-8086CPUは、最大1MBのメモリをアクセスできる。+8086は16bitですね。内部には沢山のレジスタがありますが、ほぼどれも最大16bitです。
-(「アクセスできる」とは、逆に言えば、それ以上メモリ装置が搭載されていても、アクセスできないということ)+CPUがメモリにアクセスする場合、当然メモリの番地を指定しなくてはなりませんが、そのためのレジスタも16bitです。
-なぜ????+ん?おかしいですね?。メモリの番地を指定するためのレジスタも16bit。(16進数で4桁です。)そうなると・・・
-メモリの指定には、必ず「番地」を指定しなければいけない。+ 0x0000〜0xffff
-この番地の指定に使われるCPU内のレジスタが16bitしかないから。+です。最大0xffffということは、十進数に直すと・・・65,535・・・え? ''最大''64KB???
-16ビット= 0x0000 〜 0xFFFF まで。十進数に直すと0〜65535。 +そうです。CPUの素直な仕組みで考えると、16bitのCPUは、最大64KBしかメモリをアクセスすることができません。・・・しかし、8086は最大1MBを活用することができるのです。いったいどうやって???
-つまり、65,535バイト。あれれれ? たった64KB?????+
-8086はたったこれだけのメモリしかアクセスできない!? +8086CPUは大きなメモリ空間を64KBごとに区切り、各区切りを別の16bitのレジスタで指定することによって、事実上20bit(16進数で5桁)でメモリ番地を指定することができます。この64KBの区切りを''セグメント''と言います。
-「素」の理屈から言えばそうなる。これでは少なすぎるので、8086はちょっと変わった方式を採用している。+
-メモリアドレスを20ビット(16進数で5桁)で表現できるようになっている。これなら、0x00000〜0xFFFFF。つまり、1,048,575バイト。1MBとなる。+ メモリ番地を20ビットで表現。これなら、0x00000〜0xFFFFF。つまり、1,048,575バイト。1MBとなる。
-しかし、レジスタは16ビット(16進数で4桁)。これでどうやって20ビットを表現するのか?+具体的には、「セグメントアドレス」+「オフセット値」でアドレスを表現する。
-「セグメントアドレス」+「オフセット値」でアドレスを表現する。+セグメントアドレスもやはり16ビットでしか表現できない。で、それ+何番地ずれているかを表現する。
-セグメントアドレスもやはり16ビットでしか表現できない。で、それ+何番地ずれているかを表現する。これが「セグメント」という概念。+たとえば、物理的に0x21000番地のメモリにアクセスしたいとする。その場合、レジスタはみな16ビットではあるが、
-たとえば、物理的に0x112233番地のメモリにアクセスしたいとする。その場合、レジスタはみな16ビットではあるが、+ セグメントアドレスに:0x2000  (セグメントベースという) 
 + オフセットアドレスに:0x1000  (オフセット値という)
-セグメントアドレス:1122 +とセットすると、
-オフセットアドレス:0033+
-これで表現する。図にするとこうなる。+ 0x2000x16 = 0x20000 
 +               + 
 +             0x1000 
 + -------------------- 
 +             0x21000 
 +こう解釈して内部回路に信号を送り、0x21000番地のメモリにアクセスしてくれる。 
 + 
 +図にする・・・
 物理アドレス  物理アドレス