全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のアドレスを指定した入出力を行うことはない。

この先は会員の登録が必要です。有料会員(月額プラン)は初月無料!

日経 xTECHには有料記事(有料会員向けまたは定期購読者向け)、無料記事(登録会員向け)、フリー記事(誰でも閲覧可能)があります。有料記事でも、登録会員向け配信期間は登録会員への登録が必要な場合があります。有料会員と登録会員に関するFAQはこちら