全5回の予定で,アセンブラによるプログラミングを解説します。アセンブラを理解すると,コンピュータを見る視点がぐっと深くなります。この連載では,私が「なんでキャット」という猫の姿になり,担当のTデスクと一緒にアセンブラの世界をご案内しましょう。

矢沢 久雄グレープシティ

なんでキャット(以下,キャット):Tデスクはどんなプログラミング言語ができるのニャ?

Tデスク:C言語とJavaです。

キャット:な~んだ,高水準言語だけだニャ。アセンブラはできないのかニャ?

Tデスク:今どきアセンブラを使っている人なんてほとんどいませんよ。

キャット:確かにそうだけど,アセンブラを知っていれば,コンピュータの理解が深まり,高水準言語で記述するプログラムの品質も向上するんだニャ!

Tデスク:どうしてですか?

キャット:たとえば,「obj」というオブジェクトが持つ「myField」フィールドに10を加える処理は,Javaでどうやって記述するかニャ?

Tデスク:そんなの簡単ですよ。「obj.myField += 10;」でしょう。

キャット:それじゃあ,スレッドAとスレッドBがマルチスレッドで同じ処理を実行すると,「obj.myField」の値は,最終的にいくつ増えるかニャ?

Tデスク:10が2回加えられるんですから,20だけ増えます。

キャット:ところが,10しか増えない可能性もあるんだニャ。

Tデスク:え~っ,なんで,なんで? 教えて,教えて!

キャット:高水準言語で1行で記述されている処理であっても,コンピュータの動作として複数の処理になる場合があるからだニャ。

Tデスク:???

キャット:「obj.myField += 10;」という処理は,コンピュータにとって「現在のobj.myFieldの値をメモリからCPUに値を読み出す」,「CPUの中で10を加算する」,「加算結果をメモリのobj.myFieldに書き込む」という3つの動作になるんだニャ(図1)。

図1●1文のJavaコードでもコンピュータの動作は複数の場合がある
図1●1文のJavaコードでもコンピュータの動作は複数の場合がある

Tデスク:へえ~,そうなんだ。

キャット:もしも,スレッドAがobj.myFieldの値を読み出した直後にスレッドBに切り替わったら,スレッドBは更新前の同じ値を読み出すことになるニャ。それぞれのスレッドが同じ値に10を加えた結果をメモリに書き込むことになるから,10しか増えないことになるニャ

Tデスク:なるほど! でも,なんでそんなにスラスラ説明できるんですか?

キャット:えへん! それは,オイラがアセンブラを知っているからだニャ。アセンブラでは,コンピュータのハードウエアが動作する単位でプログラムを記述するんだニャ。

アセンブラで記述するプログラムこそが,本当のコンピュータの動作なんだニャ。

Tデスク:ぜひ,アセンブラを教えてください!(鰹節を差し出す)

キャット:OK! OK! それじゃあ,まずはハードウエアの構成要素から説明を始めるニャ。

データを「レジスタ」に格納

 この連載では,情報処理技術者試験の題材となっている「COMETII」という仮想のコンピュータを取り上げて説明する。COMETIIのハードウエアを構成する主要な装置は,3つある。「CPU」,「メモリ」,「I/O」だ(図2)。言うまでもなくCPUは,コンピュータの頭脳であり,プログラムを解釈・実行してコンピュータ全体の動作を制御する。メモリは,プログラム(命令とデータ)を記憶する。演算を行う場合には,メモリ内のデータを一旦CPUに読み出し,CPU内で演算を行い,その結果をメモリに書き込むことになる。I/Oは,キーボード,ディスプレイ,ハードディスクなどの周辺装置とコンピュータ本体を接続する。

図2●コンピュータの基本構成
図2●コンピュータの基本構成
CPU,メモリ,I/Oが,コンピュータを構成する主要な要素だ。I/Oは周辺装置とコンピュータ本体を接続する

 CPUとメモリ,I/Oは,それぞれ命令やデータを保持,格納する仕組みを備える(図3)。CPU内では「レジスタ」に命令とデータが格納される。COMETIIのレジスタには,「プログラムレジスタ(PR)」(プログラムカウンタとも呼ぶ),「スタックポインタ(SP)」,「フラグレジスタ(FR)」,および8つの「汎用レジスタ(GR0~GR7)」がある。レジスタのサイズはFRのみが3ビットで,他はすべて16ビットである。それぞれのレジスタの役割は後述する。

図3●COMETIIにおけるCPU,メモリ,I/Oの構成イメージ
図3●COMETIIにおけるCPU,メモリ,I/Oの構成イメージ
この連載で用いる仮想のコンピュータ「COMETII」において,CPU,メモリ,I/Oがデータを格納するイメージを示した。CPU内でデータを格納する場所はレジスタ。アセンブラは,レジスタとメモリの間で行われるデータのやり取りを操作する

 メモリの内部にも,命令とデータを格納するための入れ物が並んでいる。個々の入れ物の場所は,「アドレス(メモリアドレス)」と呼ばれる数値で識別される。CPUは,アドレスを指定してメモリを読み書きする。COMETIIのメモリ空間は,0番地~65535番地まで。1つの入れ物のサイズは16ビットだ。

 I/Oの内部にも,1個または数個のデータの入れ物がある。I/Oもアドレス(I/Oアドレス)で識別される。ただし,COMETII専用のアセンブラである「CASLII」では,OSのシステムコールを使ってI/Oを操作するので,プログラムから直接,I/Oのアドレスを指定した入出力を行うことはない。