戻る 仮想コンピュータ  (アセンブラ プログラミング)


コンピュータが理解できるプログラミング言語 (programming language) は 機械語 (machine language) だけですが、 機械語と1対1で対応して記述するプログラミング言語をアセンブラ (アセンブリ) 言語 (assembler language) といい、これを用いて作成されたプログラムを アセンブラ プログラム (assembler program) といいます。

機械語はコンピュータ (CPU) のハードウェアと密接な関係がありますから、 アセンブラ言語も CPU に依存しています。 従って、CPU が変わればアセンブラ言語も変わります。 原則として、CPU 毎にそれぞれのアセンブラ言語があります。

アセンブラ言語は機械語と1対1で対応していますから、 アセンブラ言語を学ぶことは、コンピュータを理解する近道でもあります。
しかし、一般的なコンピュータは構成が複雑で、アセンブラ言語も複雑ですから、 アセンブラ言語を学ぶこと自体が回り道になりかねません。 ここでは、極限近くまで単純にした 「仮想コンピュータ」 を使って、アセンブラ言語を学ぶことにします。 コンピュータの命令は 26 種類しかありません。


詳しいことは、

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

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




とりあえず "123 + 45" という加算をさせてみることにします。
次の "STORE 14, 10" から "END" までがそのプログラムです。
これをマウスでドラッグしてコピーし、 "Assembler Program" と書かれているテキストエリアに ペースト (貼り付け) して下さい。
これで、プログラムの準備が終わりました。

STORE 	15, 123
STORE	14, 100

READ	15	; 123 → Acc
ADD	14	; Acc + 100 → Acc
OUT		; Acc → output port

END

"LOAD" ボタンをクリックするとアセンブラプログラムが機械語に変換されて読み込まれます。 メモリの一部の表示が変わって "Assemble completed." というメッセージが表示されれば、準備完了です。

最初に "STORE" で始まる命令が 2 行ありますが、これはコンピュータが実行するプログラムではなく、 プログラムを読み込む段階であらかじめ処理される疑似命令です。 "LOAD" が済むとメモリの 14、15 番地には "00101101"、"01111011" (10進数では 45 と 123) というデータが書き込まれています。 コンピュータは、このふたつの数値データを加算処理します。

右下の "STEP" ボタンをクリックして下さい。





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

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

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


なるほど確かに計算はできたけれども、それにしてもたかが足し算ひとつになんと面倒な、と思われるかもしれません。 電卓なら、「1」「2」「3」「+」「4」「5」「=」 とキーを押すだけで答えが出ます。
── しかし、電卓も、外からは見えませんが、内部では同じようなプログラムによって計算されているのです。



下のプログラムは 1 〜 10 の整数の和を求めます。 計算が終わるまで少し時間がかかりますが、出力ポートに "00110111" というデータを出力して止まります。 これは アセンブラ言語 (Z80 プログラム例) のページのプログラムを、 この仮想コンピュータ用に書き換えたものです。

	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

プログラム例 のページにもう少しプログラムがありますから、そちらも試して下さい。
そして、ぜひ、プログラムを作ることにもチャレンジして下さい。 自分で作ったプログラムが思った通りに動いたとき、きっとコンピュータとはどういうものかが理解できると思います。



情報処理概論 に戻る   講義資料 に戻る   戻る  

このページの 「仮想コンピュータ」 は、コンピュータのしくみを理解するのに必要な最小限の機能のもの、 という意図で作りました。
まだまだ完成の域には達していませんが (特に、プログラムのエラーチェックが不十分、など)、 少しずつ修正していこうと考えています。 仕様やバグ等でお気づきになった点や、このコンピュータのためのプログラムを新たに作った、 というようなことがございましたら、ぜひご一報下さい。

自由利用マーク
update: 2008.02.12  address