基礎的な話

CPUの動作は フェッチ,デコード,実行の3フェーズ

CPUの動作は,基本的には次の3つの動作(フェーズ)の繰り返しになっている.

# フェーズ
(1) fetch(命令の読み込み)
(2) decode(命令の解読)
(3) execute(命令の実行)

マシン語命令は大別するとロード,ストア,演算の3種類しかない

マシン語命令には根本的には次の3種類の命令しかない.

# 命令の種類
(1) load.メモリおよびI/Oからレジスタへの転送.
(2) 演算.
(3) store.レジスタからメモリまたはI/Oへの転送.

バス

実行される命令の種類には,演算,演算結果によるプログラム実行の制御(分岐など), 演算結果などのデータ転送,外部とのデータの入出力などがある. その中にはCPU内部だけで実行できるものと,外部とのやりとりが必要になるものがある. 外部とのやりとりが必要な場合は,CPUは決められた手順にのっとって, アドレスバスに信号をのせたり,データバスから信号を読みとったりする.

バスにはアドレスバスとデータバスの2つがある. アドレスバスで書き込む(読み込む)メモリ位置を指定し,データバスにデータをのせる. I/Oについてもメモリの場合と同様,アドレスバスにI/Oポートのアドレスを出力してから, データバスにデータを出力するかデータバスからデータを読みとる. 現在のマイクロプロセッサはすべてバスの概念を使っているが, マイクロプロセッサが登場する以前は, 特定のI/Oに専用のデータ信号線が結線してあることが多かった. バスの概念によってメモリやI/Oはアドレスやデータがのる信号線を共有することができるようになり, 信号線の本数を大幅に減らすことができるようになった. また,バスの概念はシステムの拡張性を高めることにも役立つ. バスという共通の入出力方法を定めることで, システムに新たなI/O装置を追加することができるようになった.

8086ではポートは最大65536個まで設定することができる. CPUとI/Oポート(すなわち装置)とのやりとりは,20本のアドレスバスのうち下位6本を使って, 0000〜FFFFまでのポートを識別するようになっている. メモリアクセスの場合は20本全部をフルに使って,000000〜FFFFFFまでの1MBのアドレスにアクセスできる. メモリにアクセスする場合もI/Oポートにアクセスする場合も同じアドレスバス, データバスを使用するが, どちらにアクセスするかを区別するための信号がアドレスとともに出力されるようになっていて, ハードウェア的には切り替えがかかっている.

モトローラの68000系のCPUの場合,メモリとI/Oは区別がなく, メモリアクセスとI/Oアクセスを切り替える信号線も存在しない. 68000の場合は,I/Oポートというものが存在せず, ある特定のアドレスにアクセスするとI/Oにアクセスできるような仕組みになっている. この方式をmemory mapped I/Oと呼んでいる. これに対してインテルの方式をI/O mapped I/Oと呼んだりする. モトローラ方式の利点はI/O装置へのアクセスをメモリアクセスとまったく同じ命令で実行できること, インテル方式の利点はメモリ空間に制約が加わらないこと.

セグメント方式についての考察

セグメント方式自体は仮想記憶の実現の面でも都合がよく,特に問題のある方式ではない. しかし,8086〜80286までのCPUでは,ひとつのセグメントの大きさが最大64KBと決まっており, この最大値の小ささが問題である. 大きなデータを扱おうとした場合,セグメント切り替えの操作が必要になり面倒.


はたいたかし
May 5, 2006.
トップ > 開発ツール > 8086