Whirlwindのアセンブラ
Whirlwind(WWI)が作成された当時は、まだコンピューターのプログラムは「2進数で」作るのが当然でした。
一応、人間が考えやすいように、機械語(2進数)を、1対1対応で英語の意味で表記した「アセンブリ言語」は存在します。
そのアセンブラ言語から機械語に翻訳する作業を「アセンブル」と言います。ひたすら英文字を対応する数字に変換するだけの退屈な作業。まさにコンピューター向けの作業で、当然現代ではコンピューターがアセンブル作業を行います。
しかし、まだコンピューターの命令が「どうあるべきか」すら手探りだった WWI の時代、アセンブルは人間の仕事です。
アセンブリ言語でプログラムをつくり、アセンブルしてコンピューターを動かす…。この過程で、コンピューターにあれば便利そうな機能のアイディアが出てきて、コンピューター自体が改良される。
WWI にはどんどん便利な機能が追加され、ついには、「アセンブル作業」自体をコンピューターにやらせることになります。アセンブラの登場です。
目次
初期の表記
当初はハンドアセンブルです。とはいえ、作られたサブルーチンは別の人もつかう…つまり、「自分のプログラムに組み込んでハンドアセンブルする」かもしれないので、ある程度の統一は行われています。
しかし、人間が読めればよい、という程度なので、スペースの入れ方や、括弧( )の使い方などは人により異なります。
基本的に、アセンブラは次の表記で書かれています。
アドレス 命令 対象アドレス コメント
基本的にはスペースで区切られますが、命令と対象アドレスの間に、スペースが入らない場合もあります。
具体例として、1952年初頭に作られた、サブルーチン集冒頭のプログラムを引用します。(著作権は MIT にあるはずです。)
アドレス表記
対象アドレス表記が、少し特殊です。
これは、意味合いからアドレスが4種類に分別されるためです。
1番目。「サブルーチン内での」アドレス。左端に書かれるアドレスと同じです。
通常は 0 から始まります。しかし、サブルーチンが実際にどこのメモリに置かれるかにより、実際のアドレスは異なります。
つまり、サブルーチン内でのアドレスは、アドレスというよりは「行番号」だと考えたほうがよいでしょう。
対象アドレスとしてサブルーチン内アドレスを使用する場合は、最後に r を付けます。相対位置という意味の relative か、WWI はメモリをレジスタと呼んだので register の意味か…
ジャンプアドレスに多用されますし、サブルーチン内でデータを用意している際には、データアクセスもこの形式で行われます。
2番目。一時的な変数などを使用したい場合には、そのメモリはどこに確保されてもかまいません。プログラム中に明記する必要もありません。
そこで、対象アドレスとしてこれらの「テンポラリ」を表記する方法があります。
変数を区別するための数字の後ろに t を付けます。temporary の t でしょう。1t 2t 3t のように表します。
数字が連続していても、連続アドレスであるという意味ではありません。個々の変数は独立したものです。
また、変数を1つだけ使いたい場合に d という表記もありました。この場合は、数字は付きませんが、同じ意味です。
3番目。サブルーチンに渡す引数として、データをメモリに入れてある場合の書き方です。
テンポラリと違い、サブルーチン開始時には値が入っていることが前提です。しかし、テンポラリと同じく、メモリのどこにあるかはわかりません。
この場合、ax と記述します。複数ある場合は、2ax 3ax …と続きます。
4番目。シフト命令などでは、「アドレス」ではなく「数値そのもの」を使用します。
この場合、後ろに r t ax などを付けず、数値そのものを使用します。
上に挙げたプログラムでは、先頭行から 19r 1t 20r などのように、r と t のアドレス表記が多用されています。
4行目の qp は、アドレスではなく数値を使用する命令です。144 は数値そのものを意味しています。
データ表記
先のプログラムで、24行目以降はデータテーブルになっています。
ここで、25行目以降に p4 というような表記が並びます。
実は、ここではスペースが省略されています。 p が命令、4 は数値です。34行目だけ少し特殊で、p26r となっています。これも、p 命令に 26r というアドレスを渡している、ということ。
実は、p は WWI の命令ではありません。アセンブラの表記上の指示で、「このアドレスにはデータを置く」という意味です。(put とか parameter とかかな?)
こうした、コンピューターの命令ではないが命令のようにアセンブラに書かれる命令を「擬似命令」と呼ぶのですが、この時代にはまだそうした概念がなかったようです。
命令と数値・アドレスの間にスペースが入っていない、というのも、命令のようで命令でない…ということと無縁ではないのでしょう。
ともあれ、データを明示的に置く際には、このように p を使用します。
ただし、この方法は「11bit」までのデータに限られたようです。アセンブラのアドレス部分は 11bit なので、アドレスにせよ数値にせよ、11bit で扱うのが決まりだったのでしょう。
16bit を置きたい場合は、違う方法を使います。24行目に書かれた 0.77777という表記がそれです。
小数点表記を使用した場合、そのアドレスの 16bit を、1bit づつ自由に指定できます。
小数点以下の5桁は、実は8進数。1桁が 3bit を示します。5桁なので 15bit 。そして、整数部分は 0 か 1 で 1bit です。全部合わせて 16bit。
この方法では、16bit 全部を表現できるので命令部分の指定などもなくなります。そのため、データを置くにもかかわらず、p 命令もないわけです。
その他の表記
これ以外の記述法については、ユーザーによって自由にルールを決めているようです。ハンドアセンブルですから。
画像で示したプログラムは、13 行目と 19 行目の命令を ( ) で括っています。これは、別の命令によってアドレスが書き変えられるよ、という意味。書き変わるのは命令ではなくアドレスなので、アドレス部分のみに ( ) を付ける人もいます。
4行目の左側に 23r → と書いてあるのは、4行目が23行目のジャンプ先になっているよ、という意味。
qp 命令の左に縦線が(手書きで)引いてあるのは、ちょっとしたハックを使っているので注意せよ、という意味のようです。(ハックの詳細は後述)
2、16、19、23行目には、下線が引いてあります。2、16 は破線で、19、23は実線です。
これは、ジャンプ命令があるのでこの下にはいかない可能性がある、ということです。実線は無条件ジャンプなので、絶対に行かない。破線は条件ジャンプなので行く場合もあります。
あとは、人によって書き方がまちまち。書き換えられる箇所を ( )ではなく、ジャンプのように行番号と矢印(ただし破線)で示す人もいます。
あと、コメントに時々みられる「plant」は、自己書き換えの意味です。データを「植える」のですね。
MRA は Multiple Register Accumulator の略。単にアキュムレータの意味です。
メモリ上にデータ領域を作って、アキュムレータが複数あるようなふりをしてプログラムするテクニックをこう呼んだみたい。