From 33d5f89bc9adc2e46407182f6bfa8032b87ad245 Mon Sep 17 00:00:00 2001 From: j8takagi Date: Fri, 2 Nov 2012 00:22:24 +0900 Subject: [PATCH] =?utf8?q?=E3=83=89=E3=82=AD=E3=83=A5=E3=83=A1=E3=83=B3?= =?utf8?q?=E3=83=88=E3=82=92=E3=82=A4=E3=83=B3=E3=82=B9=E3=83=88=E3=83=BC?= =?utf8?q?=E3=83=AB=E3=81=AE=E8=AA=AC=E6=98=8E=E3=81=A8=E3=83=9E=E3=83=8B?= =?utf8?q?=E3=83=A5=E3=82=A2=E3=83=AB=E3=81=AB=E5=88=86=E5=89=B2=E3=81=97?= =?utf8?q?=E3=80=81=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- INSTALL | 246 +++++++++ Makefile | 5 +- README | 2 +- doc/Makefile | 70 +-- doc/casl2_spec.html | 341 ------------- doc/install.texi | 98 +++- doc/manual.texi | 2 +- doc/yacasl2.info | 1182 ------------------------------------------- 8 files changed, 357 insertions(+), 1589 deletions(-) create mode 100644 INSTALL delete mode 100644 doc/casl2_spec.html delete mode 100644 doc/yacasl2.info diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..612947f --- /dev/null +++ b/INSTALL @@ -0,0 +1,246 @@ +1 YACASL2のインストール +****************************** + +Table of Contents +***************** + +1 YACASL2のインストール + 要件 + 1.1 YACASL2ファイルのダウンロード + 1.2 YACASL2ファイルの検証 + 1.2.1 GnuPG分離署名での検証 + 1.2.2 MD5ハッシュ値での検証 + 1.3 YACASL2ファイルの展開 + 1.4 `casl2' `comet2' `dumpword'のビルド + 1.5 `casl2'の実行テスト + 1.6 詳細なテスト + 1.7 インストール + 1.8 環境変数の設定 + シェルの確認 + 1.8.1 `PATH'の設定 + 1.8.2 `INFOPATH'の設定 + 1.8.3 `CASL2LIB'の設定 + + +要件 +====== + + YACASL2は、LinuxやMac OS +Xなど、UNIX系のOS上で動作します。現在動作を確認しているのは、Ubuntu +LinuxとVine Linux、Mac OS Xです。 + + インストール時に、`tar' `gcc' +`make'が必要です。Linuxでは多くの場合、標準でインストールされています。Mac +OS Xの場合、Xcodeの「Command Line Tools」に含まれます。 + +1.1 YACASL2ファイルのダウンロード +============================================ + + YACASL2のサイト +(http://www.j8takagi.net/yacasl2/)から、`tar.gz'または`tar.xz'ファイルと、対応する検証用ファイルをダウンロードします。githubのダウンロードページ +(http://github.com/j8takagi/YACASL2/downloads/)から`tar.gz'などのファイルをダウンロードすることもできます。 + +1.2 YACASL2ファイルの検証 +================================ + + ダウンロードが完了したら、圧縮ファイルが改竄されていないか検証します。検証にはGnuPG分離署名か、MD5ハッシュ値を使います。 + +1.2.1 GnuPG分離署名での検証 +----------------------------------- + + GnuPGの`gpg'で圧縮ファイルを検証します。この検証を行うには、GnuPGがインストールされ、自分の秘密鍵と公開鍵のペアが作成されている必要があります。 + + $ gpg --verify yacasl2.tar.xz.asc + gpg: Signature made Sat Oct 27 02:17:16 2012 JST using RSA key ID 25B62DD1 + gpg: Can't check signature: public key not found + $ gpg --recv-keys 25B62DD1 + gpg: requesting key 25B62DD1 from hkp server keys.gnupg.net + gpg: key 25B62DD1: public key "j8takagi " imported + gpg: Total number processed: 1 + gpg: imported: 1 (RSA: 1) + + $ gpg --lsign-key 25B62DD1 + + pub 2048R/25B62DD1 created: 2012-09-29 expires: never usage: SC + trust: unknown validity: full + sub 2048R/92E25C29 created: 2012-09-29 expires: never usage: E + [ full ] (1). j8takagi + + + pub 2048R/25B62DD1 created: 2012-09-29 expires: never usage: SC + trust: unknown validity: full + Primary key fingerprint: ... + + .* <.*@.*> + + Are you sure that you want to sign this key with your + key ".* <.*@.*>" + + The signature will be marked as non-exportable. + + Really sign? (y/N) y + + You need a passphrase to unlock the secret key for + user: ".* <.*@.*>" + 2048-bit RSA key, ID ........, created 20..-..-.. + + password + + $ gpg --verify yacasl2.tar.xz.asc + gpg: Signature made Sat Oct 27 02:17:16 2012 JST using RSA key ID 25B62DD1 + gpg: checking the trustdb + gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model + gpg: depth: 0 valid: 1 signed: 4 trust: 0-, 0q, 0n, 0m, 0f, 1u + gpg: depth: 1 valid: 4 signed: 0 trust: 4-, 0q, 0n, 0m, 0f, 0u + gpg: Good signature from "j8takagi " + +1.2.2 MD5ハッシュ値での検証 +------------------------------------ + + `openssl'と`diff'で圧縮ファイルを検証します。 + + $ openssl md5 yacasl2.tar.gz | diff -s yacasl2.tar.gz.md5sum - + Files yacasl2.tar.gz.md5sum and - are identical + +1.3 YACASL2ファイルの展開 +================================ + + YACASL2ファイルをダウンロードしたら、`tar'コマンドで展開します。 + + $ tar xvzf yacasl2.tar.gz + +1.4 `casl2' `comet2' `dumpword'のビルド +=========================================== + + 展開したら、`make'コマンドで`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’ + +1.5 `casl2'の実行テスト +============================= + + ビルドしたら、次のコマンドが正常に実行できるかを確認します。 +正常に実行された場合は、「Hello, World!」と表示されます。 + + $ ./casl2 as/hello.casl + Hello, World! + +1.6 詳細なテスト +====================== + + `make +check'コマンドを実行すると、正常にビルドできているかどうかを詳細にテストできます。 +テストには、しばらく時間がかかります。 + + $ make check + 195 / 195 tests passed. Details in /home/username/yacasl2/test/integra + tion/casl2/Test.log + All tests are succeded. + 149 / 149 tests passed. Details in /home/username/yacasl2/test/integra + tion/comet2/Test.log + All tests are succeded. + 4 / 4 tests passed. Details in /home/username/yacasl2/test/integration + /dumpword/Test.log + All tests are succeded. + +1.7 インストール +====================== + + ビルドが成功したら、`make +install'コマンドで必要なファイルをインストールできます。 +初期設定では、ホームディレクトリー以下にYACASL2のファイルがインストールされます。 + + $ make install + + コマンド実行時にオプションを指定することで、インストール先のディレクトリーを変更できます。 +例えば、`/usr/local'以下にファイルをインストールするには、 +次のようにコマンドを実行します。 + + $ sudo make install prefix=/usr/local + + オプションの詳細は次のとおりです。 + +オプション 説明 初期設定 +--------------------------------------------------------------------------- +PREFIX インストール時のルートファイル `~' +BINDIR 実行ファイルのインストール先 `$prefix/bin' +INFODIR infoファイルのインストール先 `$prefix/info' +CASL2LIBDIR CASL II `$prefix/lib/yacasl2' + ライブラリファイルのインストール先 + +1.8 環境変数の設定 +========================= + + 環境変数`PATH'や`CASL2LIB'を設定することで、YACASL2が使いやすくなります。環境変数は、使っているシェルを確認してから設定します。 + +シェルの確認 +------------------ + + 環境変数の設定方法は使っているシェルによって異なります。シェルは、次のコマンドで確認できます。 + + $ echo $SHELL + /bin/bash + + 現在もっとも多く使われているシェルは、BASHでしょう。以下、BASHでの設定方法を説明します。 + +1.8.1 `PATH'の設定 +--------------------- + + `PATH'にYACASL2の実行ファイルのインストール先を追加すると、ディレクトリーの指定を省略して`casl2' +`comet2' +`dumpword'を実行できます。例えば、初期設定のまま実行ファイルを`~/bin'にインストールしたときは、次のコマンドで設定できます。 + + $ PATH=$PATH:~/bin && export PATH + + 環境変数の設定は、シェルの初期設定ファイルに追加することでログインしたあと自動的に反映されるようになります。BASHでは`~/.bashrc'が初期設定ファイルです。次のコマンドで追加できます。 + + $ echo ’PATH=$PATH:~/bin && export PATH’ >>~/.bashrc + +1.8.2 `INFOPATH'の設定 +------------------------- + + `INFOPATH'にYACASL2のInfoファイルをインストールしたディレクトリーを追加すると、ディレクトリーの指定を省略して`casl2' +`comet2' +`dumpword'を実行できます。例えば、初期設定のままInfoファイルを`~/share/info'にインストールしたときは、次のコマンドで設定できます。 + + $ INFOPATH=$INFOPATH:~/share && export INFOPATH + + `~/.bashrc'には次のコマンドで追加できます。 + + $ echo 'INFOPATH=$INFOPATH:~/share/info && export INFOPATH' >>~/.bashrc + +1.8.3 `CASL2LIB'の設定 +------------------------- + + 環境変数`CASL2LIB'を設定しておけば、CASL +IIプログラム作成時に共通ライブラリを呼び出す手間が小さくなります。例えば、CASL2LIBを`~/yacasl2/casl2lib'にインストールしたときは、次のコマンドで設定できます。 + + $ CASL2LIB=~/yacasl2/casl2lib && export CASL2LIB + + `~/.bashrc'には次のコマンドで追加できます。 + + $ echo 'CASL2LIB=~/yacasl2/casl2lib && export CASL2LIB' >>~/.bashrc + diff --git a/Makefile b/Makefile index 5d57356..f3cf097 100644 --- a/Makefile +++ b/Makefile @@ -10,11 +10,10 @@ CAT ?= cat prefix ?= ~ bindir ?= $(prefix)/bin -casl2libdir ?= $(prefix)/lib/casl2 VERSIONFILES = include/package.h test/system/casl2/opt_v/0.txt test/system/comet2/opt_v/0.txt test/system/dumpword/opt_v/0.txt -all: build info html gtags +all: build docall gtags build: $(MAKE) -C src all @@ -22,7 +21,7 @@ build: gtags: @$(WHICH) $(GTAGS) >/dev/null && $(GTAGS) || $(ECHO) "$(GTAGS): not found" -docall: doc +docall: $(MAKE) -C doc all info: diff --git a/README b/README index 661d2c6..5605561 100644 --- a/README +++ b/README @@ -16,7 +16,7 @@ CASL IIは、情報処理試験で用いられるアセンブラ言語で、次 ****************** YACASL2のインストール方法は、INSTALLを参照してください。 -YACASL2の使い方は、doc/index.htmlを参照してください。 +YACASL2の使い方は、doc/manual.htmlを参照してください。 Webサイト diff --git a/doc/Makefile b/doc/Makefile index c118e45..ac78fc3 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -1,14 +1,13 @@ MANUAL = manual INSTALLDOC = install -MANUALSRC = $(MANUAL).texi -MANUALINFO = yacasl2.info -INSTALLDOCSRC = $(INSTALLDOC).texi +CASL2SPEC = casl2_spec +MANUAL_SYSINFO = yacasl2.info CSS = style.css -MANUALHTMLDIR = manual_html MV ?= mv CP ?= cp MKDIR ?= mkdir +RMF = rm -f RMRF ?= rm -rf PTEX ?= ptex TEXI2DVI ?= texi2dvi @@ -17,64 +16,67 @@ MAKEINFO ?= gmakeinfo INSTALL ?= install INSTALL-INFO ?= ginstall-info GZIP = gzip +SED = sed prefix ?= ~ infodir ?= $(prefix)/share/info -.PHONY: all info html install-info uninstall-info clean clean-manual clean-installdoc clean-textmp +.PHONY: all info html htmls pdf install-info uninstall-info clean clean-textmp -.INTERMEDIATE: $(MANUAL).dvi +.INTERMEDIATE: *.dvi -all: info html $(MANUAL).pdf ../INSTALL +base: ../INSTALL $(MANUAL_SYSINFO) $(MANUAL).html -info: $(MANUALINFO) +all: info html htmls pdf ../INSTALL $(MANUAL_SYSINFO) -$(MANUALINFO): $(MANUALSRC) - $(MAKEINFO) -o $(MANUALINFO) $(MANUALSRC) +info: $(MANUAL_SYSINFO) $(INSTALLDOC).info -html: $(MANUAL).html $(MANUALHTMLDIR) $(INSTALLDOC).html +html: $(MANUAL).html $(INSTALLDOC).html -$(MANUAL).html: $(MANUALSRC) $(CSS) +htmls: $(MANUAL)_html + +pdf: $(INSTALLDOC).pdf $(MANUAL).pdf + +$(MANUAL_SYSINFO): $(MANUAL).info + $(CP) $< $@ + $(SED) -i -e "s/@setfilename manual/@setfilename $(MANUAL_SYSINFO)/" $@ + +%.html: %.texi $(CSS) $(MAKEINFO) -o $@ --no-split --html --css-include=$(CSS) $< -$(MANUALHTMLDIR): $(MANUALSRC) $(CSS) +%_html: %.texi $(CSS) $(INSTALL) -d $@ $(INSTALL) $(CSS) $@/ $(MAKEINFO) -o $@ --html --css-ref=$(CSS) $< -$(MANUAL).pdf: $(MANUAL).dvi +%.pdf: %.dvi $(DVI2PDF) $< -$(MANUAL).dvi: $(MANUALSRC) +%.dvi: %.texi TEX=$(PTEX) $(TEXI2DVI) -q --texinfo=@afourpaper -o $@ $< @$(MAKE) clean-textmp -$(MANUAL).txt: $(MANUALSRC) - $(MAKEINFO) --no-headers --disable-encoding -o $@ $(MANUALSRC) +%.txt: %.texi + $(MAKEINFO) --no-headers --disable-encoding -o $@ $< -install-info: $(MANUAL).info +install-info: $(MANUAL_SYSINFO) $(INSTALL) -d $(infodir) - $(INSTALL) $(MANUALINFO) $(infodir)/ - $(INSTALL-INFO) $(infodir)/$(MANUALINFO) $(infodir)/dir - $(GZIP) -f $(infodir)/$(MANUALINFO) + $(INSTALL) $(MANUAL_SYSINFO) $(infodir)/ + $(INSTALL-INFO) $(infodir)/$(MANUAL_SYSINFO) $(infodir)/dir + $(GZIP) -f $(infodir)/$(MANUAL_SYSINFO) uninstall-info: $(MANUAL).info - $(INSTALL-INFO) --delete $(infodir)/$(MANUAL) $(infodir)/dir - $(RM) $(infodir)/$(MANUAL)* + $(INSTALL-INFO) --delete $(infodir)/$(MANUAL_SYSINFO) $(infodir)/dir + $(RMF) $(infodir)/$(MANUAL_SYSINFO)* -$(INSTALLDOC).html: $(INSTALLDOCSRC) $(CSS) +$(INSTALLDOC).html: $(INSTALLDOC).texi $(CSS) $(MAKEINFO) -o $@ --no-split --html --css-include=$(CSS) $< -../INSTALL: $(INSTALLDOCSRC) - $(MAKEINFO) -o $@ --no-headers --disable-encoding $< +../INSTALL: $(INSTALLDOC).txt + $(CP) $< $@ -clean: clean-manual clean-installdoc clean-textmp - -clean-manual: - @$(RMRF) html $(MANUALHTMLDIR) $(MANUAL).info $(MANUAL).pdf $(MANUAL).html $(MANUAL).txt +clean: clean-textmp + @$(RMRF) *_html *.info *.html *.pdf *.dvi *.txt clean-textmp: - @$(RMRF) $(MANUAL).aux $(MANUAL).cp $(MANUAL).cps $(MANUAL).fn $(MANUAL).ky $(MANUAL).log $(MANUAL).pg $(MANUAL).pgs $(MANUAL).tmp $(MANUAL).toc $(MANUAL).tp $(MANUAL).vr - -clean-installdoc: - @$(RMRF) install.html ../INSTALL + @$(RMF) *.aux *.cp *.cps *.fn *.ky *.log *.pg *.pgs *.tmp *.toc *.tp *.vr diff --git a/doc/casl2_spec.html b/doc/casl2_spec.html deleted file mode 100644 index 9863678..0000000 --- a/doc/casl2_spec.html +++ /dev/null @@ -1,341 +0,0 @@ - - -アセンブラ言語の仕様 - - - - - - - - - - -

アセンブラ言語の仕様

-

1 システム COMETIIの仕様

- -

1.1 ハードウェアの仕様

- -
    -
  1. 1語は16ビットで、そのビット構成は、次のとおりである。 - -
          上位8ビット                               下位8ビット
    -     | 15 | 14 | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |(ビット番号)
    -       ↑
    -     符号(負:1、非負:0)
    -
    - -
  2. 主記憶の容量は65536語で、そのアドレスは0~65535番地である。 - -
  3. 数値は、16ビットの2進数で表現する。負数は、2の補数で表現する。 - -
  4. 制御方式は逐次制御で、命令語は1語長又は2語長である。 - -
  5. レジスタとして、GR(16ビット)、SP(16ビット)、PR(16ビット)、FR(3ビット)の 4 種類がある。 - -

    GR(汎用レジスタ、General Register)は、GR0~GR7の8個があり、 -算術、論理、比較、シフトなどの演算に用いる。 -このうち、GR1~GR7のレジスタは、指標レジスタ(index register) -としてアドレスの修飾にも用いる。 - -

    SP(スタックポインタ、Stack Pointer)は、 -スタックの最上段のアドレスを保持している。 - -

    PR(プログラムレジスタ、Program Register)は、 -次に実行すべき命令語の先頭アドレスを保持している。 - -

    FR(フラグレジスタ、Flag Register)は、 -OF(Overflow Flag)、SF(Sign Flag)、ZF(Zero Flag)と呼ぶ -3個のビットからなり、演算命令などの実行によって次の値が設定される。 -これらの値は、条件付き分岐命令で参照される。 - -

    -
    OF
    算術演算命令の場合は、演算結果が-32768~32767に収まらなくなったとき1になり、 -それ以外のとき0になる。 -論理演算命令の場合は、演算結果が0~65535に収まらなくなったとき1になり、 -それ以外のとき0になる。 - -
    SF
    演算結果の符号が負(ビット番号15が1)のとき1、それ以外のとき0になる。 - -
    ZF
    演算結果が零(全部のビットが0)のとき1、それ以外のとき0になる。 -
    - -
  6. 論理加算又は論理減算は、被演算データを符号のない数値とみなして、 -加算又は減算する。 -
- -

1.2 命令

- -

命令の形式及びその機能を示す。 -ここで、一つの命令コードに対し2種類のオペランドがある場合、 -上段はレジスタ間の命令、下段はレジスタと主記憶間の命令を表す。 - -

    -
  1. ロード、ストア、ロードアドレス命令 -

    命令 書き方
    命令コード
    書き方
    オペランド
    命令の説明 FRの設定 -
    ロード
    LoaD
    LD r1,r2
    ——
    r,adr[,x]
    r1 ← (r2)
    ——
    r ← (実効アドレス)
    ○
    ただし、OFには0が設定される。 -
    ストア
    STore
    ST r,adr[,x] 実効アドレス ← (r) – -
    ロードアドレス
    Load ADdress
    LAD r,adr[,x] r ← 実効アドレス – -
    - -

  2. 算術、論理演算命令 -

    命令 書き方
    命令コード
    書き方
    オペランド
    命令の説明 FRの設定 -
    算術加算
    ADD Arithmetic
    ADDA r1,r2
    ——
    r,adr[,x]
    r1 ← (r1) + (r2)
    ——
    r ← (r) + (実効アドレス)
    ○ -
    論理加算
    ADD Logical
    ADDL r1,r2
    ——
    r,adr[,x]
    r1 ← (r1) +L (r2)
    ——
    r ← (r) +L (実効アドレス)
    ○ -
    算術減算
    SUBtract Arithmetic
    SUBA r1,r2
    ——
    r,adr[,x]
    r1 ← (r1) - (r2)
    ——
    r ← (r) - (実効アドレス)
    ○ -
    論理減算
    SUBtract Logical
    SUBL r1,r2
    ——
    r,adr[,x]
    r1 ← (r1) - L(r2)
    ——
    r ← (r) - L(実効アドレス)
    ○ -
    論理積
    AND
    AND r1,r2
    ——
    r,adr[,x]
    r1 ← (r1) AND (r2)
    ——
    r ← (r) AND (実効アドレス)
    ○
    ただし、OFには0が設定される。 -
    論理和
    OR
    OR r1,r2
    ——
    r,adr[,x]
    r1 ← (r1) OR (r2)
    ——
    r ← (r) OR (実効アドレス)
    ○
    ただし、OFには0が設定される。 -
    排他的論理和
    eXclusive OR
    XOR r1,r2
    ——
    r,adr[,x]
    r1 ← (r1) XOR (r2)
    ——
    r ← (r) XOR (実効アドレス)
    ○
    ただし、OFには0が設定される。 -
    - -

  3. 比較演算命令 -

    命令 書き方
    命令コード
    書き方
    オペランド
    命令の説明 FRの設定 -
    算術比較
    ComPare Arithmetic
    CPAr1,r2
    ——
    r,adr[,x]
    (r1)と(r2)、又は(r)と(実効アドレス)の算術比較を行い、比較結果によって、FRに次の値を設定する。 -
    -
    比較結果
    FRの値 -
    (r1) > (r2) 又は (r) > (実効アドレス)
    SF:0, ZF:0 -
    (r1) = (r2) 又は (r) = (実効アドレス)
    SF:0, ZF:1 -
    (r1) < (r2) 又は (r) < (実効アドレス)
    SF:1, ZF:0 -
    -
    ○
    ただし、OFには0が設定される。 -
    論理比較
    ComPare Logical
    CPL r1,r2
    ——
    r,adr[,x]
    (r1)と(r2)、又は(r)と(実効アドレス)の論理比較を行い、比較結果によって、FRに次の値を設定する。 -
    -
    比較結果
    FRの値 -
    (r1) > (r2) 又は (r) > (実効アドレス)
    SF:0, ZF:0 -
    (r1) = (r2) 又は (r) = (実効アドレス)
    SF:0, ZF:1 -
    (r1) < (r2) 又は (r) < (実効アドレス)
    SF:1, ZF:0 -
    -
    ○
    ただし、OFには0が設定される。 -
    - -

  4. シフト演算命令 -

    命令 書き方
    命令コード
    書き方
    オペランド
    命令の説明 FRの設定 -
    算術左シフト
    Shift Left Arithmetic
    SLA r,adr[,x] 符号を除き(r)を実効アドレスで指定したビット数だけ左にシフトする。シフトの結果、空いたビット位置には、0が入る。 ○
    ただし、OFにはレジスタから最後に送り出されたビットの値が設定される。 -
    算術右シフト
    Shift Right Arithmetic
    SRA r,adr[,x] 符号を除き(r)を実効アドレスで指定したビット数だけ右にシフトする。シフトの結果、空いたビット位置には、符号と同じものが入る。 ○
    ただし、OFにはレジスタから最後に送り出されたビットの値が設定される。 -
    論理左シフト
    Shift Left Logical
    SLL r,adr[,x] 符号を含み(r)を実効アドレスで指定したビット数だけ左にシフトする。シフトの結果,空いたビット位置には0が入る。 ○
    ただし、OFにはレジスタから最後に送り出されたビットの値が設定される。 -
    論理右シフト
    Shift Right Logical
    SRL r,adr[,x] 符号を含み(r)を実効アドレスで指定したビット数だけ右にシフトする。シフトの結果、空いたビット位置には0が入る。 ○
    ただし、OFにはレジスタから最後に送り出されたビットの値が設定される。 -
    - -

  5. 分岐命令 -

    命令 書き方
    命令コード
    書き方
    オペランド
    命令の説明 FRの設定 -
    正分岐
    Jump on Plus
    JPL adr[,x] FRの値によって、実効アドレスに分岐する。分岐しないときは、次の命令に進む。 -
    -
    分岐するときのFRの値
    SF:0, ZF:0 -
    -
    – -
    負分岐
    Jump on MINUS
    JMI adr[,x] FRの値によって、実効アドレスに分岐する。分岐しないときは、次の命令に進む。 -
    -
    分岐するときのFRの値
    SF:1 -
    -
    – -
    非零分岐
    Jump on Non Zero
    JNZ adr[,x] FRの値によって、実効アドレスに分岐する。分岐しないときは、次の命令に進む。 -
    -
    分岐するときのFRの値
    ZF:0 -
    -
    – -
    零分岐
    Jump on ZEro
    JZE adr[,x] FRの値によって、実効アドレスに分岐する。分岐しないときは、次の命令に進む。 -
    -
    分岐するときのFRの値
    ZF:1 -
    -
    – -
    オーバーフロー分岐
    Jump on OVerflow
    JOV adr[,x] FRの値によって、実効アドレスに分岐する。分岐しないときは、次の命令に進む。 -
    -
    分岐するときのFRの値
    OF:1 -
    -
    – -
    無条件分岐
    unconditional Jump
    JUMP adr[,x] 無条件に実効アドレスに分岐する。 – -
    - -

  6. スタック操作命令 -

    命令 書き方
    命令コード
    書き方
    オペランド
    命令の説明 FRの設定 -
    プッシュ
    PUSH
    PUSH adr[,x] SP ← (SP)-L1,
    (SP)← (実効アドレス)
    – -
    ポップ
    POP
    POP r r ← ( (SP) ),
    SP ← (SP) +L 1
    – -
    - -

  7. コール、リターン命令 -

    命令 書き方
    命令コード
    書き方
    オペランド
    命令の説明 FRの設定 -
    コール
    CALL subroutine
    CALL adr[,x] SP ← (SP)-L 1,
    (SP) ← (PR),
    PR ← 実効アドレス
    – -
    リターン
    RETrun form subroutine
    RET PR ← ( (SP) ),
    SP ← (SP) +L 1
    – -
    - -

  8. その他 -

    命令 書き方
    命令コード
    書き方
    オペランド
    命令の説明 FRの設定 -
    スーパーバイザコール
    SuperVisor CALL
    SVC adr[,x] 実効アドレスを引数として割出しを行う。実行後のGRとFRは不定となる。 – -
    ノーオペレーション
    No operation
    NOP 何もしない。 – -
    -

- -
    -
  • 注 -
    -
    r, r1, r2
    いずれも GRを示す。指定できるGRはGR0~GR7 - -
    adr
    アドレスを示す。指定できる値の範囲は0~65535 - -
    x
    指標レジスタとして用いるGRを示す。指定できるGRはGR1~GR7 - -
    [ ]
    [ ]内の指定は省略できることを示す。 - -
    ( )
    ( )内のレジスタ又はアドレスに格納されている内容を示す。 - -
    実効アドレス
    adrとxの内容との論理加算値又はその値が示す番地 - -
    ←
    演算結果を、左辺のレジスタ又はアドレスに格納することを示す。 - -
    +L, -L
    論理加算、論理減算を示す。 - -
    FRの設定
    -
      -
    • ○: 設定されることを示す。 -
    • ー: 実行前の値が保持されることを示す。 -
    -
    -
- - - - diff --git a/doc/install.texi b/doc/install.texi index 07aa820..074c03c 100644 --- a/doc/install.texi +++ b/doc/install.texi @@ -24,38 +24,40 @@ Copyright @copyright{} 2010-2012 j8takagi @end titlepage @node Top, Require, (dir), (dir) +@chapter YACASL2のインストール @menu -* Require:: 要件 -* Download:: YACASL2ファイルのダウンロード -* Verify:: YACASL2ファイルの検証 -* Expand:: YACASL2ファイルの展開 -* Build:: @file{casl2} @file{comet2} @file{dumpword}のビルド -* Simple Test:: @file{casl2}の実行テスト -* Detail Test:: 詳細なテスト -* Environment:: 環境変数の設定 +* Require:: 要件 +* Download:: YACASL2ファイルのダウンロード +* Verify:: YACASL2ファイルの検証 +* Expand:: YACASL2ファイルの展開 +* Build:: @file{casl2} @file{comet2} @file{dumpword}のビルド +* Simple Test:: @file{casl2}の実行テスト +* Detail Test:: 詳細なテスト +* Install:: インストール +* Environment:: 環境変数の設定 @end menu @contents @node Require, Download, Top, Top -@chapter 要件 +@unnumberedsec 要件 YACASL2は、LinuxやMac OS Xなど、UNIX系のOS上で動作します。現在動作を確認しているのは、Ubuntu LinuxとVine Linux、Mac OS Xです。 インストール時に、@command{tar} @command{gcc} @command{make}が必要です。Linuxでは多くの場合、標準でインストールされています。Mac OS Xの場合、Xcodeの「Command Line Tools」に含まれます。 @node Download, Verify, Require, Top -@chapter YACASL2ファイルのダウンロード +@section YACASL2ファイルのダウンロード @uref{http://www.j8takagi.net/yacasl2/, YACASL2のサイト}から、@file{tar.gz}または@file{tar.xz}ファイルと、対応する検証用ファイルをダウンロードします。@uref{http://github.com/j8takagi/YACASL2/downloads/, githubのダウンロードページ}から@file{tar.gz}などのファイルをダウンロードすることもできます。 @node Verify, Expand, Download, Top -@chapter YACASL2ファイルの検証 +@section YACASL2ファイルの検証 ダウンロードが完了したら、圧縮ファイルが改竄されていないか検証します。検証にはGnuPG分離署名か、MD5ハッシュ値を使います。 -@section GnuPG分離署名での検証 +@subsection GnuPG分離署名での検証 GnuPGの@command{gpg}で圧縮ファイルを検証します。この検証を行うには、GnuPGがインストールされ、自分の秘密鍵と公開鍵のペアが作成されている必要があります。 @@ -105,7 +107,7 @@ gpg: depth: 1 valid: 4 signed: 0 trust: 4-, 0q, 0n, 0m, 0f, 0u gpg: Good signature from "j8takagi " @end example -@section MD5ハッシュ値での検証 +@subsection MD5ハッシュ値での検証 @command{openssl}と@command{diff}で圧縮ファイルを検証します。 @@ -115,7 +117,7 @@ Files yacasl2.tar.gz.md5sum and - are identical @end example @node Expand, Build, Verify, Top -@chapter YACASL2ファイルの展開 +@section YACASL2ファイルの展開 YACASL2ファイルをダウンロードしたら、@command{tar}コマンドで展開します。 @@ -124,7 +126,7 @@ $ @kbd{tar xvzf yacasl2.tar.gz} @end example @node Build, Simple Test, Expand, Top -@chapter @file{casl2} @file{comet2} @file{dumpword}のビルド +@section @file{casl2} @file{comet2} @file{dumpword}のビルド 展開したら、@command{make}コマンドで@file{casl2} @file{comet2} @file{dumpword}をビルドします。 @@ -156,7 +158,7 @@ make[1]: Leaving directory ‘/home/kazubito/yacasl2/src’ @end example @node Simple Test, Detail Test, Build, Top -@chapter @file{casl2}の実行テスト +@section @file{casl2}の実行テスト ビルドしたら、次のコマンドが正常に実行できるかを確認します。 正常に実行された場合は、「Hello, World!」と表示されます。 @@ -166,10 +168,11 @@ $ @kbd{./casl2 as/hello.casl} Hello, World! @end example -@node Detail Test, Environment, Simple Test, Top -@chapter 詳細なテスト +@node Detail Test, Install, Simple Test, Top +@section 詳細なテスト -次のコマンドを実行すると、正常にビルドできているかどうかを詳細にテストできます。 +@command{make check}コマンドを実行すると、正常にビルドできているかどうかを詳細にテストできます。 +テストには、しばらく時間がかかります。 @example $ @kbd{make check} @@ -184,12 +187,40 @@ All tests are succeded. All tests are succeded. @end example -@node Environment, , Detail Test, Top -@chapter 環境変数の設定 +@node Install, Environment, Detail Test, Top +@section インストール + +ビルドが成功したら、@command{make install}コマンドで必要なファイルをインストールできます。 +初期設定では、ホームディレクトリー以下にYACASL2のファイルがインストールされます。 + +@example +$ @kbd{make install} +@end example + +コマンド実行時にオプションを指定することで、インストール先のディレクトリーを変更できます。 +例えば、@file{/usr/local}以下にファイルをインストールするには、 +次のようにコマンドを実行します。 + +@example +$ @kbd{sudo make install prefix=/usr/local} +@end example + +オプションの詳細は次のとおりです。 + +@multitable @columnfractions .20 .50 .30 +@headitem オプション @tab 説明 @tab 初期設定 +@item @var{prefix} @tab インストール時のルートファイル @tab @file{~} +@item @var{bindir} @tab 実行ファイルのインストール先 @tab @file{$prefix/bin} +@item @var{infodir} @tab infoファイルのインストール先 @tab @file{$prefix/info} +@item @var{casl2libdir} @tab CASL II ライブラリファイルのインストール先 @tab @file{$prefix/lib/yacasl2} +@end multitable + +@node Environment, , Install, Top +@section 環境変数の設定 環境変数@code{PATH}や@code{CASL2LIB}を設定することで、YACASL2が使いやすくなります。環境変数は、使っているシェルを確認してから設定します。 -@section シェルの確認 +@unnumberedsubsec シェルの確認 環境変数の設定方法は使っているシェルによって異なります。シェルは、次のコマンドで確認できます。 @@ -200,22 +231,35 @@ $ @kbd{echo $SHELL} 現在もっとも多く使われているシェルは、BASHでしょう。以下、BASHでの設定方法を説明します。 -@section @code{PATH}にYACASL2のディレクトリを追加 +@subsection @code{PATH}の設定 -@code{PATH}にYACASL2実行ファイルをインストールしたディレクトリを追加すると、ディレクトリの指定を省略して@command{casl2} @command{comet2} @command{dumpword}を実行できます。例えば、実行ファイルを@file{~/bin}にインストールしたときは、次のコマンドで設定できます。 +@code{PATH}にYACASL2の実行ファイルのインストール先を追加すると、ディレクトリーの指定を省略して@command{casl2} @command{comet2} @command{dumpword}を実行できます。例えば、初期設定のまま実行ファイルを@file{~/bin}にインストールしたときは、次のコマンドで設定できます。 @example $ @kbd{PATH=$PATH:~/bin && export PATH} @end example -環境変数の設定は、シェルの初期設定ファイルに追加することでログインしたあと自動的に反映されるようになります。BASHではホームディレクトリにある@file{.bashrc}が初期設定ファイルです。次のコマンドで追加できます。 +環境変数の設定は、シェルの初期設定ファイルに追加することでログインしたあと自動的に反映されるようになります。BASHでは@file{~/.bashrc}が初期設定ファイルです。次のコマンドで追加できます。 @example $ @kbd{echo ’PATH=$PATH:~/bin && export PATH’ >>~/.bashrc} @end example +@subsection @code{INFOPATH}の設定 + +@code{INFOPATH}にYACASL2のInfoファイルをインストールしたディレクトリーを追加すると、ディレクトリーの指定を省略して@command{casl2} @command{comet2} @command{dumpword}を実行できます。例えば、初期設定のままInfoファイルを@file{~/share/info}にインストールしたときは、次のコマンドで設定できます。 + +@example +$ @kbd{INFOPATH=$INFOPATH:~/share && export INFOPATH} +@end example + +@file{~/.bashrc}には次のコマンドで追加できます。 + +@example +$ @kbd{echo 'INFOPATH=$INFOPATH:~/share/info && export INFOPATH' >>~/.bashrc} +@end example -@section @code{CASL2LIB}の設定 +@subsection @code{CASL2LIB}の設定 環境変数@code{CASL2LIB}を設定しておけば、CASL IIプログラム作成時に共通ライブラリを呼び出す手間が小さくなります。例えば、CASL2LIBを@code{~/yacasl2/casl2lib}にインストールしたときは、次のコマンドで設定できます。 @@ -223,7 +267,7 @@ $ @kbd{echo ’PATH=$PATH:~/bin && export PATH’ >>~/.bashrc} $ @kbd{CASL2LIB=~/yacasl2/casl2lib && export CASL2LIB} @end example -BASHの初期設定ファイル@file{.bashrc}には、次のコマンドで追加できます。 +@file{~/.bashrc}には次のコマンドで追加できます。 @example $ @kbd{ echo 'CASL2LIB=~/yacasl2/casl2lib && export CASL2LIB' >>~/.bashrc} diff --git a/doc/manual.texi b/doc/manual.texi index 92298b0..9439f8a 100644 --- a/doc/manual.texi +++ b/doc/manual.texi @@ -3,7 +3,7 @@ @ifnottex @documentlanguage ja_JP @end ifnottex -@setfilename yacasl2 +@setfilename manual @documentencoding UTF-8 @settitle YACASL2 - CASL II 処理システム @firstparagraphindent insert diff --git a/doc/yacasl2.info b/doc/yacasl2.info deleted file mode 100644 index 264952b..0000000 --- a/doc/yacasl2.info +++ /dev/null @@ -1,1182 +0,0 @@ -This is yacasl2.info, produced by makeinfo version 4.13 from -manual.texi. - -Copyright (C) 2010-2012 j8takagi - -INFO-DIR-SECTION Programming -START-INFO-DIR-ENTRY -* YACASL2: (yacasl2). CASL II 処理システム -* casl2: (yacasl2)casl2 invocation. casl2の呼び出し -* comet2: (yacasl2)comet2 invocation. comet2の呼び出し -* dumpword: (yacasl2)dumpword invocation. dumpwordの呼び出し -END-INFO-DIR-ENTRY - - -File: yacasl2.info, Node: Top, Next: Overview, Prev: (dir), Up: (dir) - -* Menu: - -* Overview:: YACASL2の概要 -* Sample usage:: YACASL2の使用例 -* casl2 invocation:: casl2の呼び出し -* comet2 invocation:: comet2の呼び出し -* dumpword invocation:: dumpwordの呼び出し -* CASL2LIB Manual:: CASL2LIBマニュアル - - -File: yacasl2.info, Node: Overview, Next: Sample usage, Prev: Top, Up: Top - -1 YACASL2の概要 -****************** - - YACASL2は、UNIXやLinuxのコマンドラインインターフェイスで -動作するオープンソースのCASL II処理システムです。 CASL -IIは情報処理試験で用いられるアセンブラ言語で、 -次の資料により仕様が公開されています。 - - 試験で使用する情報処理用語・プログラム言語など Ver - 2.2(平成24年5月22日) - (http://www.jitec.jp/1_13download/shiken_yougo_ver2_2.pdf)[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の操作は、端末上のコマンドラインインターフェイスで行います。 - - -File: yacasl2.info, Node: Sample usage, Next: casl2 invocation, Prev: Overview, Up: Top - -2 YACASL2の使用例 -********************* - - YACASL2 は、テキストファイルに記述されたCASLプログラムを処理します。 -以下の例で用いられるCASLプログラムのファイルは、 -テキストエディタなどで作成するか、インストールしたディレクトリの -中にある`as'ディレクトリからコピーしてください。 - -* Menu: - -* Simple output:: 実行結果の出力だけを表示 -* Assemble result:: アセンブル結果の確認 -* Register and memory:: 実行時のレジスタとメモリを表示 -* Only assemble:: アセンブルと実行を別に行う -* Analyze word:: 1語の解析 -* Use CASL2LIB:: CASL2ライブラリの使用 - - -File: yacasl2.info, Node: Simple output, Next: Assemble result, Prev: Sample usage, Up: Sample usage - -2.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 -内にあるレジスタやメモリの内容を表示するか、結果を出力するための処理を追加する必要があります。 - - -File: yacasl2.info, Node: Assemble result, Next: Register and memory, Prev: Simple output, Up: Sample usage - -2.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 での実行は行われません。 - - -File: yacasl2.info, Node: Register and memory, Next: Only assemble, Prev: Assemble result, Up: Sample usage - -2.3 実行時のレジスタとメモリを表示 -================================================= - - YACASL2では実行中のCPUのレジスタとメモリの内容をそれぞれ、`-t'と`-d'を指定することで表示できます。 - - また、`-M'で、仮想マシンCOMET II のメモリ容量を語(16 -ビット)単位で指定できます。 -小さいプログラムを実行するときは、メモリ容量を小さくすれば結果が見やすくなります。 - -* Menu: - -* Register specify:: 特定のレジスタを表示 -* End value:: -* Step count:: プログラムのステップ数を表示 - - `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 - - -File: yacasl2.info, Node: Register specify, Next: End value, Prev: Register and memory, Up: Register and memory - -2.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' - - -File: yacasl2.info, Node: End value, Next: Step count, Prev: Register specify, Up: Register and memory - -2.3.2 プログラム終了時の値を表示 ---------------------------------------------- - - `grep'と`tail'を組み合わせれば、プログラム終了時の値を表示できます。 - - `addl.casl'でプログラム終了時の値を確認するには、次のようにします。 - - $ casl2 -t addl.casl | grep 'GR1:' | tail -1 - #0004: GR1: 4 = #0004 = 0000000000000100 - - `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 - - `sum_10.casl'でファイル終了時の値を確認するには、次のようにします。 - - $ casl2 -t sum_10.casl | grep 'GR0:' | tail -1 - #0010: GR0: 55 = #0037 = 0000000000110111 = '7' - - -File: yacasl2.info, Node: Step count, Prev: End value, Up: Register and memory - -2.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 - - -File: yacasl2.info, Node: Only assemble, Next: Analyze word, Prev: Register and memory, Up: Sample usage - -2.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 - - オブジェクトファイルの実行には、`casl2'を使います。 - - $ comet2 hello.o - Hello, World! - - -File: yacasl2.info, Node: Analyze word, Next: Use CASL2LIB, Prev: Only assemble, Up: Sample usage - -2.5 1語の解析 -================= - - CASL IIでは、1語(1 word、16ビット)を単位としてデータが処理されます。 -`dumpword'は、指定した1語を10進数、16進数、2進数で表示します。 - - $ dumpword 72 - 72: 72 = #0048 = 0000000001001000 = 'H' - - -File: yacasl2.info, Node: Use CASL2LIB, Prev: Analyze word, Up: Sample usage - -2.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に格納します。 - -2.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 - - -File: yacasl2.info, Node: casl2 invocation, Next: comet2 invocation, Prev: Sample usage, Up: Top - -3 `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' - ラベルの一覧を次の形式で表示します。 - 表示後、ほかの作業を続行します。 - - <プログラム名>.<ラベル名> ---> <アドレスの16進数表現> - -`-L' -`--labelonly' - `-l'と同じ形式でラベルの一覧を表示します。 - 表示後、ほかの作業は続行せず、終了します。 - -`-a' -`--assembledetail' - アセンブル詳細結果を表示し、ほかの作業を続行します。 - -`-A' -`--assembledetailonly' - アセンブル詳細結果を表示して終了します。 - -`-o' -`--assembleout' - アセンブル結果をオブジェクトファイル`'に出力し、ほかの作業を続行します。 - 出力されたオブジェクトファイルは、`comet2'で実行できます。 - オブジェクトファイルを指定しない場合、出力先は`a.o'です。 - オブジェクトファイルは1つだけ指定できます。 - -`-O[]' -`--assembleoutonly[]' - アセンブル結果をオブジェクトファイル`'に出力し、終了します。 - 出力されたオブジェクトファイルは、`comet2'で実行できます。 - オブジェクトファイルを指定しない場合、出力先は`a.o'です。 - オブジェクトファイルは1つだけ指定できます。 - -`-t' -`--trace' -`--tracearithmetic' - プログラム実行中のレジスタの値を次の形式で表示します。 - - : <レジスタ>: <値の10進数表現> = - <値の16進数表現> = <値の2進数表現>[ ='文字'] - - * - `'と`<レジスタ>'、`<値の16進数表現>'は、4けたの16進数で表されます。 - `'と`<値の16進数表現>'には、先頭に`#'が付きます。 - 範囲は`#0000'から`#FFFF'です - - * `<値の10進数表現>'は符号の付いた10進数です。 - 範囲は-32768から32767です。 - - * `<値の2進数表現>'は、16けたの2進数で表されます。 - 範囲は、`0000000000000000'から`1111111111111111'です - - * `[ - ='文字']'は、レジストリの値が「文字の組」の範囲に含まれる場合に表示されます。 - - 表示されるレジスタには、次の種類があります。 - - `GR0 GR1 GR2 GR3 GR4 GR5 GR6 GR7' - 汎用レジスタ - - `SP' - スタックポインタ - - `PR' - プログラムレジスタ - - `FR' - フラグレジスタ - - 例えば、次のように表示されます。 - - #0002: GR1: 3 = #0003 = 0000000000000011 - -`-T' -`--tracelogical' - `-t'と同じように、プログラム実行中のレジスタの値を表示します。 - ただし`-t'と異なり、`<値の10進数表現>'は符号の付かない10進数です。 - 値の範囲は0から65535です。 - -`-d' -`--dump' - メモリの内容をすべて表示します。 - -`-M ' -`--memorysize ' - アセンブルおよび実行時のメモリサイズ`'を0から65535の範囲で指定します。 - 指定しない場合、512です。 - -`-C ' -`--clocks ' - 実行時のクロック周波数`'を0より大きい整数で指定します。 - 指定しない場合、クロック周波数は5000000です。 - -`-v' -`--version' - `casl2'のバージョンを表示して終了します。 - -`-h' -`--help' - `casl2'の使用方法を表示して終了します。 - - -File: yacasl2.info, Node: comet2 invocation, Next: dumpword invocation, Prev: casl2 invocation, Up: Top - -4 `comet2'の呼び出し -************************* - - `comet2'は、引数として指定されたオブジェクトファイルを仮想マシンCOMET -II上で実行します。 -オブジェクトファイルは、`casl'に`-o'または`-O'を指定して出力します。 - - $ comet2 hello.o - - 引数で指定できるオブジェクトファイルは1つだけです。 -引数が指定されない場合は、エラーメッセージを表示して終了します。 -複数の引数を指定した場合、2番目以降の引数は無視されます。 - -オプション ---------------- - - `comet2'は、次のオプションを指定できます。 - -`-t' -`--trace' -`--tracearithmetic' - プログラム実行中のレジスタの値を次の形式で表示します。 - `<値の10進数表現>'は符号の付いた10進数です。 - 範囲は-32768から32767です。 - - : <レジスタ>: <値の10進数表現> = <値の16進数表現> = <値の2進数表現>[ ='文字'] - - * - `'と`<値の16進数表現>'は、先頭に`#'が付いた4けたの16進数で表されます。 - 範囲は、`#0000'から`#FFFF'です - - * `<値の2進数表現>'は、16けたの2進数で表されます。 - 範囲は、`0000000000000000'から`1111111111111111'です - - * `[ - ='文字']'は、レジストリの値が「文字の組」の範囲に含まれる場合に表示されます。 - - 例えば、次のように表示されます。 - - #0002: GR1: 3 = #0003 = 0000000000000011 - - 表示されるレジスタには、次の種類があります。 - - `GR0 GR1 GR2 GR3 GR4 GR5 GR6 GR7' - 汎用レジスタ - - `SP' - スタックポインタ - - `PR' - プログラムレジスタ - - `FR' - フラグレジスタ - -`-T' -`--tracelogical' - `-t'と同じように、プログラム実行中のレジスタの値を表示します。 - ただし、`-t'と異なり、`<値の10進数表現>'は符号の付かない10進数です。 - 値の範囲は0から65535です。 - -`-d' -`--dump' - メモリの内容をすべて表示します。 - -`-M ' -`--memorysize ' - 実行時のメモリサイズ`'を0から65535の範囲で指定します。 - 指定しない場合、512です。 - -`-C ' -`--clocks ' - 実行時のクロック周波数`'を0より大きい整数で指定します。 - 指定しない場合、5000000です。 - -`-v' -`--version' - `comet2'のバージョンを表示して終了します。 - -`-h' -`--help' - `comet2'の使用方法を表示して終了します。 - - -File: yacasl2.info, Node: dumpword invocation, Next: CASL2LIB Manual, Prev: comet2 invocation, Up: Top - -5 `dumpword'の呼び出し -*************************** - - `dumpword'は引数として指定された数値を、整数、#0000から#FFFFまでの範囲の16進数、2進数で表示します。 -文字の組に該当する場合は、「 = 」のうしろに文字が表示されます。 -引数は、10進数または先頭に「#」の付いた16進数で指定します。 -表示される整数は、オプションにより符号付きか符号なしかを指定します。 -オプションなしの場合は符号付きです。 -整数の範囲は、符号付きの場合は-32768以上32767以下、符号なしの場合は0以上65535以下です。 - - $ dumpword 10 - 10: 10 = #000A = 0000000000001010 = '\n' - - 引数が指定されない場合は、使い方を表示して終了します。 -複数の引数を指定した場合、1つ目の引数だけが表示され、2つ目以降の引数は無視されます。 - -注意 ------- - - マイナスの数や16進数はシェルの仕様により、そのままでは指定できません。 - - マイナスの数を指定するときは、次のように`--'を付けます。 - - $ dumpword -- -72 - -72: -72 = #FFB8 = 1111111110111000 - - 先頭に「#」を付けて16進数を指定するときは、次のように「'」で囲みます。 - - $ dumpword '#0048' - #0048: 72 = #0048 = 0000000001001000 = 'H' - -オプション ---------------- - - `dumpword'は、次のオプションを指定できます。 - -`-a' -`--arithmetic' - 出力される整数の範囲を-32,768以上32,767以下にします。 - オプションなしの場合と同じです。 - -`-l' -`--logical' - 出力される整数の範囲を0以上65,535以下にします。 - -`-v' -`--version' - `dumpword'のバージョンを表示して終了します。 - -`-h' -`--help' - `dumpword'の使用方法を表示して終了します。 - - -File: yacasl2.info, Node: CASL2LIB Manual, Prev: dumpword invocation, Up: Top - -6 CASL2LIBマニュアル -************************* - -* Menu: - -* ABS:: ABS - `abs.casl' -* DIVA:: DIVA - `diva.casl' -* DIVL:: DIVL - `divl.casl' -* INL:: INL - `inl.casl' -* L2STR:: L2STR - `l2str.casl' -* MAX:: MAX - `max.casl' -* MINIM:: MINIM - `minim.casl' -* MULA:: MULA - `mula.casl' -* MULL:: MULL - `mull.casl' -* OUTA:: OUTA - `outa.casl' -* OUTB:: OUTB - `outb.casl' -* OUTD_Q15:: OUTD_Q15 - `outd_q15.casl' -* OUTL:: OUTL - `outl.casl' -* REV:: REV - `rev.casl' -* STR2L:: STR2L - `str2l.casl' - - -File: yacasl2.info, Node: ABS, Next: DIVA, Prev: CASL2LIB Manual, Up: CASL2LIB Manual - -6.1 `ABS' - `abs.casl' -====================== - - GR1を符号付き整数とみなし、絶対値に変換 - -入力 ------- - -`GR1' - 符号付き整数 - -出力 ------- - -`GR1' - 入力された値の絶対値 - -`OF' - 入力された値が-32768の場合、1 - -`SF' - 入力された値が負数(-32767から-1)の場合、1 - -依存する副プログラム ------------------------------- - - なし - -使用例 ---------- - - ;;; CASL2LIB > ABSを呼び出し、-1の絶対値を表示 - MAIN START - LD GR1,A - CALL ABS - CALL OUTA - RET - A DC -1 - END - - $ casl2 call_abs.casl $CASL2LIB/abs.casl $CASL2LIB/outa.casl \ - $CASL2LIB/divl.casl $CASL2LIB/rev.casl - 1 - - -File: yacasl2.info, Node: DIVA, Next: DIVL, Prev: ABS, Up: CASL2LIB Manual - -6.2 `DIVA' - `diva.casl' -======================== - - 符号付き整数の割算を筆算方式で行う - -入力 ------- - -`GR1' - 被除数 - -`GR2' - 除数 - -出力 ------- - -`GR0' - 商 - -`GR3' - 剰余 - -`OF' - 次の場合、1 - * GR2が0 - - * GR1が-32768 - - * GR2が-32768 - -`SF' - 商が負数(-32767から-1)の場合、1 - -`ZF' - 商が0の場合、1 - -依存する副プログラム ------------------------------- - - * `DIVL' - -使用例 ---------- - - ;; CASL2LIB > DIVAを呼び出し、-32767 / 255 の商と剰余を表示 - MAIN START - BEGIN LD GR1,A - LD GR2,B - CALL DIVA - JOV ERR - LD GR1,GR0 - CALL OUTA - LD GR1,GR3 - CALL OUTA - JUMP FIN - ERR OUT EMSG,ELEN - FIN RET - A DC -32767 - B DC 255 - EMSG DC 'error' - ELEN DC 5 - END - - $ casl2 call_diva.casl $CASL2LIB/diva.casl $CASL2LIB/divl.casl \ - $CASL2LIB/outa.casl $CASL2LIB/abs.casl $CASL2LIB/rev.casl - -128 - -127 - - -File: yacasl2.info, Node: DIVL, Next: INL, Prev: DIVA, Up: CASL2LIB Manual - -6.3 `DIVL' - `divl.casl' -======================== - - 符号なし整数の割算を筆算方式で行う - -入力 ------- - -`GR1' - 被除数 - -`GR2' - 除数 - -出力 ------- - -`GR0' - 商 - -`GR3' - 剰余 - -`OF' - GR2が0の場合、1 - -`SF' - 商が32768から65535の場合、1 - -`ZF' - 商が0の場合、1 - -依存する副プログラム ------------------------------- - - なし - -使用例 ---------- - - ;; CASL2LIB > DIVLを呼び出し、65534 / 255 の商と剰余を表示 - MAIN START - BEGIN LD GR1,A - LD GR2,B - CALL DIVL - JOV ERR - LD GR1,GR0 - CALL OUTL - LD GR1,GR3 - CALL OUTL - JUMP FIN - ERR OUT EMSG,ELEN - FIN RET - A DC 65534 - B DC 255 - EMSG DC 'error' - ELEN DC 5 - END - - $ casl2 call_divl.casl $CASL2LIB/divl.casl $CASL2LIB/outl.casl \ - $CASL2LIB/rev.casl - 256 - 254 - - -File: yacasl2.info, Node: INL, Next: L2STR, Prev: DIVL, Up: CASL2LIB Manual - -6.4 `INL' - `inl.casl' -====================== - - 符号なし整数の入力を受け付ける - -入力 ------- - -`標準入力' - 符号なし整数 - -出力 ------- - -`GR1' - 入力された符号なし整数 - -`GR0' - 文字列の長さ。 数字以外が入力された場合は`#FFFF' - -依存する副プログラム ------------------------------- - - * `STR2L' - -使用例 ---------- - - 次のコマンドを実行すると、数値の入力が受け付けられ、入力された数値が表示される。 - - ;;; casl2 -M1024 call_inl.casl $CASL2LIB/inl.casl $CASL2LIB/str2l.casl $CASL2LIB/mull.casl \ - ;;; $CASL2LIB/outl.casl $CASL2LIB/divl.casl $CASL2LIB/rev.casl - MAIN START - LOOP CALL INL ; GR1に数値、GR0に文字列の長さ - JOV OV - AND GR0,GR0 - JZE FIN - CPL GR0,=#FFFF - JZE NAN - CALL OUTL - JUMP LOOP - OV CPL GR0,=#FFFF - JZE LENOV - OUT OVMSG,MLEN1 - JUMP LOOP - NAN OUT NANMSG,MLEN2 - JUMP LOOP - LENOV OUT LENOVMSG,MLEN3 - FIN RET - OVMSG DC 'Over 65535' - MLEN1 DC 10 - NANMSG DC 'Not integer' - MLEN2 DC 11 - LENOVMSG DC 'Str too long. Stop' - MLEN3 DC 18 - END - - $ casl2 -M1024 call_inl.casl $CASL2LIB/inl.casl $CASL2LIB/str2l.casl $CASL2LIB/mull.casl \ - $CASL2LIB/outl.casl $CASL2LIB/divl.casl $CASL2LIB/rev.casl - - -File: yacasl2.info, Node: L2STR, Next: MAX, Prev: INL, Up: CASL2LIB Manual - -6.5 `L2STR' - `l2str.casl' -========================== - - 符号なし整数を文字列に変換する - -入力 ------- - -`GR1' - 符号なし整数 - -`GR2' - 変換した文字列を格納するアドレス - -出力 ------- - -`GR0' - 文字列の長さ - -依存する副プログラム ------------------------------- - - * `DIVL' - - -File: yacasl2.info, Node: MAX, Next: MINIM, Prev: L2STR, Up: CASL2LIB Manual - -6.6 `MAX' - `max.casl' -====================== - - 連続した複数のWORDを符号付き整数とみなして最大値を返す - -入力 ------- - -`GR1' - WORD値を格納したアドレス - -`GR2' - 値の個数 - -出力 ------- - -`GR0' - 最大値 - -依存する副プログラム ------------------------------- - - なし - - -File: yacasl2.info, Node: MINIM, Next: MULA, Prev: MAX, Up: CASL2LIB Manual - -6.7 `MINIM' - `minim.casl' -========================== - - 連続した複数のWORDを符号付き整数とみなして最小値を返す - -入力 ------- - -`GR1' - WORD値を格納したアドレス - -`GR2' - 値の個数 - -出力 ------- - -`GR0' - 最小値 - -依存する副プログラム ------------------------------- - - なし - - -File: yacasl2.info, Node: MULA, Next: MULL, Prev: MINIM, Up: CASL2LIB Manual - -6.8 `MULA' - `mula.casl' -======================== - - -File: yacasl2.info, Node: MULL, Next: OUTA, Prev: MULA, Up: CASL2LIB Manual - -6.9 `MULL' - `mull.casl' -======================== - - -File: yacasl2.info, Node: OUTA, Next: OUTB, Prev: MULL, Up: CASL2LIB Manual - -6.10 `OUTA' - `outa.casl' -========================= - - -File: yacasl2.info, Node: OUTB, Next: OUTD_Q15, Prev: OUTA, Up: CASL2LIB Manual - -6.11 `OUTB' - `outb.casl' -========================= - - -File: yacasl2.info, Node: OUTD_Q15, Next: OUTL, Prev: OUTB, Up: CASL2LIB Manual - -6.12 `OUTD_Q15' - `outd_q15.casl' -================================= - - -File: yacasl2.info, Node: OUTL, Next: REV, Prev: OUTD_Q15, Up: CASL2LIB Manual - -6.13 `OUTL' - `outl.casl' -========================= - - -File: yacasl2.info, Node: REV, Next: STR2L, Prev: OUTL, Up: CASL2LIB Manual - -6.14 `REV' - `rev.casl' -======================= - - -File: yacasl2.info, Node: STR2L, Prev: REV, Up: CASL2LIB Manual - -6.15 `STR2L' - `str2l.casl' -=========================== - - - -Tag Table: -Node: Top441 -Node: Overview847 -Node: Sample usage2911 -Node: Simple output3789 -Node: Assemble result5169 -Node: Register and memory8091 -Node: Register specify11230 -Node: End value12267 -Node: Step count13817 -Node: Only assemble14383 -Node: Analyze word15311 -Node: Use CASL2LIB15712 -Node: casl2 invocation17247 -Node: comet2 invocation21748 -Node: dumpword invocation24607 -Node: CASL2LIB Manual26628 -Node: ABS27546 -Node: DIVA28410 -Node: DIVL29644 -Node: INL30755 -Node: L2STR32398 -Node: MAX32812 -Node: MINIM33221 -Node: MULA33637 -Node: MULL33772 -Node: OUTA33906 -Node: OUTB34042 -Node: OUTD_Q1534182 -Node: OUTL34338 -Node: REV34477 -Node: STR2L34609 - -End Tag Table - - -Local Variables: -coding: utf-8 -End: -- 2.18.0