. = 0^.ここで「.」とは現在のアドレスのことである。 「^」は左辺の値、右辺の型をもつ結果を返す。 したがって「0^.」は「アドレス0」なので、 これは「現在のアドレスをアドレス0に設定する」ということになる。 「=」はC言語と同じく、破壊的代入をあらわす。 なお、0は0といっても、数字の列は.で終わらないかぎり8進数なので、 これは8進数の0である。
m40.sの冒頭、0604行目には別の使い方がある。
mfpi = 6500^tstこれはアセンブラーに組み込まれていないmfpiという命令を定義している。 オプションのメモリー管理機構に関する操作であるがここで詳細には触れない。 機械語のオペコードは006500である。
一方、tstは
tst +(r2)のように演算の対象をひとつ引数にとる。 オペコードは005700で、 このうち下6bitには演算の対象(オペランド)で指定したアドレッシングモードとレジスターが入る。
ここでtstの「型」とは、「演算の対象をひとつ引数にとる。 オペコードの下6bitには演算の対象で指定したアドレッシングモードとレジスターが入る」 という部分になる。 リファレンスではこの型の命令を単対象命令(single operand instruction)と呼んでいる。 命令の「型」もアセンブラーにおける「型」である。
したがって、mfpiは
mfpi +(r2)のように演算の対象をひとつ引数にとる。 オペコードは006500で、 このうち下6bitには演算の対象で指定したアドレッシングモードとレジスターが入る、 ということになる。 mfpiが実際にどういう働きをする命令か、 ということまではアセンブラーは関知しない。
このように、他の命令を雛形にあらたな命令を定義することができる。 他にどんな型があるのかを正確に知るには、 アセンブラのソースコードを参照する必要がある。
wait = 1という定義がある。 これも命令の定義なのだが、型の指定がない。
waitは演算の対象をもたないので、 オペコードの000001が命令として付け加わるだけである。 このように定数であるデータは絶対型(absolute)という。
mov $USIZE-1\<8|6,(r1)+この行を読み解くには、
*r1++ = (USIZE-1) << 8 | 6;となる。
ところが、これで納得するわけにはいかない。 第一、「\<」がシフト演算子であるとはどこにも説明がないからである。 マニュアルには「<<」はあるのだが、そういう記法は使われていない。 ソースコード(asそのものがアセンブラーで書かれている)を見ても、 「<<」は存在しないようである。
後の第7版のマニュアルでは「\<」がシフト演算子であるとの記述があるので、 やはりマニュアルの間違いだったようである。
mov $_u+[USIZE*64.],spはspに_u+USIZE*64を代入することになる。 カギカッコで括ると演算が優先される。
また、!377といった記法もよくみる。 実は!は前後に引数をとる二項演算子である。 このアセンブラーには
引数が省略されている場合は0があるとみなすという面妖な規則がある。 よって、!377は0!377ということになる。 a!bをC流に書くとa | ~bである。0 | ~bは~bに等しいので、 !bはbの論理否定ということになる。 a!bは数理論理学でいうa→bに相当するのだが、 とりあえず、そこまで深読みが必要な使われかたはしていないようだ。
なお、Lions本のm40.sにはプロシージャーごとの区切りとして
/* --------------------------- */というCのコメントのような行が挿入されている。 アセンブラーでは「/」以降の行末まではコメントとみなす。 よって、これもまた単なるコメントである。
これとは別にPAL-11Rという純正アセンブラーがあって、 UNIXのアセンブラーはこちらを踏襲している。 形式は似せてあるが、プログラムとして直接の関係はないらしい。
なお、純正アセンブラーでは間接モードの指定は「@」、即値モードの指定は「#」を使う。 UNIXではそれぞれ「*」「$」である。 当時のUNIXでは行削除として「@」を、一文字削除として「#」を編集用の記号に使っていた。 こういった文字をエディタでうっかりそのまま入力しようとしても、 入力した行や前の文字が抹消されてしまう。 そういうわけで「@」や「#」を回避したのであろう。
この編集方式はMulticsにまでさかのぼる。 C言語の間接演算子が「*」であることや、 「@」や「#」が言語内に登場しないのもこのあたりに由来がある。 のかもしれない(無保証)。
画面と平行に鏡を立てるとどうなるか、という疑問もあるが、
視点から見て画面の手前に立てても後ろに立てても像を結ばない。 よって場合分けから除外される。というのが一応の答えであろう。