1 \input texinfo @c -*-texinfo-*-
3 @setfilename yacasl2.info
4 @settitle YACASL2 - Linux上のCASL2処理系
10 Copyright @copyright{} 2010 j8takagi
20 * YACASL2のインストール:install.
21 * YACASL2の使い方:tutorial.
25 @c Output the table of contents at the beginning.
30 @node about, install, Top, Top
33 @cindex chapter, first
35 YACASL2は、Linux上で動作するオープンソースのCASL II処理系です。CASL IIは情報処理試験で用いられるアセンブラ言語で、次の資料により仕様が公開されています。
38 @uref{http://www.jitec.ipa.go.jp/1_00topic/topic_20081027_hani_yougo.pdf, 試験で使用する情報処理用語・プログラム言語など(2008年10月版)}[PDFファイル]
42 YACASL2は、CASL IIアセンブラ言語で記述されたファイルをアセンブルし、仮想マシンCOMET II上で実行します。アセンブルと実行は、連続で行うことも別々に行うことも可能です。
43 YACASL2の動作はCASL IIの仕様に準拠しているため、情報処理試験の問題をはじめ各種参考書やサイトに記載されたCASL IIのプログラムをそのままアセンブルして実行できます。また、本パッケージ中にCASL IIのサンプルプログラムが多数収録されています。
45 YACASL2は、「ふつうの処理系」として動作します。ほかの多くのCASL IIエミュレーターと違い、デバッガーとして動作したり、コンピューター内部の模式図を表示したりすることはありません。そのかわり、YACASL2は、次のような動作内容をすべてテキストで出力します。
62 出力された動作内容は、GNU/Linuxのさまざまなツール、たとえば@command{cat}、@command{less}、@command{grep}、@command{wc}などを使って解析できます。
65 YACASL2は、Linux上で動作します。現在動作を確認しているのは、次のディストリビューションです。
70 Ubuntu Linux 9.04 / 8.04
76 インストール時に、@command{tar}、@command{gcc}、@command{make}が必要です。
78 @node install, tutorial, about, Top
79 @chapter YACASL2のインストール
81 YACASL2をインストールするには、Linux上で次の作業をします。
86 @file{yacasl2.tar.gz}のダウンロード
89 @file{yacasl2.tar.gz}の検証
92 @file{yacasl2.tar.gz}の展開
95 @command{casl2}、@command{comet2}、@command{dumpword}のビルド
107 以下の操作は、端末を開きコマンドを実行します。
109 @section @file{yacasl2.tar.gz}のダウンロード
115 $ @b{wget somewhere/yacasl2.tar.gz}
116 $ @b{wget somewhere/yacasl2.tar.gz.md5sum}
120 @section @file{yacasl2.tar.gz}の検証
124 ダウンロードが完了したら、@command{md5sum}と@command{diff}で正しくファイルがダウンロードができているかを検証します。
128 $ @b{md5sum yacasl2.tar.gz | diff -s yacasl2.tar.gz.md5sum -}
129 Files yacasl2.tar.gz.md5sum and - are identical
133 @section @file{yacasl2.tar.gz}の展開
135 @file{yacasl2.tar.gz}をダウンロードしたら、次のコマンドで展開します。
139 $ @b{tar xvzf yacasl2.tar.gz}
143 @section @command{casl2}、@command{comet2}、@command{dumpword}のビルド
145 展開したら、次のコマンドで@command{casl2}、@command{comet2}、@command{dumpword}をビルドします。
152 make[1]: Entering directory ‘/home/kazubito/yacasl2/src’
153 gcc -c -g -Wall -I ../include casl2.c
154 gcc -c -g -Wall -I ../include word.c
155 gcc -c -g -Wall -I ../include hash.c
156 gcc -c -g -Wall -I ../include cerr.c
157 gcc -c -g -Wall -I ../include struct.c
158 gcc -c -g -Wall -I ../include cmd.c
159 gcc -c -g -Wall -I ../include assemble.c
160 gcc -c -g -Wall -I ../include token.c
161 gcc -c -g -Wall -I ../include label.c
162 gcc -c -g -Wall -I ../include macro.c
163 gcc -c -g -Wall -I ../include exec.c
164 gcc -c -g -Wall -I ../include dump.c
165 gcc -g -Wall -I ../include -o ../casl2 casl2.o word.o hash.o cerr.o st
166 ruct.o cmd.o assemble.o token.o label.o macro.o exec.o dump.o
167 gcc -c -g -Wall -I ../include comet2.c
168 gcc -g -Wall -I ../include -o ../comet2 comet2.o word.o hash.o cerr.o
169 struct.o cmd.o exec.o dump.o
170 gcc -c -g -Wall -I ../include dumpword.c
171 gcc -g -Wall -I ../include -o ../dumpword dumpword.o word.o cerr.o
172 make[1]: Leaving directory ‘/home/kazubito/yacasl2/src’
176 @section @command{casl2}の実行テスト
178 ビルドしたら、次のコマンドが正常に実行できるかを確認します。
179 正常に実行された場合は、「Hello, World!」と表示されます。
183 $ @b{./casl2 as/hello.casl}
190 次のコマンドを実行すると、正常にビルドできているかどうかを詳細にテストできます。
195 194 / 194 tests passed. Details in /home/kazubito/yacasl2/test/integra
197 All tests are succeded.
198 149 / 149 tests passed. Details in /home/kazubito/yacasl2/test/integra
200 All tests are succeded.
201 4 / 4 tests passed. Details in /home/kazubito/yacasl2/test/integration
203 All tests are succeded.
207 @section 環境設定@var{PATH}の設定
209 環境変数@var{PATH}にYACASL2のディレクトリーを追加すると、どのディレクトリーでも@command{casl2}、@command{comet2}、@command{dumpword}を実行できます。
211 環境変数の設定方法は使っているシェルによって異なります。シェルは、次のコマンドで確認できます。現在もっとも多く使われているのは、BASHでしょう。
220 シェルがBASHの場合、次のコマンドを実行すると環境変数@var{PATH}にYACASL2のディレクトリーが追加されます。
224 $ @b{PATH=$PATH:~/yacasl2 && export PATH}
228 シェルの初期設定ファイルに上記のコマンドを追加すれば、今後ログインした後は自動的にどのディレクトリーでも @command{casl2}、@command{comet2}、@command{dumpword}を実行できるようになります。BASHの場合はホームディレクトリーにある@file{.bashrc}が初期設定ファイルのため、コマンドは次のようになります。
232 $ @b{echo ’PATH=$PATH:~/yacasl2 && export PATH’ >>~/.bashrc}
236 @node tutorial,, install, Top
237 @chapter YACASL2 の使い方
239 YACASL2 は、テキストファイルに記述されたCASLプログラムを処理します。以下の例で用いられるCASLプログラムのファイルは、テキストエディタなどで作成してください。また、インストールしたディレクトリーの中にある@file{as}ディレクトリーからコピーして作成することもできます。
241 @section 実行結果の出力だけを表示
243 インストール時にコマンド実行の確認に使った@file{hello.casl}は、次のような内容です。CASL IIのマクロ命令OUTは、文字列を出力します。
251 OBUF DC ’Hello, World!’
257 次のコマンドを実行すると、CASL II のアセンブルと仮想マシン COMET II 上での実行が連続で行われ、文字列が出力されます。
261 $ @b{casl2 hello.casl}
266 @file{addl.casl}は、3と1の和を求めます。
282 このプログラムには出力命令がないため、オプションなしで実行した場合には結果が出力されません。
286 $ @b{casl2 addl.casl}
291 実行内容を確認するには、後述のようにCPU 内にあるレジスターやメモリーの内容を表示するか、結果を出力するための処理を追加する必要があります。
293 @file{sum_10.casl}は、1から10までの整数の和を求めます。
297 $ @b{cat sum_10.casl}
299 ;;; 出力 GR0: 1から10までの整数をすべて加算した値
303 LD GR1,FST ; GR1に初項を転送
304 LOOP ADDL GR0,GR1 ; ループ先頭
305 ADDL GR1,STEP ; GR1 <- GR1 + 公差
306 CPL GR1,LST ; GR1が末項より大きい場合は終了
318 このプログラムも、オプションなしで実行した場合には結果が出力されません。
321 $ @b{casl2 sum_10.casl}
327 casl2の処理途中で行われるアセンブルの結果を表示するには、オプション@option{-a}を指定します。また、ラベルとアドレスの対応表を表示するには、オプション@option{-l}を指定します。
329 次のコマンドでは@file{hello.casl}の、ラベルとアドレスの対応表と、アセンブル結果と、実行結果が表示されます。OUTはアセンブラ命令で複数の機械語命令で構成されているため、命令行1行に対して、複数行のコードが生成されます。
333 $ @b{casl2 -a -l hello.casl}
335 Assemble hello.casl (0)
342 Assemble hello.casl (1)
343 hello.casl: 1:MAIN START
344 hello.casl: 2: OUT OBUF,LEN
367 hello.casl: 4:OBUF DC 'Hello, World!'
381 hello.casl: 5:LEN DC 13
388 @file{addl.casl}の、ラベルとアドレスの対応表と、アセンブル結果は、次のようになります。
392 $ @b{casl2 -a -l addl.casl}
394 Assemble addl.casl (0)
401 Assemble addl.casl (1)
402 addl.casl: 1:;;; ADDL r,adr
403 addl.casl: 2:MAIN START
404 addl.casl: 3: LD GR1,A
407 addl.casl: 4: ADDL GR1,B
420 なお、オプション@option{-A}を指定すると、アセンブル結果が表示される時点で処理が終了します。仮想マシンCOMET II での実行は行われません。
422 @section 実行時のレジスターとメモリーを表示
423 YACASL2では実行中のCPUのレジスターとメモリーの内容をそれぞれ、@option{-t}と@option{-d}を指定することで表示できます。
425 また、@option{-M}で、仮想マシンCOMET II のメモリー容量を語(16 ビット)単位で指定できます。小さいプログラムを実行するときは、メモリー容量を小さくすれば結果が見やすくなります。
427 @file{addl.casl}に必要なメモリー容量は8語のため、次のようにCPUのレジスターとメモリーの内容を表示できます。
431 $ @b{casl2 -t -d -M8 addl.casl | less}
433 Assemble addl.casl (0)
435 Assemble addl.casl (1)
437 Executing machine codes
439 #0000: GR0: 0 = #0000 = 0000000000000000
440 #0000: GR1: 0 = #0000 = 0000000000000000
441 #0000: GR2: 0 = #0000 = 0000000000000000
442 #0000: GR3: 0 = #0000 = 0000000000000000
443 #0000: GR4: 0 = #0000 = 0000000000000000
444 #0000: GR5: 0 = #0000 = 0000000000000000
445 #0000: GR6: 0 = #0000 = 0000000000000000
446 #0000: GR7: 0 = #0000 = 0000000000000000
447 #0000: SP: 8 = #0008 = 0000000000001000
448 #0000: PR: 0 = #0000 = 0000000000000000
449 #0000: FR (OF SF ZF): 000
451 #0000: adr : 0000 0001 0002 0003 0004 0005 0006 0007
452 #0000: 0000: 1010 0005 2210 0006 8100 0003 0001 0000
454 #0002: GR0: 0 = #0000 = 0000000000000000
455 #0002: GR1: 3 = #0003 = 0000000000000011
456 #0002: GR2: 0 = #0000 = 0000000000000000
457 #0002: GR3: 0 = #0000 = 0000000000000000
458 #0002: GR4: 0 = #0000 = 0000000000000000
459 #0002: GR5: 0 = #0000 = 0000000000000000
460 #0002: GR6: 0 = #0000 = 0000000000000000
461 #0002: GR7: 0 = #0000 = 0000000000000000
462 #0002: SP: 8 = #0008 = 0000000000001000
463 #0002: PR: 2 = #0002 = 0000000000000010
464 #0002: FR (OF SF ZF): 000
466 #0002: adr : 0000 0001 0002 0003 0004 0005 0006 0007
467 #0002: 0000: 1010 0005 2210 0006 8100 0003 0001 0000
469 #0004: GR0: 0 = #0000 = 0000000000000000
470 #0004: GR1: 4 = #0004 = 0000000000000100
471 #0004: GR2: 0 = #0000 = 0000000000000000
472 #0004: GR3: 0 = #0000 = 0000000000000000
473 #0004: GR4: 0 = #0000 = 0000000000000000
474 #0004: GR5: 0 = #0000 = 0000000000000000
475 #0004: GR6: 0 = #0000 = 0000000000000000
476 #0004: GR7: 0 = #0000 = 0000000000000000
477 #0004: SP: 8 = #0008 = 0000000000001000
478 #0004: PR: 4 = #0004 = 0000000000000100
479 #0004: FR (OF SF ZF): 000
481 #0004: adr : 0000 0001 0002 0003 0004 0005 0006 0007
482 #0004: 0000: 1010 0005 2210 0006 8100 0003 0001 0000
486 @subsection 特定のレジスターを表示
488 @file{addl.casl}のレジスターやメモリーの中で、実行中に値が変化しているのはGR1だけです。こうした場合は、@command{grep}を使って表示される内容を絞り込むことで動作を検証しやすくなります。
492 $ @b{casl2 -t addl.casl | grep 'GR1:'}
493 #0000: GR1: 0 = #0000 = 0000000000000000
494 #0002: GR1: 3 = #0003 = 0000000000000011
495 #0004: GR1: 4 = #0004 = 0000000000000100
499 この内容を、先に出力したアセンブル結果と引き比べてください。
500 次の表のように、PRとGR1、命令行が対応していることがわかります。
502 @multitable @columnfractions .3 .3 .4
503 @item PR @tab GR1 @tab 命令行
511 @tab @code{ADDL GR1,B}
514 @subsection プログラム終了時の値を表示
516 @command{grep}と@command{tail}を組み合わせれば、プログラム終了時の値を表示できます。
520 $ @b{casl2 -t addl.casl | grep 'GR1:' | tail -1}
521 #0004: GR1: 4 = #0004 = 0000000000000100
527 $ @b{casl2 -t sum_10.casl | grep 'GR0:' | tail -1}
528 #0010: GR0: 55 = #0037 = 0000000000110111 = '7'
532 @subsection プログラムのステップ数を表示
534 @command{grep}と@command{wc}を組み合わせれば、プログラムのステップ数を表示できます。
538 $ @b{casl2 -t hello.casl | grep 'GR1:' | wc -l}
545 $ @b{casl2 -t addl.casl | grep 'GR1:' | wc -l}
550 @file{sum_10.casl}はプログラム内にループがあるため、ステップ数が大きくなります。
554 $ @b{casl2 -t sum_10.casl | grep 'GR0:' | wc -l}
559 @section アセンブルと実行を別に行う
561 @command{casl2}に@option{-O}<@file{ファイル名}>を指定すると、オブジェクトファイルを作成できます。
565 $ @b{casl2 -Ohello.o hello.casl}
569 作成されたオブジェクトファイルの内容は、@command{od}を使って確認できます。テキストファイルではないため、@command{cat}などでは確認できません。
573 $ @b{od -t x2 hello.o}
574 0000000 7001 0000 7002 0000 1210 0013 1220 0020
575 0000020 f000 0002 1210 0021 1220 0022 f000 0002
576 0000040 7120 7110 8100 0048 0065 006c 006c 006f
577 0000060 002c 0020 0057 006f 0072 006c 0064 0021
578 0000100 000d 000a 0001
583 オブジェクトファイルの実行には、@command{comet2}を使います。
594 CASL2では、1語(16ビット)を単位としてデータが処理されます。
595 @command{dumpword}は、指定した1語を10進数、16進数、2進数で表示します。
600 72: 72 = #0048 = 0000000001001000 = 'H'
608 $ @b{dumpword -- -72}
609 -72: -72 = #FFB8 = 1111111110111000
613 16進数で指定する場合は、次のように指定します。
617 $ @b{dumpword '#0048'}
618 #0048: 72 = #0048 = 0000000001001000 = 'H'