1 \input texinfo @c -*-texinfo-*-
4 @settitle YACASL2 -Linux上のCASL2処理系-
8 Copyright @copyright{} 2010 j8takagi
15 @c Output the table of contents at the beginning.
22 @cindex chapter, first
24 YACASL2は、Linux上で動作するオープンソースのCASL II処理系です。CASL IIは情報処理試験で用いられるアセンブラ言語で、次の資料により仕様が公開されています。
27 @uref{http://www.jitec.ipa.go.jp/1_00topic/topic_20081027_hani_yougo.pdf, 試験で使用する情報処理用語・プログラム言語など(2008年10月版)}[PDFファイル]
31 YACASL2は、CASL IIアセンブラ言語で記述されたファイルをアセンブルし、仮想マシンCOMET II上で実行します。アセンブルと実行は、連続で行うことも別々に行うことも可能です。
32 YACASL2の動作はCASL IIの仕様に準拠しているため、情報処理試験の問題をはじめ各種参考書やサイトに記載されたCASL IIのプログラムをそのままアセンブルして実行できます。また、本パッケージ中にCASL IIのサンプルプログラムが多数収録されています。
34 YACASL2は、「ふつうの処理系」として動作します。ほかの多くのCASL IIエミュレーターと違い、デバッガーとして動作したり、コンピューター内部の模式図を表示したりすることはありません。そのかわり、YACASL2は、次のような動作内容をすべてテキストで出力します。
51 出力された動作内容は、GNU/Linuxのさまざまなツール、たとえば@command{head}、@command{tail}、@command{grep}、@command{diff}などを使って解析できます。
54 YACASL2は、Linux上で動作します。インストール時に、@command{tar}、@command{gcc}、@command{make}が必要です。
56 現在動作を確認しているのは、次のディストリビューションです。
61 Ubuntu Linux 9.04 / 8.04
67 @chapter YACASL2のインストール
69 YACASL2をインストールするには、Linux上で次の作業をします。
74 @file{yacasl2.tar.gz}のダウンロード
77 @file{yacasl2.tar.gz}の検証
80 @file{yacasl2.tar.gz}の展開
83 @command{casl2}、@command{comet2}、@command{dumpword}のビルド
95 以下の操作は、端末を開きコマンドを実行します。
97 @section @file{yacasl2.tar.gz}のダウンロード
102 $ @b{wget somewhere/yacasl2.tar.gz}
103 $ @b{wget somewhere/yacasl2.tar.gz.md5sum}
106 @section @file{yacasl2.tar.gz}の検証
109 ダウンロードが完了したら、@command{md5sum}と@command{diff}で正しくファイルがダウンロードができているかを検証します。
112 $ @b{md5sum yacasl2.tar.gz | diff -s yacasl2.tar.gz.md5sum -}
113 Files yacasl2.tar.gz.md5sum and - are identical
116 @section @file{yacasl2.tar.gz}の展開
117 @file{yacasl2.tar.gz}をダウンロードしたら、次のコマンドで展開します。
120 $ @b{tar xvzf yacasl2.tar.gz}
123 @section @command{casl2}、@command{comet2}、@command{dumpword}のビルド
124 展開したら、次のコマンドで@command{casl2}、@command{comet2}、@command{dumpword}をビルドします。
130 make[1]: Entering directory ‘/home/kazubito/yacasl2/src’
131 gcc -c -g -Wall -I ../include casl2.c
132 gcc -c -g -Wall -I ../include word.c
133 gcc -c -g -Wall -I ../include hash.c
134 gcc -c -g -Wall -I ../include cerr.c
135 gcc -c -g -Wall -I ../include struct.c
136 gcc -c -g -Wall -I ../include cmd.c
137 gcc -c -g -Wall -I ../include assemble.c
138 gcc -c -g -Wall -I ../include token.c
139 gcc -c -g -Wall -I ../include label.c
140 gcc -c -g -Wall -I ../include macro.c
141 gcc -c -g -Wall -I ../include exec.c
142 gcc -c -g -Wall -I ../include dump.c
143 gcc -g -Wall -I ../include -o ../casl2 casl2.o word.o hash.o cerr.o st
144 ruct.o cmd.o assemble.o token.o label.o macro.o exec.o dump.o
145 gcc -c -g -Wall -I ../include comet2.c
146 gcc -g -Wall -I ../include -o ../comet2 comet2.o word.o hash.o cerr.o
147 struct.ocmd.o exec.o dump.o
148 gcc -c -g -Wall -I ../include dumpword.c
149 gcc -g -Wall -I ../include -o ../dumpword dumpword.o word.o cerr.o
150 make[1]: Leaving directory ‘/home/kazubito/yacasl2/src’
153 @section @command{casl2}の実行テスト
154 ビルドしたら、次のコマンドが正常に実行できるかを確認します。
155 正常に実行された場合は、「Hello, World!」と表示されます。
158 $ @b{./casl2 as/hello.casl}
163 次のコマンドを実行すると、正常にビルドできているかどうかを詳細にテストできます。
168 @section 環境設定@var{PATH}の設定
169 環境変数@var{PATH}にYACASL2のディレクトリーを追加すると、どのディレクトリーでも@command{casl2}、@command{comet2}、@command{dumpword}を実行できます。
171 環境変数の設定方法は使っているシェルによって異なります。現在もっとも多く使われているシェルは、Bashでしょう。次のコマンドで使っているシェルを確認できます。
177 シェルがBashの場合、次のコマンドを実行すると環境変数@var{PATH}にYACASL2のディレクトリーが追加されます。
179 $ @b{PATH=$PATH:~/yacasl2 && export PATH}
182 シェルの初期設定ファイルに上記のコマンドを追加すれば、今後ログインした後は自動的にどのディレクトリーでも @command{casl2}、@command{comet2}、@command{dumpword}を実行できるようになります。Bashの場合はホームディレクトリーにある@file{.bashrc}が初期設定ファイルのため、コマンドは次のようになります。
184 $ @b{echo ’PATH=$PATH:~/yacasl2 && export PATH’ >>~/.bashrc}
187 @chapter YACASL2 の使い方
188 YACASL2 は、テキストファイルに記述されたCASLプログラムを処理します。以下の例で用いられるCASLプログラムのファイルは、テキストエディタなどで作成してください。また、インストールしたディレクトリーの中にある@file{as}ディレクトリーからコピーして作成することもできます。
190 @section 実行結果の出力だけを表示
192 @subsection @file{hello.casl}
193 インストール時にコマンド実行の確認に使った@file{hello.casl}は、次のような内容です。CASL IIのマクロ命令OUTは、文字列を出力します。
199 OBUF DC ’Hello, World!’
204 次のコマンドを実行すると、CASL II のアセンブルと仮想マシン COMET II 上での実行が連続で行われ、文字列が出力されます。
206 $ @b{casl2 hello.casl}
210 @subsection @file{addl.casl}
211 3 と 1 の和を求める@file{addl.casl}は、次のような内容です。
224 このプログラムには出力命令がないため、オプションなしで実行した場合には結果が出力されません。
226 $ @b{casl2 addl.casl}
230 実行内容を確認するには、後述のようにCPU 内にあるレジスターやメモリーの内容を表示するか、結果を出力するための処理を追加する必要があります。
233 casl2の処理途中で行われるアセンブルの結果を表示するには、オプション@option{-a}を指定します。また、ラベルとアドレスの対応表を表示するには、オプション@option{-l}を指定します。
235 @subsection @file{hello.casl}
236 次のコマンドでは、@file{hello.casl}のラベルとアドレスの対応表と、アセンブル結果と、実行結果が表示されます。OUTはアセンブラ命令で複数の機械語命令で構成されているため、命令行1行に対して、複数行のコードが生成されます。
239 $ @b{casl2 -a -l hello.casl}
241 Assemble hello.casl (0)
248 Assemble hello.casl (1)
249 hello.casl: 1:MAIN START
250 hello.casl: 2: OUT OBUF,LEN
273 hello.casl: 4:OBUF DC 'Hello, World!'
287 hello.casl: 5:LEN DC 13
293 @subsection @file{addl.casl}
294 @file{addl.casl}のラベルとアドレスの対応表と、アセンブル結果は、次のようになります。
297 $ @b{casl2 -a -l addl.casl}
299 Assemble addl.casl (0)
306 Assemble addl.casl (1)
307 addl.casl: 1:;;; ADDL r,adr
308 addl.casl: 2:MAIN START
309 addl.casl: 3: LD GR1,A
312 addl.casl: 4: ADDL GR1,B
324 なお、オプション@option{-A}を指定すると、アセンブル結果だけが表示され、仮想マシンCOMET II での実行は行われません。
326 @section 実行時のレジスターとメモリーを表示
327 YACASL2では実行中のCPUのレジスターとメモリーの内容をそれぞれ、@option{-t}と@option{-d}を指定することで表示できます。
329 また、@option{-M}で、仮想マシンCOMET II のメモリー容量を語(16 ビット)単位で指定できます。小さいプログラムを実行するときは、メモリー容量を小さくすれば結果が見やすくなります。
331 @subsection @file{addl.casl}
332 @file{addl.casl}に必要なメモリー容量は8語のため、次のようにCPUのレジスターとメモリーの内容を表示できます。
335 $ @b{casl2 -t -d -M8 addl.casl | less}
337 Assemble addl.casl (0)
339 Assemble addl.casl (1)
341 Executing machine codes
343 #0000: GR0: 0 = #0000 = 0000000000000000
344 #0000: GR1: 0 = #0000 = 0000000000000000
345 #0000: GR2: 0 = #0000 = 0000000000000000
346 #0000: GR3: 0 = #0000 = 0000000000000000
347 #0000: GR4: 0 = #0000 = 0000000000000000
348 #0000: GR5: 0 = #0000 = 0000000000000000
349 #0000: GR6: 0 = #0000 = 0000000000000000
350 #0000: GR7: 0 = #0000 = 0000000000000000
351 #0000: SP: 8 = #0008 = 0000000000001000
352 #0000: PR: 0 = #0000 = 0000000000000000
353 #0000: FR (OF SF ZF): 000
355 #0000: adr : 0000 0001 0002 0003 0004 0005 0006 0007
356 #0000: 0000: 1010 0005 2210 0006 8100 0003 0001 0000
358 #0002: GR0: 0 = #0000 = 0000000000000000
359 #0002: GR1: 3 = #0003 = 0000000000000011
360 #0002: GR2: 0 = #0000 = 0000000000000000
361 #0002: GR3: 0 = #0000 = 0000000000000000
362 #0002: GR4: 0 = #0000 = 0000000000000000
363 #0002: GR5: 0 = #0000 = 0000000000000000
364 #0002: GR6: 0 = #0000 = 0000000000000000
365 #0002: GR7: 0 = #0000 = 0000000000000000
366 #0002: SP: 8 = #0008 = 0000000000001000
367 #0002: PR: 2 = #0002 = 0000000000000010
368 #0002: FR (OF SF ZF): 000
370 #0002: adr : 0000 0001 0002 0003 0004 0005 0006 0007
371 #0002: 0000: 1010 0005 2210 0006 8100 0003 0001 0000
373 #0004: GR0: 0 = #0000 = 0000000000000000
374 #0004: GR1: 4 = #0004 = 0000000000000100
375 #0004: GR2: 0 = #0000 = 0000000000000000
376 #0004: GR3: 0 = #0000 = 0000000000000000
377 #0004: GR4: 0 = #0000 = 0000000000000000
378 #0004: GR5: 0 = #0000 = 0000000000000000
379 #0004: GR6: 0 = #0000 = 0000000000000000
380 #0004: GR7: 0 = #0000 = 0000000000000000
381 #0004: SP: 8 = #0008 = 0000000000001000
382 #0004: PR: 4 = #0004 = 0000000000000100
383 #0004: FR (OF SF ZF): 000
385 #0004: adr : 0000 0001 0002 0003 0004 0005 0006 0007
386 #0004: 0000: 1010 0005 2210 0006 8100 0003 0001 0000
389 @file{addl.casl}のレジスターやメモリーの中で、実行中に値が変化しているのはGR1だけです。こうした場合は、@command{grep}を使って表示される内容を絞り込むことで動作を検証しやすくなります。
392 $ @b{casl2 -t addl.casl | grep 'GR1:'}
393 #0000: GR1: 0 = #0000 = 0000000000000000
394 #0002: GR1: 3 = #0003 = 0000000000000011
395 #0004: GR1: 4 = #0004 = 0000000000000100
398 ここで、先に実行した@file{addl.casl}のアセンブル結果をもう一度見てください。
399 次の表のように、PRとGR1、命令行が対応していることがわかります。
401 @multitable @columnfractions .3 .3 .4
402 @item PR @tab GR1 @tab 命令行
410 @tab @code{ADDL GR1,B}