コンピュータのしくみ 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 ファイル にしたものも用意してあります。
腰をすえて考えてみようという場合は、 ダウンロードして印刷することをおすすめします。
ぜひプログラム作りにチャレンジして下さい。