資料集
ここはhideyosiの学習帳です。いろいろな資料を集めたり整理したりしています。オイラ用のノートなので間違っていたり未完成だったりしますので信用度は相当低いことをあらかじめご了承くださいませ。
3: 2007-12-01 (土) 17:12:35 ソース バックアップ No.3 を復元して編集 現: 2024-01-06 (土) 22:37:42 ソース 編集
Line 7: Line 7:
 よし! メモリを全部読んでみる実験だ!  よし! メモリを全部読んでみる実験だ!
 + 
 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に読んでみる
Line 29: Line 29:
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ビットじゃ、こんなに巨大な差があるんだ!
Line 74: Line 74:
       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
Line 81: Line 81:
                       ↓                        ↓
       MOV      AX,0xFFFFF  ;←こうしたのと同じことになる        MOV      AX,0xFFFFF  ;←こうしたのと同じことになる
 +
 +
 +''備考''
 +
 +例えば。ここに1MBを搭載したPCがある。で、なんらかの方法で0x12345番地に0x10を書き込んだとする。
 +
 +この場合、以下は同じ0x12345番地を読むことになる。
 + ;---- コードA ------------
 +   MOV    DS,0x1000      ;セグメントレジスタであるDSに0x1000を代入
 +   MOV    BX,0x2345      ;BXレジスタにオフセット値0x2345を代入
 +   MOV    AX,[DS:BX]      ;AXには物理的に0x12345番地の値(0x10)が入る
 +
 +
 + ;---- コードB ------------
 +   MOV    DS,0x1230      ;セグメントレジスタであるDSに0x1230を代入
 +   MOV    BX,0x0045      ;BXレジスタにオフセット値0x0045を代入
 +   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ビット時 ──── セグメント ──── マルチタスクでは必要だ!


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom
Counter: 4432, today: 2, yesterday: 0