2007年4月15日(日)は、何の日かご存知ですか?情報処理技術者試験(春期)が実施される日です。残すところ、後3カ月を切りました。現在、猛勉強中と言う人もいることでしょう。私は、情報処理技術者試験の試験区分の中で、基本情報技術者試験の講師をしています。多くの受講者が悩んでいるのは、午後のプログラミング言語の問題です。COBOL、C言語、Java、アセンブラ(CASL II)の中から1つを選択するのですが、プログラミング経験のない人は「どの言語を選べばよいか」ということから悩んでしまうようです。そんな人には、アセンブラをお勧めします。
なぜなら、アセンブラによって、プログラミングだけでなく、ハードウエアの仕組み、2進数によるデータ表現、論理演算など、様々なコンピュータの基礎知識を学べるからです。さらに、他の言語に比べて学習時間が短くて済むという魅力もあります。あっと言う間、というほどではありませんが、本当に短い時間でマスターできます。私の講師経験では、最短で2時間×3回で済んだことがあります。講座の一部(第1回の2時間の概要)をWeb上で再現してみましょう。基本情報技術者試験を受験されない人でも、アセンブラに興味があるなら、ぜひご覧ください。

アセンブラの特徴は、ハードウエアの動作をそのままプログラムに記述することです。したがって、アセンブラをマスターするには、ハードウエアの構成要素を知らなければなりません。
コンピュータというシステムは、「コンピュータ本体」と、キーボード、ディスプレイ、ハードディスクといった「周辺装置」から構成されています。コンピュータ本体の中には、CPU、メモリ、I/O(アイ・オー)があります。I/Oを仲介させて、コンピュータ本体と各種の周辺装置が接続され、データが入出力されます。メモリは、プログラムの命令とデータを記憶します。CPUには、データを演算する機能と、メモリとI/Oを制御する機能があります。

基本情報技術者試験は、国家試験なので、特定のメーカーのハードウエアを対象とすることができません。そこで、COMET IIと呼ばれる架空のハードウエアを対象としています。COMET IIでは、ハードウエアの構成要素としてCPUとメモリだけを考えればOKです。I/Oも存在するはずですが、I/Oを仲介させた周辺装置とのデータ入出力は、架空のOSのシステムコール(OSが提供する入出力用プログラム)を使って行われるとしています。
COMET IIのCPUの内部を見てみましょう。「レジスタ」と呼ばれるデータ格納領域があります。レジスタの種類には、GR0~GR7(GR=General Register、汎用レジスタ)、PR(Program Register)、SP(Stack Pointer)、FR(Flag Register)があります。これらのレジスタで、プログラムの中で使われるのは、GR0~GR7の8個だけです。PR、SP、FRがあるのは、それらが存在しないとCPUの機能が成り立たないからです。
レジスタとメモリの違いは、レジスタに格納されたデータは「演算できる」ということです。メモリは、単なる記憶装置であり、演算機能はありません。したがって、ハードウエアの動作は、「メモリのデータをCPU内のGR0~GR7のいずれかにコピーする」「CPU内で演算を行う」「演算結果をCPUからメモリにコピーする」の3つが基本になります。GR0~GR7のどのレジスタを使うかは、プログラマの判断に任されています。単純な処理は、1つのレジスタだけで実現できます。複雑な処理では、複数のレジスタが必要とされます。

今度は、CASL IIのメモリの内部を見てみましょう。プログラムを構成する命令とデータの格納領域が、たくさんあります。命令とデータを格納する「箱」が並んでいると考えてください。個々の箱には、識別番号が付けられています。これを「アドレス」と呼びます。アドレスは、0番地、1番地、2番地、・・・のように「番地」という言葉を沿えて呼ばれます。アドレスの範囲は、0番地~65535番地までです。

架空のハードウエアであるCOMET IIのための架空のアセンブラがCASL IIです。CASL IIの文法は、とても簡単です。構文は、たった1つしかありません。英語の命令文と同じで、「~せよ」を表す動詞に相当する単語と、「~に、~を」を表す目的語に相当する単語を順に並べるだけです。アセンブラでは、動詞を「オペコード」、目的語を「オペランド」と呼びます。
たとえば、GIVE ME MONEYという英語の命令文の意味はわかりますね。左から単語を訳すと「与えよ、我に、金を」です。CASL IIの構文も同じ順序で単語を並べます。たとえば、LD GR0, DATA1は、「LDせよ、GR0に、DATA1を」です。英語との違いは、目的語が2つある場合は、カンマで区切ることです。
目的語が2つある場合に、どっちがどっちに作用するかということも、英語とCASL IIで基本的に同じです。GIVE ME MONEYでは、MONEYをMEに与えますね。それと同様に、LD GR0, DATA1は、GR0にDATA1をLDします。2つの目的語が、後ろから前に向かって作用するのです。
CASL IIのオペコード(動詞)は、英語の略語になっています。LDは、Load(メモリからCPUにコピーすること)の略語です。LD GR0, DATA1は、「ロードせよ、CPU内のGR0レジスタに、メモリの中にあるDATA1番地のデータを」という意味です。

CASL IIのオペコードは、全部で28種類しかありません。問題を2~3問ぐらい演習すれば、ほとんどの命令にお目にかかることになるので、自然と覚えられます。28種類のオペコードは、「CPUとメモリでデータをコピーする命令」「CPU内で演算する命令」「プログラムの流れを変える命令」「その他」に大別できます。
プログラムの流れを変える命令は、条件分岐、繰り返し、およびサブルーチンコールのために使われます。その他の命令のNOP(No OPeration)は、何もしないものです。実際のCPUにもNOPがあります。SVC(Super Visor Call)は、OSのシステムコールを行うものです。「スーパーバイザー」とは、OSを意味しています。

これで、CASL IIの文法と、用意されている命令の種類がわかりました。仕上げとして、サンプルプログラムを見てみましょう。ここに示したのは、メモリ内にある123と456というデータをCPU内のGR0レジスタで加算し、その結果をメモリ内にコピーするプログラムです。プログラムの内容には、特に意味がありません。あくまでもサンプルです。
先ほど、アセンブラの構文は、オペコードとオペランドを順に並べるだけだと説明しましたが、実際には、行の先頭に「ラベル」、行の末尾に「コメント」が置かれる場合があります。
ラベルは、その行のアドレスを示す名前です。プログラムは、メモリにロードされて実行されます。その行が、何番地になるかは、ロードされるまで決定されなません。そこで、プログラムを記述するときは、番地の数値の代用としてラベルを付けておくのです。ラベルは、その行が参照される場合にのみ付けられます。プログラムの先頭、データが置かれている行、条件分岐の分岐先の行、繰り返しの戻り先の行などにラベルが付けられます。
このプログラムには、これまでに紹介した28種類の命令にはなかったオペコードがあります。START、END、DC、DSです。これらは、見かけ上は、通常のオペコードと同じに使われていますが、CPUに実行させる動作ではなく、プログラムの構造を作るための命令です。「擬似命令」や「アセンブラ命令」と呼ばれます。
STARTとENDは、プログラムの先頭および末尾を示します。DC(Define Constant)は、データの値を定義します。たとえば、DATA1 DC 123は「DATA1番地に123という値を定義する」という意味です。DS(Define Storage)は、データの格納領域を確保します。たとえば、ANS DS 1は「ANS番地にデータの格納領域を1箱確保する」という意味です。
コメントは、その行の説明です。試験問題のプログラムには、よほど難解な部分でなければコメントが付いていませんが、ここではすべての行にコメントを付けてみました。コメントを参考にすれば、プログラムを読むことができるでしょう。
このプログラムで、注目してほしいのは、DATA1番地とDATA2番地の値を加算するのに、「LD GR0, DATA1(GR0レジスタにDATA1番地の値をコピーする)」「ADDA GR0, DATA2(GR0レジスタの値とDATA2番地の値を加算する)」という処理を行っていることです。「2つの値を加算するなら、それらの値をGR0とGR1のように2つのレジスタにコピーして加算するのではないか?」と思われるかもしれませんが、そうではありません。CPUでは、加算と言うより集計と言った方がいい感じの演算が行われるのです。
これで、本日の講座は終了です。この先、どのようにアセンブラの学習を進めて行くかを説明しましょう。第2回の講座では、28種類の命令の意味を知ります。第3回の講座では、配列を使ったプログラミングテクニックと、サブルーチンコールのやり方を学びます。ここまマスターしたら、基本情報技術者試験に出題された過去問題にチャレンジできますよ!