IA-16
読み:アイエイじゅうろく
外語:IA-16: Intel Architecture 16
Intel
x86
シリーズにおける、当初の16ビットアーキテクチャーの、Intel非公式の俗称。
目次
概要
特徴
呼称
セグメント方式
アドレッシング方法
ポインター
概要
8086
から存在する、もともとの動作モードである。
32ビット化されて以降も、互換性のため機能が維持された。むしろ、いかにして互換性を維持しながら32ビット化するかに心血が注がれていた。
64ビット化されても一応残されてはいるが、32ビット動作モードに存在した
仮想86モード
は、64ビット動作モード(AMD64 ISA/Intel 64)には存在しない。もはや過去の存在である。
特徴
呼称
16ビットしかない頃はこのような呼称はなく、32ビットのi386が登場し32ビットOSが普及し始めた頃も「
リアルモード
」や「
仮想86モード
」など動作モードで呼ばれており、このような呼称はなかった。
Intelが「
Itanium
」(
Merced
)用アーキテクチャーを「
IA-64
」と呼び、従来の32ビットアーキテクチャーを「
IA-32
」と呼んだことが全ての始まりである。
16ビットは既に過去の存在と考えたか、特にIntelから呼称は与えられなかったが、当然の帰結として、このように呼ぶと便利なことから俗称としてIA-16という俗称が生まれ使われるようになった。
セグメント方式
アドレッシング方法
16ビット動作モードでは「
セグメント:オフセット
」という特殊な形式でアドレッシングが行なわれていた。おのおの16ビットであり、セグメントは16倍して加算されるため、総計で20ビット(1Miバイト)のアドレッシングが可能だった。
セグメントはセグメントレジスターと呼ばれる専用レジスターが用意され、メモリーアクセス時にセグメントレジスターをつければ20ビットでアクセスでき、さもなくば16ビットの範囲内のみでアクセスできた。
但しセグメントを指定するとプログラムサイズが増え、かつまた処理速度も遅くなるため、必要時以外はセグメントを指定しない、という使い分けが必要だった。
ポインター
C
で、このアドレッシング方式をポインター変数として実現する必要があったが、Cの標準仕様の範囲内では不可能だったため、特殊な方式が使われた。以下のように呼ばれている。
nearポインター
(セグメント無しのポインター)
farポインター
(セグメント付きのポインター)
hugeポインター
(見かけ上リニア方式のアドレッシングを提供するポインター)
このポインターを区別するため、
far
/
near
/
huge
というCの規格外となる独自の予約語を定義し、以下のように使用した。
unsigned char
near *np;
unsigned char far *fp;
unsigned char huge *hp;
規格の流儀に則るならば、__far や __near などとするべきだったが、最初にこの方式を考案したCコンパイラー実装者(おそらくMicrosoft)が作った仕様は、他と互換性がなくなる方式だったようである。
再検索