2: 2007-01-08 (月) 15:35:39 |
現: 2024-01-06 (土) 22:39:13 |
| セグメントとはなんじゃらほい? | | セグメントとはなんじゃらほい? |
| | | |
- | 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番地のメモリにアクセスしてくれる。 |
| + | |
| + | 図にする・・・ |
| | | |
| 物理アドレス | | 物理アドレス |