CASLIIに入門するぞ。
えっと昨日は早朝から独立行政法人情報処理推進機構のサイトにある、CASLⅡシミュレータをダウンロードして遊んでみました。
CASLIIというのは情報処理推進機構が作った(のだと思う)ヴァーチャルなシステムCOMETⅡのためのアセンブラ言語です。
どんな物かというとまあこんなもので、右側のSTART とか書いてある文字列の部分がプログラムで、エディタで書いてコンパイルする点は他の言語と同じ。
−−−−−−−−−−−−−−−
メモリの内容 ________ | 行 | ラベル | オペコード | オペランド |
---|---|---|---|---|
12: | MULS | START | BEGIN | |
0000:FF07 | 13: | BEGIN | RPUSH | __ |
0002:1030-0018R | 14: | _ | LD | GR3,A |
0004:1020-0019R | 15: | _ | LD | GR2,B |
0006:1000-001AR | 16: | _ | LD | GR0,=0 |
0008:5320-0001 | 17: | LOOP | SRL | GR2,1 |
000A:6600-0010R | 18: | _ | JOV | ADD |
000C:6300-0015R | 19: | _ | JZE | FIN1 |
000E:6400-0011R | 20: | _ | JUMP | SHIFT |
0010:2403 | 21: | ADD | ADDA | GR0,GR3 |
0011:5030-0001 | 22: | SHIFT | SLA | GR3,1 |
0013:6400-0008R | 23: | _ | JUMP | LOOP |
0015:FF08 | 24: | FIN1 | RPO | _ |
0017:8100 | 25: | _ | RET | _ |
0018:0009 | 26: | A | DC | 9 ; 2進数 1001 |
0019:0005 | 27: | B | DC | 5 ; 2進数 101 |
_ | 28: | _ | END | _ |
001A:0000 | 29: | =0 | DC | 0 |
Label:=0 | Def(Loc): 29(001A) Ref: 1
Label:A | Def(Loc): 26(0018) Ref: 14
Label:ADD | Def(Loc): 21(0010) Ref: 18
Label:B | Def(Loc): 27(0019) Ref: 15
Label:BEGIN | Def(Loc): 13(0000) Ref: 12
Label:FIN1 | Def(Loc): 24(0015) Ref: 19
Label:LOOP | Def(Loc): 17(0008) Ref: 23
Label:MULS | Def(Loc): 12(0000) Ref:
Label:SHIFT | Def(Loc): 22(0011) Ref: 20
END CASLⅡ Assembler.
−−−−−−−−−−−−
CASという拡張子のファイルをCASL2でコンパイルして、objファイルが出来たらRUNする、というわけだが初級レベルのものは何も出力しないので何も面白くない。
CASL2でコンパイルするときに、-a というパラメーターを付けると上記のようなログのような物がでてくる。*1
これを1ビットずつ舐めるように観賞していくのが、CASL2の楽しみ方です。
0002:1030-0018R 14: LD GR3,A
例えば3行目の上記、1030-0018Rは、右の言語「 LD GR3,A」をそのまま翻訳したものなのです。とてもそうは思えませんよね。C言語とかの世界でも数字と文字列は峻別されています。でももちろんそうであってはコンピュータというものは動かないので、それは隠されているだけで文字だけでなくコマンドもすべて数字に置き換えられてコンピュータの中では動いているわけです。私達の命令が数字に置き換えられているわけではなく、莫大な数のビットをひとまず2進数と読みそれを操作しそれをまた私達の分かる言葉に翻訳しているだけですね。
でとにかく、LDというのはload(ロード)ですね。A(下を見ると分かるが9が入っている)を汎用レジスタの3番*2に入れろというわけです。
1030-0018R の10はLDを意味し、その次の3は汎用レジスタの3番を意味します。で下を見ると分かるがメモリの18番地にAは入っているのです。*3
1030というただの数字が3番レジスタにロードせよという意味とはね。とほんの少し驚くことができるわけです。
(ところでこれはかけ算のプログラムで、9*5をやっています。答えは16進法で2D。苦労してGR0を覗いてみると「2D」になっていました。でも合ってるかどうか苦労しないと分からないのは困ったものだ。)
というかまだ全然よく分かっていないのですが、勉強のきっかけになるかと思い書いてみました。