The Art of Computer Programming を読む(5)
1.3.2 MIX アセンブリ言語から。
MIX Assembly Language, MIXALについて。
ほぼほぼMIXの機械語と同じだが、いくつか重要な違いがある。
・LOCにラベルがつけられる
・OPに、実際の命令ではない擬命令がある
・* (アスタリスク) という、自分のメモリ番地自体を示す記法がある
LOCにラベルがつけられる
これは、実際に機械語に翻訳された時点ではメモリの番地になっているはずだが、MIXAL上ではラベルをつけて、そのラベルを持ってメモリの番地の代わりとすることができるということ。アセンブラが機械語に翻訳するタイミングでメモリの番地に置き換えるのだろう。
機械語に翻訳するときメモリ上のレイアウトは他のルーティンにも影響を受けるため、他のルーティンを追加したらメモリの番地を書き直すというのでは非効率的だ。メモリの番地を直接使わずラベルをつけておくのは合理的だ。
OPに、実際の命令ではない擬命令がある
MIXの命令ではなくてMIXALの命令を擬命令と呼んでいる。EQUは、数値を記号にラベルづけする。C言語のマクロみたいなものだろうか。ORIGは、現時点では何をしているか明白ではないと思う。実例からは、次の実命令のアセンブル後のメモリ番地を指定してそうに見える。
* (アスタリスク) という、自分のメモリ番地自体を示す記法がある
自分とのメモリ中の相対位置を示す記法があると便利である。
とりあえず今日はここまで。
チューリングの理論というかノイマン型の命令とデータを区別せずにメモリにストアするという特徴を味わっている。
-----
自分の理解のためにも、演習問題の回答を残しておく。
1.
あるメモリの場所 (この番地をXとする) に値1000を設定するにはどうすれば良いか。
X EQU 1000
では、MIXAL上のXという記号を1000に置き換えよという擬命令なので、不十分であることは明らかである。
rAに1000をエントリーし、これをXにストアすれば良い。
ENTA 1000
STA X
2.
例示されたプログラムは、最後に JMP * という記述がある。これが「自分自身へのジャンプになってしまい永久ループになってしまう」ということがないのはなぜか。
プログラムをよく読むと、 STJ EXIT という記述がある。
MAXIMUM STJ EXIT
* ...
EXIT JMP *
これは、要はrJの値をEXIT番地にストアしているということである。実行時にEXIT行のアドレス部が書き換えられているのだ。元のrJにはもちろん、呼び出し元の「ジャンプがなければ次に実行されたであろう命令」の番地が書かれている。したがって、このルーティンは呼び出し元に戻り、コンピュータは呼び出し元の次の命令を実行することになる。
EXIT行に指定するアドレスは * ではなく 0 でもなんでも良いはずだが、プログラムミスなどで万一のことがありEXIT行のアドレス部が書き換えられなかった場合、変なところにジャンプされるよりは無限ループに陥る方がマシということだろうか。
この記事が気に入ったらサポートをしてみませんか?