The Art of Computer Programming を読む(7)

(5) の続きから。

アルゴリズムP (500の素数の表を印刷する)

素数列挙プログラムを通じてMIXALを学ぶ。

ローカルシンボル
今いる行から一番近い行を指示することができる。プログラム内で複数の同じシンボルを扱うことができ、記号名の取り扱いの煩雑さからプログラマを解放する。

ALF
MIXの5バイトの定数を作るが、その時に文字コードを利用する擬命令。

ORIG
ここに来て意味がわかるようになった。MIXアセンブラが解釈するロケーションカウンタの値をアドレス欄の値にセットする擬命令。

ロケーションカウンタ
MIXアセンブラが書かれたMIX命令を解釈する時、このカウンタの値に命令を書き込む。

二項演算 //
見慣れない命令だが、上位5バイトに対して割り算をする擬命令と思えば良いだろうか。下位5バイトには0が詰め込まれる。
1//3の値は、バイトが10なら10000/3と同じになる。バイトが2なら2^5/3と同じになる。

EQU
アセンブラ上でのみ有効な定数を定義する擬命令。マクロのようなもの。MIX命令は生成しない。

CON
MIXプログラム上で利用する定数を、ロケーションカウンタの値に生成する擬命令。

これで一通りMIXALの説明を読み終わった。また演習問題を解いていく。

3.

最大値を求めるプログラムMに続けて次のプログラムを実行するとどうなるか?という問題。

START IN   X+1(0)
      JBUS *(0)
      ENT1 100
1H    JMP  MAXIMUM
      LDX  X,1
      STA  X,1
      STX  X,2
      DEC1 1
      J1P  1B
      OUT  X+1(1)
      HLT
      END  START

順に一つ一つ見ていく。

START IN  X+1(0)
JBUS  *(0)

IN命令は、Fパートのユニットからユニットごとに決められたワード数だけ指定されたアドレスに転送するのであった。Xは元のプログラムMで EQU 1000 と定められている。したがってこれは「0番テープの100ワードを1001-1100番地に転送する」という命令になる。
JBUS命令は、Fパートで指定されたユニットがビジーならジャンプする。ロケーションカウンタ*により自分自身へのジャンプなので、これは「0番テープがビジーでなくなるまで無限ループする」という命令になる。

ENT1  100

元のプログラムMでは、rI1は「最大値を求める対象の要素数」を表していた。今回は1001-1100なので100が正しい。

1H JMP  MAXIMUM

MAXIMUMは元のプログラムPの開始番地になっている。したがって、ここでプログラムPにジャンプしている。
プログラムPの呼び出しが終わった後、rAには最大値が、rI2には最大値を与える値のメモリの番地がセットされる。

LDX  X,1
STA  X,1
STX  X,2

X,1は「1000をrI1で修飾したメモリの番地」である。今rI1は100なので、LDX X,1は「1100番地の値をrXにロードする」命令となる。
その後、rA、つまりプログラムによって与えられた最大値が1100番地に格納される。rXにロードされていた元々の1100番地の値は、「1000をrI2で修飾したメモリの番地」、つまり最大値を与えるメモリの番地にストアされている。

DEC1 1
J1P  1B

rI1の値を1減らし、rI1が正ならこれをもう一度繰り返す。

rI1が100から99にデクリメントされて再度実行される様子を考えると、今度は99個の要素から最大値を探し、その値がrAに、この値を与えるインデックスがrI2に格納される。
その後、1100番地の時と同様に、1099番地の値と最大値が交換される。
これを繰り返すと、1001番地から1100番地の値が昇順にソートされることがわかる。

OUT X+1(1)
HLT
END START

OUT命令は書き出しだ。今度はテープユニットの1番テープに、1001-1100の100ワードを転送している。

したがって、まとめると
0番テープの100ワードが、昇順にソートされて1番テープに書き出される
となる。

問題4の手動アセンブルも面白そうなのだが、遅い時間になってしまったのでまた次回にする。

この記事が気に入ったらサポートをしてみませんか?