ドキュメント作成
[YACASL2.git] / doc / yacasl2.texi
1 \input texinfo   @c -*-texinfo-*-
2 @c %**start of header
3 @setfilename yacasl2.info
4 @settitle YACASL2 - Linux上のCASL2処理系
5 @c %**end of header
6
7 @exampleindent 2
8
9 @copying
10 Copyright @copyright{} 2010 j8takagi
11 @end copying
12
13 @titlepage
14 @title
15 @end titlepage
16 @node Top
17
18 @menu
19 * YACASL2の概要:about.
20 * YACASL2のインストール:install.
21 * YACASL2の使い方:tutorial.
22 @end menu
23
24
25 @c Output the table of contents at the beginning.
26 @contents
27
28 @insertcopying
29
30 @node about, install, Top, Top
31 @chapter YACASL2の概要
32
33 @cindex chapter, first
34
35 YACASL2は、Linux上で動作するオープンソースのCASL II処理系です。CASL IIは情報処理試験で用いられるアセンブラ言語で、次の資料により仕様が公開されています。
36
37 @quotation
38 @uref{http://www.jitec.ipa.go.jp/1_00topic/topic_20081027_hani_yougo.pdf, 試験で使用する情報処理用語・プログラム言語など(2008年10月版)}[PDFファイル]
39 別紙 1 アセンブラ言語の仕様
40 @end quotation
41
42 YACASL2は、CASL IIアセンブラ言語で記述されたファイルをアセンブルし、仮想マシンCOMET II上で実行します。アセンブルと実行は、連続で行うことも別々に行うことも可能です。
43 YACASL2の動作はCASL IIの仕様に準拠しているため、情報処理試験の問題をはじめ各種参考書やサイトに記載されたCASL IIのプログラムをそのままアセンブルして実行できます。また、本パッケージ中にCASL IIのサンプルプログラムが多数収録されています。
44
45 YACASL2は、「ふつうの処理系」として動作します。ほかの多くのCASL IIエミュレーターと違い、デバッガーとして動作したり、コンピューター内部の模式図を表示したりすることはありません。そのかわり、YACASL2は、次のような動作内容をすべてテキストで出力します。
46
47 @itemize @bullet
48
49 @item
50 ラベルとアドレスの対応
51
52 @item
53 アセンブル結果
54
55 @item
56 実行時のレジスタの内容
57
58 @item
59 実行時のメモリの内容
60 @end itemize
61
62 出力された動作内容は、GNU/Linuxのさまざまなツール、たとえば@command{cat}、@command{less}、@command{grep}、@command{wc}などを使って解析できます。
63
64 @unnumberedsec 要件
65 YACASL2は、Linux上で動作します。現在動作を確認しているのは、次のディストリビューションです。
66
67 @itemize @bullet
68
69 @item
70 Ubuntu Linux 9.04 / 8.04
71
72 @item
73 Vine Linux 4.2
74 @end itemize
75
76 インストール時に、@command{tar}、@command{gcc}、@command{make}が必要です。
77
78 @node install, tutorial, about, Top
79 @chapter YACASL2のインストール
80
81 YACASL2をインストールするには、Linux上で次の作業をします。
82
83 @enumerate
84
85 @item
86 @file{yacasl2.tar.gz}のダウンロード
87
88 @item
89 @file{yacasl2.tar.gz}の検証
90
91 @item
92 @file{yacasl2.tar.gz}の展開
93
94 @item
95 @command{casl2}、@command{comet2}、@command{dumpword}のビルド
96
97 @item
98 @command{casl2}の実行テスト
99
100 @item
101 詳細なテスト
102
103 @item
104 環境設定@var{PATH}の設定
105 @end enumerate
106
107 以下の操作は、端末を開きコマンドを実行します。
108
109 @section @file{yacasl2.tar.gz}のダウンロード
110 (詳細未定)
111
112 @cartouche
113 @example
114 $ @b{cd}
115 $ @b{wget somewhere/yacasl2.tar.gz}
116 $ @b{wget somewhere/yacasl2.tar.gz.md5sum}
117 @end example
118 @end cartouche
119
120 @section @file{yacasl2.tar.gz}の検証
121
122 (PGPを使った検証も導入予定)
123
124 ダウンロードが完了したら、@command{md5sum}と@command{diff}で正しくファイルがダウンロードができているかを検証します。
125
126 @cartouche
127 @example
128 $ @b{md5sum yacasl2.tar.gz | diff -s yacasl2.tar.gz.md5sum -}
129 Files yacasl2.tar.gz.md5sum and - are identical
130 @end example
131 @end cartouche
132
133 @section @file{yacasl2.tar.gz}の展開
134
135 @file{yacasl2.tar.gz}をダウンロードしたら、次のコマンドで展開します。
136
137 @cartouche
138 @example
139 $ @b{tar xvzf yacasl2.tar.gz}
140 @end example
141 @end cartouche
142
143 @section @command{casl2}、@command{comet2}、@command{dumpword}のビルド
144
145 展開したら、次のコマンドで@command{casl2}、@command{comet2}、@command{dumpword}をビルドします。
146
147 @cartouche
148 @example
149 $ @b{cd yacasl2}
150 $ @b{make}
151 make -C src
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’
173 @end example
174 @end cartouche
175
176 @section @command{casl2}の実行テスト
177
178 ビルドしたら、次のコマンドが正常に実行できるかを確認します。
179 正常に実行された場合は、「Hello, World!」と表示されます。
180
181 @cartouche
182 @example
183 $ @b{./casl2 as/hello.casl}
184 Hello, World!
185 @end example
186 @end cartouche
187
188 @section 詳細なテスト
189
190 次のコマンドを実行すると、正常にビルドできているかどうかを詳細にテストできます。
191
192 @cartouche
193 @example
194 $ @b{make check}
195 194 / 194 tests passed. Details in /home/kazubito/yacasl2/test/integra
196 tion/casl2/Test.log
197 All tests are succeded.
198 149 / 149 tests passed. Details in /home/kazubito/yacasl2/test/integra
199 tion/comet2/Test.log
200 All tests are succeded.
201 4 / 4 tests passed. Details in /home/kazubito/yacasl2/test/integration
202 /dumpword/Test.log
203 All tests are succeded.
204 @end example
205 @end cartouche
206
207 @section 環境設定@var{PATH}の設定
208
209 環境変数@var{PATH}にYACASL2のディレクトリーを追加すると、どのディレクトリーでも@command{casl2}、@command{comet2}、@command{dumpword}を実行できます。
210
211 環境変数の設定方法は使っているシェルによって異なります。シェルは、次のコマンドで確認できます。現在もっとも多く使われているのは、BASHでしょう。
212
213 @cartouche
214 @example
215 $ @b{echo $SHELL}
216 /bin/bash
217 @end example
218 @end cartouche
219
220 シェルがBASHの場合、次のコマンドを実行すると環境変数@var{PATH}にYACASL2のディレクトリーが追加されます。
221
222 @cartouche
223 @example
224 $ @b{PATH=$PATH:~/yacasl2 && export PATH}
225 @end example
226 @end cartouche
227
228 シェルの初期設定ファイルに上記のコマンドを追加すれば、今後ログインした後は自動的にどのディレクトリーでも @command{casl2}、@command{comet2}、@command{dumpword}を実行できるようになります。BASHの場合はホームディレクトリーにある@file{.bashrc}が初期設定ファイルのため、コマンドは次のようになります。
229
230 @cartouche
231 @example
232 $ @b{echo ’PATH=$PATH:~/yacasl2 && export PATH’ >>~/.bashrc}
233 @end example
234 @end cartouche
235
236 @node tutorial,, install, Top
237 @chapter YACASL2 の使い方
238
239 YACASL2 は、テキストファイルに記述されたCASLプログラムを処理します。以下の例で用いられるCASLプログラムのファイルは、テキストエディタなどで作成してください。また、インストールしたディレクトリーの中にある@file{as}ディレクトリーからコピーして作成することもできます。
240
241 @section 実行結果の出力だけを表示
242
243 インストール時にコマンド実行の確認に使った@file{hello.casl}は、次のような内容です。CASL IIのマクロ命令OUTは、文字列を出力します。
244
245 @cartouche
246 @example
247 $ @b{cat hello.casl}
248 MAIN     START
249          OUT     OBUF,LEN
250          RET
251 OBUF     DC      ’Hello, World!’
252 LEN      DC      13
253          END
254 @end example
255 @end cartouche
256
257 次のコマンドを実行すると、CASL II のアセンブルと仮想マシン COMET II 上での実行が連続で行われ、文字列が出力されます。
258
259 @cartouche
260 @example
261 $ @b{casl2 hello.casl}
262 Hello, World!
263 @end example
264 @end cartouche
265
266 @file{addl.casl}は、3と1の和を求めます。
267
268 @cartouche
269 @example
270 $ @b{cat addl.casl}
271 ;;; ADDL r,adr
272 MAIN     START
273          LD      GR1,A
274          ADDL    GR1,B
275          RET
276 A        DC      3
277 B        DC      1
278          END
279 @end example
280 @end cartouche
281
282 このプログラムには出力命令がないため、オプションなしで実行した場合には結果が出力されません。
283
284 @cartouche
285 @example
286 $ @b{casl2 addl.casl}
287 $
288 @end example
289 @end cartouche
290
291 実行内容を確認するには、後述のようにCPU 内にあるレジスターやメモリーの内容を表示するか、結果を出力するための処理を追加する必要があります。
292
293 @file{sum_10.casl}は、1から10までの整数の和を求めます。
294
295 @cartouche
296 @example
297 $ @b{cat sum_10.casl}
298 ;;; sum_10.casl
299 ;;; 出力 GR0: 1から10までの整数をすべて加算した値
300 MAIN    START
301         PUSH    0,GR1
302         LAD     GR0,0           ; GR0を初期化
303         LD      GR1,FST         ; GR1に初項を転送
304 LOOP    ADDL    GR0,GR1         ; ループ先頭
305         ADDL    GR1,STEP        ; GR1 <- GR1 + 公差
306         CPL     GR1,LST         ; GR1が末項より大きい場合は終了
307         JPL     FIN             ; ↓
308         JUMP    LOOP            ; ループ終端
309 FIN     POP     GR1
310         RET
311 FST     DC      1               ; 初項
312 LST     DC      10              ; 末項
313 STEP    DC      1               ; 公差
314         END
315 @end example
316 @end cartouche
317
318 このプログラムも、オプションなしで実行した場合には結果が出力されません。
319 @cartouche
320 @example
321 $ @b{casl2 sum_10.casl}
322 $
323 @end example
324 @end cartouche
325
326 @section アセンブル結果の確認
327 casl2の処理途中で行われるアセンブルの結果を表示するには、オプション@option{-a}を指定します。また、ラベルとアドレスの対応表を表示するには、オプション@option{-l}を指定します。
328
329 次のコマンドでは@file{hello.casl}の、ラベルとアドレスの対応表と、アセンブル結果と、実行結果が表示されます。OUTはアセンブラ命令で複数の機械語命令で構成されているため、命令行1行に対して、複数行のコードが生成されます。
330
331 @cartouche
332 @example
333 $ @b{casl2 -a -l hello.casl}
334
335 Assemble hello.casl (0)
336
337 Label::::
338 MAIN.LEN ---> #0020
339 MAIN ---> #0000
340 MAIN.OBUF ---> #0013
341
342 Assemble hello.casl (1)
343 hello.casl:    1:MAIN    START
344 hello.casl:    2:        OUT     OBUF,LEN
345     #0000   #7001
346     #0001   #0000
347     #0002   #7002
348     #0003   #0000
349     #0004   #1210
350     #0005   #0013
351     #0006   #1220
352     #0007   #0020
353     #0008   #F000
354     #0009   #0002
355     #000A   #1210
356     #000B   #0021
357     #0021   #000A
358     #000C   #1220
359     #000D   #0022
360     #0022   #0001
361     #000E   #F000
362     #000F   #0002
363     #0010   #7120
364     #0011   #7110
365 hello.casl:    3:        RET
366     #0012   #8100
367 hello.casl:    4:OBUF    DC      'Hello, World!'
368     #0013   #0048
369     #0014   #0065
370     #0015   #006C
371     #0016   #006C
372     #0017   #006F
373     #0018   #002C
374     #0019   #0020
375     #001A   #0057
376     #001B   #006F
377     #001C   #0072
378     #001D   #006C
379     #001E   #0064
380     #001F   #0021
381 hello.casl:    5:LEN     DC      13
382     #0020   #000D
383 hello.casl:    6:        END
384 Hello, World!
385 @end example
386 @end cartouche
387
388 @file{addl.casl}の、ラベルとアドレスの対応表と、アセンブル結果は、次のようになります。
389
390 @cartouche
391 @example
392 $ @b{casl2 -a -l addl.casl}
393
394 Assemble addl.casl (0)
395
396 Label::::
397 MAIN.A ---> #0005
398 MAIN.B ---> #0006
399 MAIN ---> #0000
400
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
405     #0000   #1010
406     #0001   #0005
407 addl.casl:    4:        ADDL    GR1,B
408     #0002   #2210
409     #0003   #0006
410 addl.casl:    5:        RET
411     #0004   #8100
412 addl.casl:    6:A       DC      3
413     #0005   #0003
414 addl.casl:    7:B       DC      1
415     #0006   #0001
416 addl.casl:    8:        END
417 @end example
418 @end cartouche
419
420 なお、オプション@option{-A}を指定すると、アセンブル結果が表示される時点で処理が終了します。仮想マシンCOMET II での実行は行われません。
421
422 @section 実行時のレジスターとメモリーを表示
423 YACASL2では実行中のCPUのレジスターとメモリーの内容をそれぞれ、@option{-t}と@option{-d}を指定することで表示できます。
424
425 また、@option{-M}で、仮想マシンCOMET II のメモリー容量を語(16 ビット)単位で指定できます。小さいプログラムを実行するときは、メモリー容量を小さくすれば結果が見やすくなります。
426
427 @file{addl.casl}に必要なメモリー容量は8語のため、次のようにCPUのレジスターとメモリーの内容を表示できます。
428
429 @cartouche
430 @example
431 $ @b{casl2 -t -d -M8 addl.casl | less}
432
433 Assemble addl.casl (0)
434
435 Assemble addl.casl (1)
436
437 Executing machine codes
438 #0000: Register::::
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
450 #0000: Memory::::
451 #0000: adr : 0000 0001 0002 0003 0004 0005 0006 0007
452 #0000: 0000: 1010 0005 2210 0006 8100 0003 0001 0000 
453 #0002: Register::::
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
465 #0002: Memory::::
466 #0002: adr : 0000 0001 0002 0003 0004 0005 0006 0007
467 #0002: 0000: 1010 0005 2210 0006 8100 0003 0001 0000 
468 #0004: Register::::
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
480 #0004: Memory::::
481 #0004: adr : 0000 0001 0002 0003 0004 0005 0006 0007
482 #0004: 0000: 1010 0005 2210 0006 8100 0003 0001 0000 
483 @end example
484 @end cartouche
485
486 @subsection 特定のレジスターを表示
487
488 @file{addl.casl}のレジスターやメモリーの中で、実行中に値が変化しているのはGR1だけです。こうした場合は、@command{grep}を使って表示される内容を絞り込むことで動作を検証しやすくなります。
489
490 @cartouche
491 @example
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
496 @end example
497 @end cartouche
498
499 この内容を、先に出力したアセンブル結果と引き比べてください。
500 次の表のように、PRとGR1、命令行が対応していることがわかります。
501
502 @multitable @columnfractions .3 .3 .4
503 @item PR @tab GR1 @tab 命令行
504 @item #0000
505 @tab #0000
506 @item #0002
507 @tab #0003
508 @tab @code{LD GR1,A}
509 @item #0004
510 @tab #0004
511 @tab @code{ADDL GR1,B}
512 @end multitable
513
514 @subsection プログラム終了時の値を表示
515
516 @command{grep}と@command{tail}を組み合わせれば、プログラム終了時の値を表示できます。
517
518 @cartouche
519 @example
520 $ @b{casl2 -t addl.casl | grep 'GR1:' | tail -1}
521 #0004: GR1:      4 = #0004 = 0000000000000100
522 @end example
523 @end cartouche
524
525 @cartouche
526 @example
527 $ @b{casl2 -t sum_10.casl | grep 'GR0:' | tail -1}
528 #0010: GR0:     55 = #0037 = 0000000000110111 = '7'
529 @end example
530 @end cartouche
531
532 @subsection プログラムのステップ数を表示
533
534 @command{grep}と@command{wc}を組み合わせれば、プログラムのステップ数を表示できます。
535
536 @cartouche
537 @example
538 $ @b{casl2 -t hello.casl | grep 'GR1:' | wc -l}
539 11
540 @end example
541 @end cartouche
542
543 @cartouche
544 @example
545 $ @b{casl2 -t addl.casl | grep 'GR1:' | wc -l}
546 3
547 @end example
548 @end cartouche
549
550 @file{sum_10.casl}はプログラム内にループがあるため、ステップ数が大きくなります。
551
552 @cartouche
553 @example
554 $ @b{casl2 -t sum_10.casl | grep 'GR0:' | wc -l}
555 54
556 @end example
557 @end cartouche
558
559 @section アセンブルと実行を別に行う
560
561 @command{casl2}に@option{-O}<@file{ファイル名}>を指定すると、オブジェクトファイルを作成できます。
562
563 @cartouche
564 @example
565 $ @b{casl2 -Ohello.o hello.casl}
566 @end example
567 @end cartouche
568
569 作成されたオブジェクトファイルの内容は、@command{od}を使って確認できます。テキストファイルではないため、@command{cat}などでは確認できません。
570
571 @cartouche
572 @example
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
579 0000106
580 @end example
581 @end cartouche
582
583 オブジェクトファイルの実行には、@command{comet2}を使います。
584
585 @cartouche
586 @example
587 $ @b{comet2 hello.o}
588 Hello, World!
589 @end example
590 @end cartouche
591
592 @section 1語を解析する
593
594 CASL2では、1語(16ビット)を単位としてデータが処理されます。
595 @command{dumpword}は、指定した1語を10進数、16進数、2進数で表示します。
596
597 @cartouche
598 @example
599 $ @b{dumpword 72}
600     72:     72 = #0048 = 0000000001001000 = 'H'
601 @end example
602 @end cartouche
603
604 マイナスの数は、次のように指定します。
605
606 @cartouche
607 @example
608 $ @b{dumpword -- -72}
609    -72:    -72 = #FFB8 = 1111111110111000
610 @end example
611 @end cartouche
612
613 16進数で指定する場合は、次のように指定します。
614
615 @cartouche
616 @example
617 $ @b{dumpword '#0048'}
618  #0048:     72 = #0048 = 0000000001001000 = 'H'
619 @end example
620 @end cartouche
621 @bye