戻る コンピュータのしくみ  2.仮想コンピュータ



コンピュータのしくみ 1.手動計算機 のページで紹介した演算回路やメモリ、 スイッチを組み合わせた手動計算機で、 とりあえず 「計算」 ができることは分かりました。

しかし、 スイッチをひとつひとつ手で動かすのは面倒だし間違えることもある、 時間だってかかります。
あらかじめ決めておいた手順通り、 スイッチが自動的に動いてくれたら素敵です。

というわけで、 あの 「手動計算機」 に自動的にスイッチを動かすしくみを付け加えると 「コンピュータ」 になります。 それを動かすために 2 進数でコード化した一連の操作の手順が 「プログラム」 です

下の Java アプレットは、 プログラムによってスイッチを自動的に動かすようにした 「自動計算機」、 すなわち 「コンピュータ」 です。





いま、 このコンピュータに "123 + 45" という加算をさせることにします。
下の "STORE 14, 123" から "END" までがそのプログラムです。
これをマウスでドラッグしてコピーし、 "Assembler Program" と書かれているテキストエリアに ペースト (貼り付け) して下さい。
右端の "LOAD" ボタンをクリックすると、 アセンブラプログラムが機械語に変換されて書き込まれます。
メモリの一部の表示が変わって "Assemble completed." というメッセージが表示されれば、 準備完了です。

	STORE 	14, 123
	STORE	15, 45
	
	READ	14	; 123 → Acc
	ADD	15	; Acc + 45 → Acc
	OUT		; Acc → output port
	
	END
	
最初に "STORE …, … " というプログラムが 2 行ありますが、 これはコンピュータの命令ではなく、 プログラムを読み込む段階で処理される疑似命令です。 これによってメモリの 14、15 番地には、 あらかじめ 123 と 45 (2 進数では 01111011 と 00101101) というデータが書き込まれます。
実際のプログラムは "READ 14" からです。
また、 緑色で表示されている部分、 "; 123 → Acc" 等はコメントで、 プログラムの内容などがヒトに理解されやすいように書かれた注釈です。 アセンブリ言語では ";" (セミコロン) 以降はコメントと見なされます。 コメントも一緒にコピー & ペーストしても差し支えありません。




上の Java アプレットの右下方にある "STEP" ボタンをクリックすると、 このコンピュータの命令を 1 ステップずつ進めることができます。

クリックすると、 まず最初の命令、 "READ  14" が命令レジスタ (Instruction Register) に読み込まれます。 (コンピュータが命令を読み込む期間を フェッチサイクル (fetch cycle) といいます。)
コンピュータが最初にする仕事は、 14 (E) 番地のメモリのデータを読み込むことだということが分かります。
もう一度 "STEP" ボタンをクリックすると、 命令が実行されます。 (命令を実行する期間を 実行サイクル (excute cycle) といいます。)
14 番地に書き込まれているデータ、 "01111011" がアキュムレータ (accumulator:累算器) に読み込まれます。
これで最初の命令、 "READ  14" の処理が終わりました。

もう一度 "STEP" ボタンをクリックすると、 "ADD 15" が命令レジスタに読み込まれます。 これはアキュムレータのデータに メモリの 15 (F) 番地に書き込まれているデータを加えて、 その結果をアキュムレータに書き込みなさいという命令です。
"STEP" ボタンをもう一度クリックするとこれが実行されます。
14 番地と 15 番地のメモリに書き込まれていたデータが加算されます。

次の "OUT" はアキュムレータのデータを出力ポートに出力する命令です。 実行すると出力ポートにはアキュムレータのデータ、 "10101000" が書き込まれます。
"10101000" は 10 進数に変換すると 168 です。 123 + 45 という計算の結果が出力されたわけです。




下の例は 1 〜 10 の整数の和を求めるプログラムです。
計算が終わるまで少し時間がかかりますが、 出力ポートに "00110111" というデータを出力して止まります。

	STORE	15, 10	; 10 → M(15)
	CLR		; 0 → Acc

LOOP:	ADD	15	; M(15) + Acc → Acc
	DEC_M	15	; M(15) - 1 → M(15)
	JNZ	LOOP	; if M(15) <> 0, jump to LOOP

	OUT		; Acc → output port
	END





この仮想コンピュータについて、 詳しくは

仮想コンピュータの使い方
アセンブラ仕様
命令セット
命令
プログラム例

などのページをごらん下さい。
なお、以上をまとめて PDF ファイル にしたものも用意してあります。
腰をすえて考えてみようという場合は、 ダウンロードして印刷することをおすすめします。
ぜひプログラム作りにチャレンジして下さい。




情報処理概論 に戻る   目次 に戻る  戻る  


このページの 「仮想コンピュータ」 は、 コンピュータのしくみを理解するのに必要な最小限の機能のもの、 という意図で作りました。
仕様やバグ等、 お気づきになった点がございましたらご一報下さい。

Java applet 圧縮アーカイブファイル    自由利用マーク
update: 2012.10.12  address