From 47d99698d05ba013337f543a2b4bb16cdc39dd52 Mon Sep 17 00:00:00 2001 From: j8takagi Date: Tue, 2 Mar 2010 20:58:19 +0900 Subject: [PATCH] =?utf8?q?=E5=85=AC=E9=96=8B=E3=81=AE=E3=81=9F=E3=82=81?= =?utf8?q?=E3=80=81=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E3=82=92=E6=95=B4?= =?utf8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- LICENSE | 19 ++ README | 213 ++----------- TODO | 7 - doc/.gitignore | 1 - doc/Makefile | 2 +- doc/yacasl2.html | 766 +++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 805 insertions(+), 203 deletions(-) create mode 100644 LICENSE delete mode 100644 TODO create mode 100644 doc/yacasl2.html diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f89fa41 --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2010 j8takagi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/README b/README index 88a2cf3..2dc338e 100644 --- a/README +++ b/README @@ -1,203 +1,28 @@ このファイルは、YACASL2のREADMEファイルです。 -■機能概要 -■要件 -■コンパイル方法 -■実行方法 +■概要 +■ドキュメント +■Webサイト ■ライセンス -■機能概要 -YACASL2は、Linux上で動作するオープンソースのCASL II処理系。 -CASL IIは、情報処理試験で用いられるアセンブラ言語。 -仕様は、次の資料「試験で使用する情報処理用語・プログラム言語など」(2008年10月版)の -中にある「別紙 1 アセンブラ言語の仕様」参照。\ - http://www.jitec.ipa.go.jp/1_00topic/topic_20081027_hani_yougo.pdf (PDFファイル) +■概要 +YACASL2は、Linux上で動作するオープンソースのCASL II処理系です。 +CASL IIは、情報処理試験で用いられるアセンブラ言語で、次の資料で仕様が定義されています。 -■要件 -Linux(Ubuntu Linux 9.04/8.04とVine Linux 4.2で動作確認) -インストールに、gcc、makeが必要 + 試験で使用する情報処理用語・プログラム言語など(2008年10月版) + http://www.jitec.ipa.go.jp/1_00topic/topic_20081027_hani_yougo.pdf (PDFファイル) + 別紙 1 アセンブラ言語の仕様 -■コンパイル -yacasl2.tar.gz をダウンロードし、シェルで次のコマンド実行。 +■ドキュメント +YACASL2の要件、インストール方法、使い方などは次のドキュメントを参照してください。 +doc/yacasl2.html - $ tar xvzf yacasl2.tar.gz - $ cd yacasl2 - $ make +■Webサイト +次のURLを参照してください。 +http://www.j8takagi.net/yacasl2/ -コンパイル後、次のコマンドでレグレッションテスト可能。 +■ライセンス +Copyright 2010, j8takagi. +YACASL2 is licensed under the MIT license. - $ make check - -■実行方法 -※asディレクトリに、サンプルのcaslファイルを格納しています。 -1. アセンブラファイルをアセンブルし、仮想システムCOMET II上で実行 - - $ ./casl2 as/hello.casl - Hello, World! - -2. アセンブラファイルの、ラベルの解析結果とアセンブル詳細結果を出力。 - - $ ./casl2 -al as/FUNC/sum_10.casl - as/CMD/ld0.casl: 1:MAIN START - as/CMD/ld0.casl: 2: LAD GR1,3 - #0000 #1210 - #0001 #0003 - as/CMD/ld0.casl: 3: LD GR0,GR1 - #0002 #1401 - as/CMD/ld0.casl: 4: RET - #0003 #8100 - as/CMD/ld0.casl: 5: END - -3. アセンブラファイルを仮想システムCOMET II上で実行し、 - レジスタの内容を出力 - - $ ./casl2 -t as/CMD/ld0.casl - - Assemble as/CMD/ld0.casl (0) - - Assemble as/CMD/ld0.casl (1) - - Executing machine codes - #0000: Register:::: - #0000: GR0: 0 = #0000 = 0000000000000000 - #0000: GR1: 0 = #0000 = 0000000000000000 - #0000: GR2: 0 = #0000 = 0000000000000000 - #0000: GR3: 0 = #0000 = 0000000000000000 - #0000: GR4: 0 = #0000 = 0000000000000000 - #0000: GR5: 0 = #0000 = 0000000000000000 - #0000: GR6: 0 = #0000 = 0000000000000000 - #0000: GR7: 0 = #0000 = 0000000000000000 - #0000: SP: 512 = #0200 = 0000001000000000 - #0000: PR: 0 = #0000 = 0000000000000000 - #0000: FR (OF SF ZF): 000 - - #0002: Register:::: - #0002: GR0: 0 = #0000 = 0000000000000000 - #0002: GR1: 3 = #0003 = 0000000000000011 - #0002: GR2: 0 = #0000 = 0000000000000000 - #0002: GR3: 0 = #0000 = 0000000000000000 - #0002: GR4: 0 = #0000 = 0000000000000000 - #0002: GR5: 0 = #0000 = 0000000000000000 - #0002: GR6: 0 = #0000 = 0000000000000000 - #0002: GR7: 0 = #0000 = 0000000000000000 - #0002: SP: 512 = #0200 = 0000001000000000 - #0002: PR: 2 = #0002 = 0000000000000010 - #0002: FR (OF SF ZF): 000 - - #0003: Register:::: - #0003: GR0: 3 = #0003 = 0000000000000011 - #0003: GR1: 3 = #0003 = 0000000000000011 - #0003: GR2: 0 = #0000 = 0000000000000000 - #0003: GR3: 0 = #0000 = 0000000000000000 - #0003: GR4: 0 = #0000 = 0000000000000000 - #0003: GR5: 0 = #0000 = 0000000000000000 - #0003: GR6: 0 = #0000 = 0000000000000000 - #0003: GR7: 0 = #0000 = 0000000000000000 - #0003: SP: 512 = #0200 = 0000001000000000 - #0003: PR: 3 = #0003 = 0000000000000011 - #0003: FR (OF SF ZF): 000 - -5. アセンブラファイルの、ラベルの解析結果とアセンブル詳細結果を - 出力してから、仮想システムCOMET II上で実行。 - 実行時に、レジスタとメモリの内容を出力 - -Mで、COMET IIのメモリサイズを指定できる。 - - $ ./casl2 -td -M 16 as/CMD/st0.casl - - Assemble as/CMD/st0.casl (0) - - Assemble as/CMD/st0.casl (1) - - Executing machine codes - #0000: Register:::: - #0000: GR0: 0 = #0000 = 0000000000000000 - #0000: GR1: 0 = #0000 = 0000000000000000 - #0000: GR2: 0 = #0000 = 0000000000000000 - #0000: GR3: 0 = #0000 = 0000000000000000 - #0000: GR4: 0 = #0000 = 0000000000000000 - #0000: GR5: 0 = #0000 = 0000000000000000 - #0000: GR6: 0 = #0000 = 0000000000000000 - #0000: GR7: 0 = #0000 = 0000000000000000 - #0000: SP: 16 = #0010 = 0000000000010000 - #0000: PR: 0 = #0000 = 0000000000000000 - #0000: FR (OF SF ZF): 000 - #0000: Memory:::: - #0000: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F - #0000: 0000: 1200 011E 1100 0005 8100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 - - #0002: Register:::: - #0002: GR0: 286 = #011E = 0000000100011110 - #0002: GR1: 0 = #0000 = 0000000000000000 - #0002: GR2: 0 = #0000 = 0000000000000000 - #0002: GR3: 0 = #0000 = 0000000000000000 - #0002: GR4: 0 = #0000 = 0000000000000000 - #0002: GR5: 0 = #0000 = 0000000000000000 - #0002: GR6: 0 = #0000 = 0000000000000000 - #0002: GR7: 0 = #0000 = 0000000000000000 - #0002: SP: 16 = #0010 = 0000000000010000 - #0002: PR: 2 = #0002 = 0000000000000010 - #0002: FR (OF SF ZF): 000 - #0002: Memory:::: - #0002: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F - #0002: 0000: 1200 011E 1100 0005 8100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 - - #0004: Register:::: - #0004: GR0: 286 = #011E = 0000000100011110 - #0004: GR1: 0 = #0000 = 0000000000000000 - #0004: GR2: 0 = #0000 = 0000000000000000 - #0004: GR3: 0 = #0000 = 0000000000000000 - #0004: GR4: 0 = #0000 = 0000000000000000 - #0004: GR5: 0 = #0000 = 0000000000000000 - #0004: GR6: 0 = #0000 = 0000000000000000 - #0004: GR7: 0 = #0000 = 0000000000000000 - #0004: SP: 16 = #0010 = 0000000000010000 - #0004: PR: 4 = #0004 = 0000000000000100 - #0004: FR (OF SF ZF): 000 - #0004: Memory:::: - #0004: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F - #0004: 0000: 1200 011E 1100 0005 8100 011E 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 - - -6. アセンブラファイルのアセンブラ結果をオブジェクトファイルadd.oに出力し、 - comet2コマンドでadd.oを仮想システムCOMET II上で実行。 - - $ ./casl2 -Ofib.o as/FUNC/fib_outl.casl as/FUNC/outl.casl - $ ./comet2 fib.o - 0 - 1 - 1 - 2 - 3 - 5 - 8 - 13 - 21 - 34 - 55 - 89 - 144 - 233 - 377 - 610 - 987 - 1597 - 2584 - 4181 - 6765 - 10946 - 17711 - 28657 - 46368 - -7. オプションの確認 - - $ ./casl2 --help - Usage: ./casl2 [-tdslaAh] [-o ] FILE ... - $ ./comet2 --help - Usage: ./comet2 [-tdh] FILE - -詳細は、チュートリアル(作成予定)参照。 - -■ライセンス -Copyright (C) 2010 j8takagi (j8takagi@nifty.com) -(未定。GPL or 修正BSDの予定) +詳細は、LICENSEを参照してください。 diff --git a/TODO b/TODO deleted file mode 100644 index 7ec06ca..0000000 --- a/TODO +++ /dev/null @@ -1,7 +0,0 @@ -*ユニットテスト -*Autoconf導入 -*copyright -*過去問追加 -*チュートリアル -*info -*デジタル署名 diff --git a/doc/.gitignore b/doc/.gitignore index 6e7ed33..6f0dbad 100644 --- a/doc/.gitignore +++ b/doc/.gitignore @@ -2,5 +2,4 @@ html texobj yacasl2.pdf yacasl2.dvi -yacasl2.html yacasl2.info diff --git a/doc/Makefile b/doc/Makefile index d6bc28b..87999f6 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -28,4 +28,4 @@ $(DOCNAME).dvi: $(SRC) TEX=ptex texi2dvi --texinfo=@afourpaper -o ../$@ ../$^; \ cd - clean: - @rm -rf html $(TEXOBJDIR) $(DOCNAME).info $(DOCNAME).html $(DOCNAME).dvi $(DOCNAME).pdf + @rm -rf html $(TEXOBJDIR) $(DOCNAME).info $(DOCNAME).dvi $(DOCNAME).pdf diff --git a/doc/yacasl2.html b/doc/yacasl2.html new file mode 100644 index 0000000..5924b6a --- /dev/null +++ b/doc/yacasl2.html @@ -0,0 +1,766 @@ + + +YACASL2 - Linux上のCASL II処理系 + + + + + + + + + + +

YACASL2 - Linux上のCASL II処理系

+ + + + +

+ + +

1 YACASL2の概要

+ +

YACASL2は、Linux上で動作するオープンソースのCASL II処理系です。CASL IIは情報処理試験で用いられるアセンブラ言語で、次の資料により仕様が公開されています。 + +

+試験で使用する情報処理用語・プログラム言語など(2008年10月版)[PDFファイル] +別紙 1 アセンブラ言語の仕様 +
+ +

YACASL2は、CASL IIアセンブラ言語で記述されたファイルをアセンブルし、仮想マシンCOMET II上で実行します。アセンブルと実行は、連続で行うことも別々に行うことも可能です。 +YACASL2の動作はCASL IIの仕様に準拠しているため、情報処理試験の問題をはじめ各種参考書やサイトに記載されたCASL IIのプログラムをそのままアセンブルして実行できます。また、本パッケージ中にCASL IIのサンプルプログラムが多数収録されています。 + +

YACASL2は、「ふつうの処理系」として動作します。ほかの多くのCASL IIエミュレータと違い、デバッガとして動作したり、コンピュータ内部の模式図を表示したりすることはありません。そのかわり、YACASL2は、次のような動作内容をすべてテキストで出力します。 + +

+ +

出力された動作内容は、GNU/Linuxのさまざまなツール、たとえばcat、less、grep、wcなどを使って解析できます。 + +

YACASL2の操作は、端末を開いてコマンドを入力・実行することで行います。 + +

要件

+ +

YACASL2は、Linux上で動作します。現在動作を確認しているのは、次のディストリビューションです。 + +

+ +

インストール時に、tar、gcc、makeが必要です。 + +

+ + +

2 YACASL2のインストール

+ +

YACASL2をインストールするには、Linux上で次の作業をします。 + +

    + +
  1. yacasl2.tar.gzのダウンロード + +
  2. yacasl2.tar.gzの検証 + +
  3. yacasl2.tar.gzの展開 + +
  4. casl2、comet2、dumpwordのビルド + +
  5. casl2の実行テスト + +
  6. 詳細なテスト + +
  7. 環境変数PATHの設定 +
+ +

2.1 yacasl2.tar.gzのダウンロード

+ +

(詳細未定) + +

  $ cd
+  $ wget somewhere/yacasl2.tar.gz
+  $ wget somewhere/yacasl2.tar.gz.md5sum
+
+

2.2 yacasl2.tar.gzの検証

+ +

(PGPを使った検証も導入予定) + +

ダウンロードが完了したら、md5sumとdiffで正しくファイルがダウンロードができているかを検証します。 + +

  $ md5sum yacasl2.tar.gz | diff -s yacasl2.tar.gz.md5sum -
+  Files yacasl2.tar.gz.md5sum and - are identical
+
+

2.3 yacasl2.tar.gzの展開

+ +

yacasl2.tar.gzをダウンロードしたら、次のコマンドで展開します。 + +

  $ tar xvzf yacasl2.tar.gz
+
+

2.4 casl2、comet2、dumpwordのビルド

+ +

展開したら、次のコマンドでcasl2、comet2、dumpwordをビルドします。 + +

  $ cd yacasl2
+  $ make
+  make -C src
+  make[1]: Entering directory ‘/home/kazubito/yacasl2/src’
+  gcc -c -g -Wall -I ../include casl2.c
+  gcc -c -g -Wall -I ../include word.c
+  gcc -c -g -Wall -I ../include hash.c
+  gcc -c -g -Wall -I ../include cerr.c
+  gcc -c -g -Wall -I ../include struct.c
+  gcc -c -g -Wall -I ../include cmd.c
+  gcc -c -g -Wall -I ../include assemble.c
+  gcc -c -g -Wall -I ../include token.c
+  gcc -c -g -Wall -I ../include label.c
+  gcc -c -g -Wall -I ../include macro.c
+  gcc -c -g -Wall -I ../include exec.c
+  gcc -c -g -Wall -I ../include dump.c
+  gcc -g -Wall -I ../include -o ../casl2 casl2.o word.o hash.o cerr.o st
+  ruct.o cmd.o assemble.o token.o label.o macro.o exec.o dump.o
+  gcc -c -g -Wall -I ../include comet2.c
+  gcc -g -Wall -I ../include -o ../comet2 comet2.o word.o hash.o cerr.o
+  struct.o cmd.o exec.o dump.o
+  gcc -c -g -Wall -I ../include dumpword.c
+  gcc -g -Wall -I ../include -o ../dumpword dumpword.o word.o cerr.o
+  make[1]: Leaving directory ‘/home/kazubito/yacasl2/src’
+
+

2.5 casl2の実行テスト

+ +

ビルドしたら、次のコマンドが正常に実行できるかを確認します。 +正常に実行された場合は、「Hello, World!」と表示されます。 + +

  $ ./casl2 as/hello.casl
+  Hello, World!
+
+

2.6 詳細なテスト

+ +

次のコマンドを実行すると、正常にビルドできているかどうかを詳細にテストできます。 + +

  $ make check
+  194 / 194 tests passed. Details in /home/kazubito/yacasl2/test/integra
+  tion/casl2/Test.log
+  All tests are succeded.
+  149 / 149 tests passed. Details in /home/kazubito/yacasl2/test/integra
+  tion/comet2/Test.log
+  All tests are succeded.
+  4 / 4 tests passed. Details in /home/kazubito/yacasl2/test/integration
+  /dumpword/Test.log
+  All tests are succeded.
+
+

2.7 環境変数PATHの設定

+ +

環境変数PATHにYACASL2のディレクトリを追加すると、どのディレクトリでもcasl2、comet2、dumpwordを実行できます。 + +

環境変数の設定方法は使っているシェルによって異なります。シェルは、次のコマンドで確認できます。 + +

  $ echo $SHELL
+  /bin/bash
+
+

現在もっとも多く使われているシェルは、BASHでしょう。BASHでは、次のコマンドを実行すると環境変数PATHにYACASL2のディレクトリが追加されます。 + +

  $ PATH=$PATH:~/yacasl2 && export PATH
+
+

シェルの初期設定ファイルに上記のコマンドを追加すれば、今後ログインした後は自動的にどのディレクトリでも casl2、comet2、dumpwordを実行できます。BASHではホームディレクトリにある.bashrcが初期設定ファイルのため、次のコマンドで追加されます。 + +

  $ echo ’PATH=$PATH:~/yacasl2 && export PATH’ >>~/.bashrc
+
+

+ + +

3 YACASL2 の使い方

+ +

YACASL2 は、テキストファイルに記述されたCASLプログラムを処理します。以下の例で用いられるCASLプログラムのファイルは、テキストエディタなどで作成してください。また、インストールしたディレクトリの中にあるasディレクトリからコピーして作成することもできます。 + +

3.1 実行結果の出力だけを表示

+ +

インストール時にコマンド実行の確認に使ったhello.caslは、次のような内容です。CASL IIのマクロ命令OUTは、文字列を出力します。 + +

  $ cat hello.casl
+  MAIN     START
+           OUT     OBUF,LEN
+           RET
+  OBUF     DC      ’Hello, World!’
+  LEN      DC      13
+           END
+
+

次のコマンドを実行すると、CASL II のアセンブルと仮想マシン COMET II 上での実行が連続で行われ、文字列が出力されます。 + +

  $ casl2 hello.casl
+  Hello, World!
+
+

addl.caslは、3と1の和を求めます。 + +

  $ cat addl.casl
+  ;;; ADDL r,adr
+  MAIN     START
+           LD      GR1,A
+           ADDL    GR1,B
+           RET
+  A        DC      3
+  B        DC      1
+           END
+
+

このプログラムには出力命令がないため、オプションなしで実行した場合には結果が出力されません。 + +

  $ casl2 addl.casl
+  $
+
+

実行内容を確認するには、後述のようにCPU 内にあるレジスタやメモリの内容を表示するか、結果を出力するための処理を追加する必要があります。 + +

sum_10.caslは、1から10までの整数の和を求めます。 + +

  $ cat sum_10.casl
+  ;;; sum_10.casl
+  ;;; 出力 GR0: 1から10までの整数をすべて加算した値
+  MAIN    START
+          PUSH    0,GR1
+          LAD     GR0,0           ; GR0を初期化
+          LD      GR1,FST         ; GR1に初項を転送
+  LOOP    ADDL    GR0,GR1         ; ループ先頭
+          ADDL    GR1,STEP        ; GR1 <- GR1 + 公差
+          CPL     GR1,LST         ; GR1が末項より大きい場合は終了
+          JPL     FIN             ; ↓
+          JUMP    LOOP            ; ループ終端
+  FIN     POP     GR1
+          RET
+  FST     DC      1               ; 初項
+  LST     DC      10              ; 末項
+  STEP    DC      1               ; 公差
+          END
+
+

このプログラムも、オプションなしで実行した場合には結果が出力されません。 +

  $ casl2 sum_10.casl
+  $
+
+

3.2 アセンブル結果の確認

+ +

casl2の処理途中で行われるアセンブルの結果を表示するには、オプション-aを指定します。また、ラベルとアドレスの対応表を表示するには、オプション-lを指定します。 + +

次のコマンドではhello.caslの、ラベルとアドレスの対応表と、アセンブル結果と、実行結果が表示されます。OUTはアセンブラ命令で複数の機械語命令で構成されているため、命令行1行に対して、複数行のコードが生成されます。 + +

  $ casl2 -a -l hello.casl
+  
+  Assemble hello.casl (0)
+  
+  Label::::
+  MAIN.LEN ---> #0020
+  MAIN ---> #0000
+  MAIN.OBUF ---> #0013
+  
+  Assemble hello.casl (1)
+  hello.casl:    1:MAIN    START
+  hello.casl:    2:        OUT     OBUF,LEN
+      #0000   #7001
+      #0001   #0000
+      #0002   #7002
+      #0003   #0000
+      #0004   #1210
+      #0005   #0013
+      #0006   #1220
+      #0007   #0020
+      #0008   #F000
+      #0009   #0002
+      #000A   #1210
+      #000B   #0021
+      #0021   #000A
+      #000C   #1220
+      #000D   #0022
+      #0022   #0001
+      #000E   #F000
+      #000F   #0002
+      #0010   #7120
+      #0011   #7110
+  hello.casl:    3:        RET
+      #0012   #8100
+  hello.casl:    4:OBUF    DC      'Hello, World!'
+      #0013   #0048
+      #0014   #0065
+      #0015   #006C
+      #0016   #006C
+      #0017   #006F
+      #0018   #002C
+      #0019   #0020
+      #001A   #0057
+      #001B   #006F
+      #001C   #0072
+      #001D   #006C
+      #001E   #0064
+      #001F   #0021
+  hello.casl:    5:LEN     DC      13
+      #0020   #000D
+  hello.casl:    6:        END
+  Hello, World!
+
+

addl.caslの、ラベルとアドレスの対応表と、アセンブル結果は、次のようになります。 + +

  $ casl2 -a -l addl.casl
+  
+  Assemble addl.casl (0)
+  
+  Label::::
+  MAIN.A ---> #0005
+  MAIN.B ---> #0006
+  MAIN ---> #0000
+  
+  Assemble addl.casl (1)
+  addl.casl:    1:;;; ADDL r,adr
+  addl.casl:    2:MAIN    START
+  addl.casl:    3:        LD      GR1,A
+      #0000   #1010
+      #0001   #0005
+  addl.casl:    4:        ADDL    GR1,B
+      #0002   #2210
+      #0003   #0006
+  addl.casl:    5:        RET
+      #0004   #8100
+  addl.casl:    6:A       DC      3
+      #0005   #0003
+  addl.casl:    7:B       DC      1
+      #0006   #0001
+  addl.casl:    8:        END
+
+

なお、オプション-Aを指定すると、アセンブル結果が表示される時点で処理が終了します。仮想マシンCOMET II での実行は行われません。 + +

3.3 実行時のレジスタとメモリを表示

+ +

YACASL2では実行中のCPUのレジスタとメモリの内容をそれぞれ、-tと-dを指定することで表示できます。 + +

また、-Mで、仮想マシンCOMET II のメモリ容量を語(16 ビット)単位で指定できます。小さいプログラムを実行するときは、メモリ容量を小さくすれば結果が見やすくなります。 + +

addl.caslに必要なメモリ容量は8語のため、次のようにCPUのレジスタとメモリの内容を表示できます。 + +

  $ casl2 -t -d -M8 addl.casl | less
+  
+  Assemble addl.casl (0)
+  
+  Assemble addl.casl (1)
+  
+  Executing machine codes
+  #0000: Register::::
+  #0000: GR0:      0 = #0000 = 0000000000000000
+  #0000: GR1:      0 = #0000 = 0000000000000000
+  #0000: GR2:      0 = #0000 = 0000000000000000
+  #0000: GR3:      0 = #0000 = 0000000000000000
+  #0000: GR4:      0 = #0000 = 0000000000000000
+  #0000: GR5:      0 = #0000 = 0000000000000000
+  #0000: GR6:      0 = #0000 = 0000000000000000
+  #0000: GR7:      0 = #0000 = 0000000000000000
+  #0000: SP:       8 = #0008 = 0000000000001000
+  #0000: PR:       0 = #0000 = 0000000000000000
+  #0000: FR (OF SF ZF): 000
+  #0000: Memory::::
+  #0000: adr : 0000 0001 0002 0003 0004 0005 0006 0007
+  #0000: 0000: 1010 0005 2210 0006 8100 0003 0001 0000
+  #0002: Register::::
+  #0002: GR0:      0 = #0000 = 0000000000000000
+  #0002: GR1:      3 = #0003 = 0000000000000011
+  #0002: GR2:      0 = #0000 = 0000000000000000
+  #0002: GR3:      0 = #0000 = 0000000000000000
+  #0002: GR4:      0 = #0000 = 0000000000000000
+  #0002: GR5:      0 = #0000 = 0000000000000000
+  #0002: GR6:      0 = #0000 = 0000000000000000
+  #0002: GR7:      0 = #0000 = 0000000000000000
+  #0002: SP:       8 = #0008 = 0000000000001000
+  #0002: PR:       2 = #0002 = 0000000000000010
+  #0002: FR (OF SF ZF): 000
+  #0002: Memory::::
+  #0002: adr : 0000 0001 0002 0003 0004 0005 0006 0007
+  #0002: 0000: 1010 0005 2210 0006 8100 0003 0001 0000
+  #0004: Register::::
+  #0004: GR0:      0 = #0000 = 0000000000000000
+  #0004: GR1:      4 = #0004 = 0000000000000100
+  #0004: GR2:      0 = #0000 = 0000000000000000
+  #0004: GR3:      0 = #0000 = 0000000000000000
+  #0004: GR4:      0 = #0000 = 0000000000000000
+  #0004: GR5:      0 = #0000 = 0000000000000000
+  #0004: GR6:      0 = #0000 = 0000000000000000
+  #0004: GR7:      0 = #0000 = 0000000000000000
+  #0004: SP:       8 = #0008 = 0000000000001000
+  #0004: PR:       4 = #0004 = 0000000000000100
+  #0004: FR (OF SF ZF): 000
+  #0004: Memory::::
+  #0004: adr : 0000 0001 0002 0003 0004 0005 0006 0007
+  #0004: 0000: 1010 0005 2210 0006 8100 0003 0001 0000
+
+

3.3.1 特定のレジスタを表示

+ +

addl.caslのレジスタやメモリの中で、実行中に値が変化しているのはGR1だけです。こうした場合は、grepを使って表示される内容を絞り込むことで動作を検証しやすくなります。 + +

  $ casl2 -t addl.casl | grep 'GR1:'
+  #0000: GR1:      0 = #0000 = 0000000000000000
+  #0002: GR1:      3 = #0003 = 0000000000000011
+  #0004: GR1:      4 = #0004 = 0000000000000100
+
+

この内容を、先に出力したアセンブル結果と引き比べてください。 +次の表のように、PRとGR1、命令行が対応していることがわかります。 + +

PR GR1 命令行 +
#0000 +#0000 +
#0002 +#0003 +LD GR1,A +
#0004 +#0004 +ADDL GR1,B +
+ +

3.3.2 プログラム終了時の値を表示

+ +

grepとtailを組み合わせれば、プログラム終了時の値を表示できます。 + +

  $ casl2 -t addl.casl | grep 'GR1:' | tail -1
+  #0004: GR1:      4 = #0004 = 0000000000000100
+
+
  $ casl2 -t sum_10.casl | grep 'GR0:' | tail -1
+  #0010: GR0:     55 = #0037 = 0000000000110111 = '7'
+
+

3.3.3 プログラムのステップ数を表示

+ +

grepとwcを組み合わせれば、プログラムのステップ数を表示できます。 + +

  $ casl2 -t hello.casl | grep 'GR1:' | wc -l
+  11
+
+
  $ casl2 -t addl.casl | grep 'GR1:' | wc -l
+  3
+
+

sum_10.caslはプログラム内にループがあるため、ステップ数が大きくなります。 + +

  $ casl2 -t sum_10.casl | grep 'GR0:' | wc -l
+  54
+
+

3.4 アセンブルと実行を別に行う

+ +

casl2に-Oファイル名を指定すると、オブジェクトファイルを作成できます。 + +

  $ casl2 -Ohello.o hello.casl
+
+

作成されたオブジェクトファイルの内容は、odを使って確認できます。テキストファイルではないため、catなどでは確認できません。 + +

  $ od -t x2 hello.o
+  0000000 7001 0000 7002 0000 1210 0013 1220 0020
+  0000020 f000 0002 1210 0021 1220 0022 f000 0002
+  0000040 7120 7110 8100 0048 0065 006c 006c 006f
+  0000060 002c 0020 0057 006f 0072 006c 0064 0021
+  0000100 000d 000a 0001
+  0000106
+
+

オブジェクトファイルの実行には、comet2を使います。 + +

  $ comet2 hello.o
+  Hello, World!
+
+

3.5 1語の解析

+ +

CASL IIでは、1語(16ビット)を単位としてデータが処理されます。 +dumpwordは、指定した1語を10進数、16進数、2進数で表示します。 + +

  $ dumpword 72
+      72:     72 = #0048 = 0000000001001000 = 'H'
+
+

マイナスの数は、次のように指定します。 + +

  $ dumpword -- -72
+     -72:    -72 = #FFB8 = 1111111110111000
+
+

16進数は、次のように指定します。 + +

  $ dumpword '#0048'
+   #0048:     72 = #0048 = 0000000001001000 = 'H'
+
+

3.6 CASL2ライブラリの使用

+ +

YACASL2のas/casl2libディレクトリには、CASL IIで記述されたライブラリファイルが格納されています。 + +

このフォルダには、たとえば次のようなプログラムが含まれています。 + +

+
OUTL
outl.casl。GR1に格納された値を、0〜65535の数値として出力します。 + +
OUTA
outa.casl。GR1に格納された値を、-32767〜32767の数値として出力します。 + +
MULL
mull.casl。GR1とGR2に格納された値を0〜65535の整数と見なし、積をGR3に格納します。 + +
DIVL
divl.casl。GR1とGR2に格納された値を0〜65535の整数と見なし、商をGR3、剰余をGR0に格納します。 +
+ +

3.6.1 数値を出力する

+ +

3と1の和を求めるaddl.caslで演算結果を出力するには、まずaddl.caslを編集します。CASL IIのCALL命令でOUTLを副プログラムとして呼び出すようにします。 + +

  $ cat addl_outl.casl
+  MAIN    START
+          LD      GR1,A
+          ADDL    GR1,B
+          CALL    OUTL
+          RET
+  A       DC      3
+  B       DC      1
+          END
+
+

変更したらcasl2を、複数のファイルを指定して実行します。 + +

  $ casl2 addl_outl.casl ~/yacasl2/as/casl2lib/outl.casl
+  4
+
+

+ + +

4 YACASL2コマンドマニュアル

+ +

+YACASL2のコマンドとオプションについて解説します。 + +

+ +

4.1 casl2

+ +

+casl2は、引数として指定されたCASLファイルをアセンブルし、仮想マシンCOMET II上で実行します。CASLファイルは、アセンブラ言語CASL IIで記述されたテキストファイルです。引数が指定されない場合は、エラーメッセージを表示して終了します。 + +

  $ casl2 hello.casl
+
+

副プログラムを呼び出す場合は、複数のCASLファイルを指定することもできます。 + +

  $ casl2 addl_outl.casl ~/yacasl2/as/casl2lib/outl.casl
+
+

オプション

+ +

casl2は、次のオプションを指定できます。 + +

+
-s
--source
CASLファイルの内容を表示します。 + +
-l
--label
ラベルの一覧を表示し、ほかの作業を続行します。 + +
-L
--labelonly
ラベルの一覧を表示して終了します。 + +
-a
--assembledetail
アセンブル詳細結果を表示し、ほかの作業を続行します。 + +
-A
--show-all
アセンブル詳細結果を表示して終了します。 + +
-o<OBJECTFILE>
--assembleout
アセンブル結果をオブジェクトファイル<OBJECTFILE>に出力し、ほかの作業を続行します。出力されたオブジェクトファイルは、comet2で実行できます。オブジェクトファイルを指定しない場合、出力先はa.oです。オブジェクトファイルは1つだけ指定できます。 + +
-O<OBJECTFILE>
--assembleoutonly
アセンブル結果をオブジェクトファイル<OBJECTFILE>に出力し、終了します。出力されたオブジェクトファイルは、comet2で実行できます。オブジェクトファイルを指定しない場合、出力先はa.oです。オブジェクトファイルは1つだけ指定できます。 + +
-t
--trace
--tracearithmetic
実行時のレジスタをトレースします。レジスタには、GR0〜GR7という8個の汎用レジスタと、SP(スタックポインタ)、PR(プログラムレジスタ)、FR(フラグレジスタ)があります。レジストリの内容は、-32,768〜32,767の範囲の整数、#0000〜#FFFFの範囲の16進数、2進数で表示されます。文字の組に該当する場合は、「 = 」のうしろに文字が表示されます。-32768〜32767の範囲の整数を表示するので、算術演算の結果を確認する場合に使えます。 + +
-T
--tracelogical
-tと同じく、実行時のレジスタをトレースします。-tと異なり0〜65,535の範囲の整数を表示するので、論理演算の結果を確認する場合に使えます。 + +
-d
--dump
メモリの内容をすべて表示します。 + +
-M <MEMORYSIZE>
--memorysize <MEMORYSIZE>
アセンブルおよび実行時のメモリサイズ<MEMORYSIZE>を0〜65,535の範囲で指定します。指定しない場合、メモリサイズは512です。 + +
-C <CLOCKS>
--clocks <CLOCKS>
実行時のクロック周波数<CLOCKS>を0より大きい整数で指定します。指定しない場合、クロック周波数は5000000です。 + +
-h
--help
casl2の使用方法を表示して終了します。 +
+ +

+ +

4.2 comet2

+ +

+comet2は、引数として指定されたオブジェクトファイルを仮想マシンCOMET II上で実行します。オブジェクトファイルは、caslに-oまたは-Oを指定して出力します。 + +

  $ comet2 hello.o
+
+

引数で指定できるオブジェクトファイルは1つだけです。引数が指定されない場合は、エラーメッセージを表示して終了します。複数の引数を指定した場合、2番目以降の引数は無視されます。 + +

オプション

+ +

comet2は、次のオプションを指定できます。 + +

+
-t
--trace
--tracearithmetic
実行時のレジスタをトレースします。レジスタには、GR0〜GR7という8個の汎用レジスタと、SP(スタックポインタ)、PR(プログラムレジスタ)、FR(フラグレジスタ)があります。レジストリの内容は、-32,768〜32,767の範囲の整数、#0000〜#FFFFの範囲の16進数、2進数で表示されます。文字の組に該当する場合は、「 = 」のうしろに文字が表示されます。-32768〜32767の範囲の整数が表示されるので、算術演算の結果を確認する場合に使えます。 + +
-T
--tracelogical
-tと同じく、実行時のレジスタをトレースします。-tと異なり0〜65,535の範囲の整数を表示するので、論理演算の結果を確認する場合に使えます。 + +
-d
--dump
メモリの内容をすべて表示します。 + +
-M <MEMORYSIZE>
--memorysize <MEMORYSIZE>
実行時のメモリサイズ<MEMORYSIZE>を0〜65,535の範囲で指定します。指定しない場合、メモリサイズは512です。 + +
-C <CLOCKS>
--clocks <CLOCKS>
実行時のクロック周波数<CLOCKS>を0より大きい整数で指定します。指定しない場合、クロック周波数は5,000,000です。 + +
-h
--help
comet2の使用方法を表示して終了します。 +
+ +

+ +

4.3 dumpword

+ +

+dumpwordは、引数として指定された数値を、整数、#0000〜#FFFFの範囲の16進数、2進数で表示します。文字の組に該当する場合は、「 = 」のうしろに文字が表示されます。引数は、10進数または先頭に「#」の付いた16進数で指定します。表示される整数は、オプションにより-32,768〜32,767または0〜65,535の範囲です。オプションなしの場合は、-32,768〜32,767です。 + +

  $ dumpword 10
+
+

引数で指定できる1つだけです。引数が指定されない場合は、使い方を表示して終了します。複数の引数を指定した場合、2番目以降の引数は無視されます。 + +

オプション

+ +

dumpwordは、次のオプションを指定できます。 + +

+
-a
--arithmetic
出力される整数の範囲を-32,768〜32,767にします。オプションなしの場合と同じです。 + +
-l
--logical
出力される整数の範囲を0〜65,535にします。 + +
-h
--help
dumpwordの使用方法を表示して終了します。 +
+ + + -- 2.18.0