4: 2007-12-02 (日) 00:20:50 |
現: 2024-01-06 (土) 22:37:42 |
| | | |
| よし! メモリを全部読んでみる実験だ! | | よし! メモリを全部読んでみる実験だ! |
| + | |
| START: | | START: |
| MOV BX,0x0000 ;開始する番地 | | MOV BX,0x0000 ;開始する番地 |
| MOV CX,0xFFFF ;ループする回数 | | MOV CX,0xFFFF ;ループする回数 |
| JMP LOOP | | JMP LOOP |
| + | |
| FORNEXT: | | FORNEXT: |
| MOV AX,[BX] ;BX番地のメモリの内容をAXに読んでみる | | MOV AX,[BX] ;BX番地のメモリの内容をAXに読んでみる |
| 32ビット。16ビットのたった2倍だよね?。上記と同じように計算してみると・・・~ | | 32ビット。16ビットのたった2倍だよね?。上記と同じように計算してみると・・・~ |
| 0x00000000番地〜0xFFFFFFFF番地まで。0xFFFFFFFFバイト。10進数に直すと4,294,967,295バイト。これを1024で割り算してKB単位にすると・・・4,194,304KB・・・さらに1024で割り算してMB単位にすると・・・4096MB・・・もういいよね? なんと、4GB!!!~ | | 0x00000000番地〜0xFFFFFFFF番地まで。0xFFFFFFFFバイト。10進数に直すと4,294,967,295バイト。これを1024で割り算してKB単位にすると・・・4,194,304KB・・・さらに1024で割り算してMB単位にすると・・・4096MB・・・もういいよね? なんと、4GB!!!~ |
- | こんなに贅沢に沢山のメモリを使えるので、32ビットの時にはセグメントなんてない。というか、そんなややこしいことしなくてもいいわけ。(注1) | + | こんなに贅沢に沢山のメモリを使えるので、32ビットの時にはセグメントなんてない。というか、そんなややこしいことしなくてもいいわけ。[[(注1):http://thebbl.hideyosi.com/modules/bwiki/index.php?%BB%F1%CE%C1%2Fx86%2F%A5%BB%A5%B0%A5%E1%A5%F3%A5%C8#j65cbf7c]] |
| | | |
| そう。CPUのビット数だけ見ると、たかだか倍なのでたいしたことないように見えるかもしれないけど、16ビットと32ビットじゃ、こんなに巨大な差があるんだ! | | そう。CPUのビット数だけ見ると、たかだか倍なのでたいしたことないように見えるかもしれないけど、16ビットと32ビットじゃ、こんなに巨大な差があるんだ! |
| MOV DS,0xF000 ;DSにセグメント値を入れる。 | | MOV DS,0xF000 ;DSにセグメント値を入れる。 |
| MOV BX,0xFFFF ;BXに読みたいメモリのオフセット値を | | MOV BX,0xFFFF ;BXに読みたいメモリのオフセット値を |
| + | |
| DSの値 F000 ;←1桁左にずれる | | DSの値 F000 ;←1桁左にずれる |
| BXの値 + FFFF | | BXの値 + FFFF |
| MOV BX,0x0045 ;BXレジスタにオフセット値0x0045を代入 | | MOV BX,0x0045 ;BXレジスタにオフセット値0x0045を代入 |
| MOV AX,[DS:BX] ;AXには物理的に0x12345番地の値(0x10)が入る | | MOV AX,[DS:BX] ;AXには物理的に0x12345番地の値(0x10)が入る |
| + | |
| + | ''豆知識〜'' |
| + | 枝豆ってや〜 |
| + | |
| + | このちょっと変則的な方法(二つの16ビットを組み合わせて指定する)。前の方の値を''セグメント''といい、後ろの値を''オフセット''と言う。 |
| + | |
| + | セグメントというのは英語で断片とか分割とかいうような意味。 |
| + | |
| + | さらにオフセットとは、ずれている量みたいな意味合いになる。 |
| + | |
| + | こういった名づけから、セグメント:オフセットは、以下のような説明がなされることが多い。 |
| + | |
| + | -''セグメント値:''メモリを分割して64KB単位で扱う場合の先頭アドレス(開始番地) |
| + | -''オフセット値:''セグメント値を基点(スタート位置)にして、そこから何バイト後ろにずれているか |
| + | |
| + | **そんなわけで・・・ [#bd10221e] |
| + | 8086、あるいはその互換であるリアルモード時のCPUは、''ことアドレスを指定する場合は必ず2つで指定する''と覚えておけばとりあえずは原理を理解できると思う。 |
| + | |
| + | アドレスを指定するっていうのはなにもプログラム・プログラマの話だけではないよ。 |
| + | |
| + | CPUが動作する場合に必要な部分でも全てこの法則に当てはめれば、別の形で整理できるんじゃないかな? |
| + | |
| + | 例えば・・・・ |
| + | |
| + | -プログラム上でのアドレス指定 |
| + | --これまで説明してきたからわかるよね? |
| + | -インストラクションポインタ |
| + | --これはCPUが''次の命令のアドレス''としているもの。 |
| + | --なので、[CS:IP]という2つのレジスタが必要 |
| + | -スタック |
| + | --CPUが一時的に使う変数とかを保持しておくための場所を示している。 |
| + | --なので、[SS:SP]という2つのレジスタが必要 |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | ----- |
| + | *ウソつけ!32ビットでもセグメントあるじゃん! [#j65cbf7c] |
| + | |
| + | ・・・実はその通り。 |
| + | |
| + | ・・・でも、これがややこしさに拍車をかけている要因。 |
| + | |
| + | ''16ビット時と32ビット時は、セグメントという言葉の意味合いがぜんぜん変わってしまう''んだ! |
| + | |
| + | ちょっとこの図を見てみて。ややこしいけど解るでしょ?「エロマンガ」という言葉についての図。 |
| + | |
| + | |
| + | ┌─ 日本人 ──── エロマンガ ──── 「うっしっし!」 |
| + | │ |
| + | 人類 ──┤ |
| + | │ |
| + | └─ フィリピン人 ─ エロマンガ ──── 「美しい島だ」 |
| + | |
| + | これと同じくらい、同じ言葉でもその意味合いが違うんですよぇね。 |
| + | |
| + | |
| + | ┌─ 16ビット時 ──── セグメント ──── これで1MBアクセスできる! |
| + | │ |
| + | x86 ──┤ |
| + | │ |
| + | └─ 32ビット時 ──── セグメント ──── マルチタスクでは必要だ! |