bbcb3b36d415c51a6a9ae5b2f68863d9ae6f7f8e
[YACASL2.git] / doc / yacasl2.texi
1 \input texinfo   @c -*-texinfo-*-
2 @c %**start of header
3 @setfilename yacasl2
4 @settitle YACASL2 -Linux上のCASL2処理系-
5 @c %**end of header
6
7 @copying
8 Copyright @copyright{} 2010 j8takagi
9 @end copying
10
11 @titlepage
12 @title
13 @end titlepage
14
15 @c Output the table of contents at the beginning.
16 @contents
17
18 @insertcopying
19
20 @chapter YACASL2の概要
21
22 @cindex chapter, first
23
24 YACASL2は、Linux上で動作するオープンソースのCASL II処理系です。CASL IIは情報処理試験で用いられるアセンブラ言語で、次の資料により仕様が公開されています。
25
26 @quotation
27 @uref{http://www.jitec.ipa.go.jp/1_00topic/topic_20081027_hani_yougo.pdf, 試験で使用する情報処理用語・プログラム言語など(2008年10月版)}[PDFファイル]
28 別紙 1 アセンブラ言語の仕様
29 @end quotation
30
31 YACASL2は、CASL IIアセンブラ言語で記述されたファイルをアセンブルし、仮想マシンCOMET II上で実行します。アセンブルと実行は、連続で行うことも別々に行うことも可能です。
32 YACASL2の動作はCASL IIの仕様に準拠しているため、情報処理試験の問題をはじめ各種参考書やサイトに記載されたCASL IIのプログラムをそのままアセンブルして実行できます。また、本パッケージ中にCASL IIのサンプルプログラムが多数収録されています。
33
34 YACASL2は、「ふつうの処理系」として動作します。ほかの多くのCASL IIエミュレーターと違い、デバッガーとして動作したり、コンピューター内部の模式図を表示したりすることはありません。そのかわり、YACASL2は、次のような動作内容をすべてテキストで出力します。
35
36 @itemize @bullet
37
38 @item
39 ラベルとアドレスの対応
40
41 @item
42 アセンブル結果
43
44 @item
45 実行時のレジスタの内容
46
47 @item
48 実行時のメモリの内容
49 @end itemize
50
51 出力された動作内容は、GNU/Linuxのさまざまなツール、たとえば@command{head}、@command{tail}、@command{grep}、@command{diff}などを使って解析できます。
52
53 @unnumberedsec 要件
54 YACASL2は、Linux上で動作します。インストール時に、@command{tar}、@command{gcc}、@command{make}が必要です。
55
56 現在動作を確認しているのは、次のディストリビューションです。
57
58 @itemize @bullet
59
60 @item
61 Ubuntu Linux 9.04 / 8.04
62
63 @item
64 Vine Linux 4.2
65 @end itemize
66
67 @chapter YACASL2のインストール
68
69 YACASL2をインストールするには、Linux上で次の作業をします。
70
71 @enumerate
72
73 @item
74 @file{yacasl2.tar.gz}のダウンロード
75
76 @item
77 @file{yacasl2.tar.gz}の検証
78
79 @item
80 @file{yacasl2.tar.gz}の展開
81
82 @item
83 @command{casl2}、@command{comet2}、@command{dumpword}のビルド
84
85 @item
86 @command{casl2}の実行テスト
87
88 @item
89 詳細なテスト
90
91 @item
92 環境設定@var{PATH}の設定
93 @end enumerate
94
95 以下の操作は、端末を開きコマンドを実行します。
96
97 @section @file{yacasl2.tar.gz}のダウンロード
98 (詳細未定)
99
100 @example
101 $ @b{cd}
102 $ @b{wget somewhere/yacasl2.tar.gz}
103 $ @b{wget somewhere/yacasl2.tar.gz.md5sum}
104 @end example
105
106 @section @file{yacasl2.tar.gz}の検証
107 (PGPを使った検証も導入予定)
108
109 ダウンロードが完了したら、@command{md5sum}と@command{diff}で正しくファイルがダウンロードができているかを検証します。
110
111 @example
112 $ @b{md5sum yacasl2.tar.gz | diff -s yacasl2.tar.gz.md5sum -}
113 Files yacasl2.tar.gz.md5sum and - are identical
114 @end example
115
116 @section @file{yacasl2.tar.gz}の展開
117 @file{yacasl2.tar.gz}をダウンロードしたら、次のコマンドで展開します。
118
119 @example
120 $ @b{tar xvzf yacasl2.tar.gz}
121 @end example
122
123 @section @command{casl2}、@command{comet2}、@command{dumpword}のビルド
124 展開したら、次のコマンドで@command{casl2}、@command{comet2}、@command{dumpword}をビルドします。
125
126 @example
127 $ @b{cd yacasl2}
128 $ @b{make}
129 make -C src
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’
151 @end example
152
153 @section @command{casl2}の実行テスト
154 ビルドしたら、次のコマンドが正常に実行できるかを確認します。
155 正常に実行された場合は、「Hello, World!」と表示されます。
156
157 @example
158 $ @b{./casl2 as/hello.casl}
159 Hello, World!
160 @end example
161
162 @section 詳細なテスト
163 次のコマンドを実行すると、正常にビルドできているかどうかを詳細にテストできます。
164 @example
165 $ @b{make check}
166 @end example
167
168 @section 環境設定@var{PATH}の設定
169 環境変数@var{PATH}にYACASL2のディレクトリーを追加すると、どのディレクトリーでも@command{casl2}、@command{comet2}、@command{dumpword}を実行できます。
170
171 環境変数の設定方法は使っているシェルによって異なります。現在もっとも多く使われているシェルは、Bashでしょう。次のコマンドで使っているシェルを確認できます。
172 @example
173 $ @b{echo $SHELL}
174 /bin/bash
175 @end example
176
177 シェルがBashの場合、次のコマンドを実行すると環境変数@var{PATH}にYACASL2のディレクトリーが追加されます。
178 @example
179 $ @b{PATH=$PATH:~/yacasl2 && export PATH}
180 @end example
181
182 シェルの初期設定ファイルに上記のコマンドを追加すれば、今後ログインした後は自動的にどのディレクトリーでも @command{casl2}、@command{comet2}、@command{dumpword}を実行できるようになります。Bashの場合はホームディレクトリーにある@file{.bashrc}が初期設定ファイルのため、コマンドは次のようになります。
183 @example
184 $ @b{echo ’PATH=$PATH:~/yacasl2 && export PATH’ >>~/.bashrc}
185 @end example
186
187 @chapter YACASL2 の使い方
188 YACASL2 は、テキストファイルに記述されたCASLプログラムを処理します。以下の例で用いられるCASLプログラムのファイルは、テキストエディタなどで作成してください。また、インストールしたディレクトリーの中にある@file{as}ディレクトリーからコピーして作成することもできます。
189
190 @section 実行結果の出力だけを表示
191
192 @subsection @file{hello.casl}
193 インストール時にコマンド実行の確認に使った@file{hello.casl}は、次のような内容です。CASL IIのマクロ命令OUTは、文字列を出力します。
194 @example
195 $ @b{cat hello.casl}
196 MAIN     START
197          OUT     OBUF,LEN
198          RET
199 OBUF     DC      ’Hello, World!’
200 LEN      DC      13
201          END
202 @end example
203
204 次のコマンドを実行すると、CASL II のアセンブルと仮想マシン COMET II 上での実行が連続で行われ、文字列が出力されます。
205 @example
206 $ @b{casl2 hello.casl}
207 Hello, World!
208 @end example
209
210 @subsection @file{addl.casl}
211 3 と 1 の和を求める@file{addl.casl}は、次のような内容です。
212 @example
213 $ @b{cat addl.casl}
214 ;;; ADDL r,adr
215 MAIN     START
216          LD      GR1,A
217          ADDL    GR1,B
218          RET
219 A        DC      3
220 B        DC      1
221          END
222 @end example
223
224 このプログラムには出力命令がないため、オプションなしで実行した場合には結果が出力されません。
225 @example
226 $ @b{casl2 addl.casl}
227 $
228 @end example
229
230 実行内容を確認するには、後述のようにCPU 内にあるレジスターやメモリーの内容を表示するか、結果を出力するための処理を追加する必要があります。
231
232 @section アセンブル結果の確認
233 casl2の処理途中で行われるアセンブルの結果を表示するには、オプション@option{-a}を指定します。また、ラベルとアドレスの対応表を表示するには、オプション@option{-l}を指定します。
234
235 @subsection @file{hello.casl}
236 次のコマンドでは、@file{hello.casl}のラベルとアドレスの対応表と、アセンブル結果と、実行結果が表示されます。OUTはアセンブラ命令で複数の機械語命令で構成されているため、命令行1行に対して、複数行のコードが生成されます。
237
238 @example
239 $ @b{casl2 -a -l hello.casl}
240
241 Assemble hello.casl (0)
242
243 Label::::
244 MAIN.LEN ---> #0020
245 MAIN ---> #0000
246 MAIN.OBUF ---> #0013
247
248 Assemble hello.casl (1)
249 hello.casl:    1:MAIN    START
250 hello.casl:    2:        OUT     OBUF,LEN
251     #0000   #7001
252     #0001   #0000
253     #0002   #7002
254     #0003   #0000
255     #0004   #1210
256     #0005   #0013
257     #0006   #1220
258     #0007   #0020
259     #0008   #F000
260     #0009   #0002
261     #000A   #1210
262     #000B   #0021
263     #0021   #000A
264     #000C   #1220
265     #000D   #0022
266     #0022   #0001
267     #000E   #F000
268     #000F   #0002
269     #0010   #7120
270     #0011   #7110
271 hello.casl:    3:        RET
272     #0012   #8100
273 hello.casl:    4:OBUF    DC      'Hello, World!'
274     #0013   #0048
275     #0014   #0065
276     #0015   #006C
277     #0016   #006C
278     #0017   #006F
279     #0018   #002C
280     #0019   #0020
281     #001A   #0057
282     #001B   #006F
283     #001C   #0072
284     #001D   #006C
285     #001E   #0064
286     #001F   #0021
287 hello.casl:    5:LEN     DC      13
288     #0020   #000D
289 hello.casl:    6:        END
290 Hello, World!
291 @end example
292
293 @subsection @file{addl.casl}
294 @file{addl.casl}のラベルとアドレスの対応表と、アセンブル結果は、次のようになります。
295
296 @example
297 $ @b{casl2 -a -l addl.casl}
298
299 Assemble addl.casl (0)
300
301 Label::::
302 MAIN.A ---> #0005
303 MAIN.B ---> #0006
304 MAIN ---> #0000
305
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
310     #0000   #1010
311     #0001   #0005
312 addl.casl:    4:        ADDL    GR1,B
313     #0002   #2210
314     #0003   #0006
315 addl.casl:    5:        RET
316     #0004   #8100
317 addl.casl:    6:A       DC      3
318     #0005   #0003
319 addl.casl:    7:B       DC      1
320     #0006   #0001
321 addl.casl:    8:        END
322 @end example
323
324 なお、オプション@option{-A}を指定すると、アセンブル結果だけが表示され、仮想マシンCOMET II での実行は行われません。
325
326 @section 実行時のレジスターとメモリーを表示
327 YACASL2では実行中のCPUのレジスターとメモリーの内容をそれぞれ、@option{-t}と@option{-d}を指定することで表示できます。
328
329 また、@option{-M}で、仮想マシンCOMET II のメモリー容量を語(16 ビット)単位で指定できます。小さいプログラムを実行するときは、メモリー容量を小さくすれば結果が見やすくなります。
330
331 @subsection @file{addl.casl}
332 @file{addl.casl}に必要なメモリー容量は8語のため、次のようにCPUのレジスターとメモリーの内容を表示できます。
333
334 @example
335 $ @b{casl2 -t -d -M8 addl.casl | less}
336
337 Assemble addl.casl (0)
338
339 Assemble addl.casl (1)
340
341 Executing machine codes
342 #0000: Register::::
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
354 #0000: Memory::::
355 #0000: adr : 0000 0001 0002 0003 0004 0005 0006 0007
356 #0000: 0000: 1010 0005 2210 0006 8100 0003 0001 0000 
357 #0002: Register::::
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
369 #0002: Memory::::
370 #0002: adr : 0000 0001 0002 0003 0004 0005 0006 0007
371 #0002: 0000: 1010 0005 2210 0006 8100 0003 0001 0000 
372 #0004: Register::::
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
384 #0004: Memory::::
385 #0004: adr : 0000 0001 0002 0003 0004 0005 0006 0007
386 #0004: 0000: 1010 0005 2210 0006 8100 0003 0001 0000 
387 @end example
388
389 @file{addl.casl}のレジスターやメモリーの中で、実行中に値が変化しているのはGR1だけです。こうした場合は、@command{grep}を使って表示される内容を絞り込むことで動作を検証しやすくなります。
390
391 @example
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
396 @end example
397
398 ここで、先に実行した@file{addl.casl}のアセンブル結果をもう一度見てください。
399 次の表のように、PRとGR1、命令行が対応していることがわかります。
400
401 @multitable @columnfractions .3 .3 .4
402 @item PR @tab GR1 @tab 命令行
403 @item #0000
404 @tab #0000
405 @item #0002
406 @tab #0003
407 @tab @code{LD GR1,A}
408 @item #0004
409 @tab #0004
410 @tab @code{ADDL GR1,B}
411 @end multitable
412 @bye