From d43606faa394e4604ec23d1817ee6358b845e038 Mon Sep 17 00:00:00 2001 From: j8takagi Date: Thu, 1 Nov 2012 16:42:32 +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=81=AE=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- doc/.gitignore | 10 +- doc/Makefile | 32 +- doc/casl2_spec.html | 341 +++++++++++ doc/casl2_spec.texi | 1310 +++++++++++++++++++++++++++++++++++++++++++ doc/style.css | 4 + doc/yacasl2.info | 1182 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 2862 insertions(+), 17 deletions(-) create mode 100644 doc/casl2_spec.html create mode 100644 doc/casl2_spec.texi create mode 100644 doc/yacasl2.info diff --git a/doc/.gitignore b/doc/.gitignore index e5c6b84..3e5ded9 100644 --- a/doc/.gitignore +++ b/doc/.gitignore @@ -1,5 +1,5 @@ -html -doxygen/* -yacasl2.?? -yacasl2.??? -yacasl2.info +install.html +manual.html +manual.info +manual.pdf +manual_html diff --git a/doc/Makefile b/doc/Makefile index 3cde90f..c118e45 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -1,6 +1,7 @@ MANUAL = manual INSTALLDOC = install MANUALSRC = $(MANUAL).texi +MANUALINFO = yacasl2.info INSTALLDOCSRC = $(INSTALLDOC).texi CSS = style.css MANUALHTMLDIR = manual_html @@ -20,20 +21,27 @@ GZIP = gzip prefix ?= ~ infodir ?= $(prefix)/share/info -.PHONY: all install-manual uninstall-manual clean clean-manual clean-installdoc clean-textmp +.PHONY: all info html install-info uninstall-info clean clean-manual clean-installdoc clean-textmp .INTERMEDIATE: $(MANUAL).dvi -all: $(MANUAL).info $(MANUAL).html $(MANUALHTMLDIR) $(MANUAL).pdf $(INSTALLDOC).html ../INSTALL +all: info html $(MANUAL).pdf ../INSTALL + +info: $(MANUALINFO) + +$(MANUALINFO): $(MANUALSRC) + $(MAKEINFO) -o $(MANUALINFO) $(MANUALSRC) + +html: $(MANUAL).html $(MANUALHTMLDIR) $(INSTALLDOC).html + +$(MANUAL).html: $(MANUALSRC) $(CSS) + $(MAKEINFO) -o $@ --no-split --html --css-include=$(CSS) $< $(MANUALHTMLDIR): $(MANUALSRC) $(CSS) $(INSTALL) -d $@ $(INSTALL) $(CSS) $@/ $(MAKEINFO) -o $@ --html --css-ref=$(CSS) $< -$(MANUAL).html: $(MANUALSRC) $(CSS) - $(MAKEINFO) -o $@ --no-split --html --css-include=$(CSS) $< - $(MANUAL).pdf: $(MANUAL).dvi $(DVI2PDF) $< @@ -42,15 +50,15 @@ $(MANUAL).dvi: $(MANUALSRC) @$(MAKE) clean-textmp $(MANUAL).txt: $(MANUALSRC) - $(MAKEINFO) --no-headers -o $@ $(MANUALSRC) + $(MAKEINFO) --no-headers --disable-encoding -o $@ $(MANUALSRC) -install-manual: $(MANUAL).info +install-info: $(MANUAL).info $(INSTALL) -d $(infodir) - $(INSTALL) $(MANUAL).info $(infodir)/ - $(INSTALL-INFO) $(infodir)/$(MANUAL).info $(infodir)/dir - $(GZIP) $(infodir)/$(MANUAL).info + $(INSTALL) $(MANUALINFO) $(infodir)/ + $(INSTALL-INFO) $(infodir)/$(MANUALINFO) $(infodir)/dir + $(GZIP) -f $(infodir)/$(MANUALINFO) -uninstall-manual: $(MANUAL).info +uninstall-info: $(MANUAL).info $(INSTALL-INFO) --delete $(infodir)/$(MANUAL) $(infodir)/dir $(RM) $(infodir)/$(MANUAL)* @@ -58,7 +66,7 @@ $(INSTALLDOC).html: $(INSTALLDOCSRC) $(CSS) $(MAKEINFO) -o $@ --no-split --html --css-include=$(CSS) $< ../INSTALL: $(INSTALLDOCSRC) - $(MAKEINFO) -o $@ --no-headers $< + $(MAKEINFO) -o $@ --no-headers --disable-encoding $< clean: clean-manual clean-installdoc clean-textmp diff --git a/doc/casl2_spec.html b/doc/casl2_spec.html new file mode 100644 index 0000000..9863678 --- /dev/null +++ b/doc/casl2_spec.html @@ -0,0 +1,341 @@ + + +アセンブラ言語の仕様 + + + + + + + + + + +

アセンブラ言語の仕様

+

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 何もしない。 – +
    +

+ + + + + + diff --git a/doc/casl2_spec.texi b/doc/casl2_spec.texi new file mode 100644 index 0000000..225dc04 --- /dev/null +++ b/doc/casl2_spec.texi @@ -0,0 +1,1310 @@ +input texinfo @c -*-texinfo-*- +@c %**start of header +@ifnottex +@documentlanguage ja_JP +@end ifnottex +@setfilename casl2_spec +@documentencoding UTF-8 +@settitle アセンブラ言語の仕様 +@firstparagraphindent insert +@paragraphindent 1 +@ifhtml +@exampleindent 0 +@end ifhtml +@c %**end of header + +@copying +Copyright @copyright{} Information-technology Promotion Agency, Japan. All rights reserved 2012 +@end copying + +@titlepage +@title アセンブラ言語の仕様 +@subtitle 「試験で使用する情報処理用語・プログラム言語など Ver 2.2(平成24年5月22日) 別紙1」より +@end titlepage + +@chapter システム COMETIIの仕様 + +@section ハードウェアの仕様 + +@enumerate +@item +1語は16ビットで、そのビット構成は、次のとおりである。 + +@verbatim + 上位8ビット 下位8ビット +| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |(ビット番号) + ↑ +符号(負:1、非負:0) +@end verbatim + +@item +主記憶の容量は65536語で、そのアドレスは0~65535番地である。 + +@item +数値は、16ビットの2進数で表現する。負数は、2の補数で表現する。 + +@item +制御方式は逐次制御で、命令語は1語長又は2語長である。 + +@item +レジスタとして、@code{GR}(16ビット)、@code{SP}(16ビット)、@code{PR}(16ビット)、@code{FR}(3ビット)の 4 種類がある。 + +@code{GR}(汎用レジスタ、General Register)は、@code{GR0}~@code{GR7}の8個があり、 +算術、論理、比較、シフトなどの演算に用いる。 +このうち、@code{GR1}~@code{GR7}のレジスタは、指標レジスタ(index register) +としてアドレスの修飾にも用いる。 + +@code{SP}(スタックポインタ、Stack Pointer)は、 +スタックの最上段のアドレスを保持している。 + +@code{PR}(プログラムレジスタ、Program Register)は、 +次に実行すべき命令語の先頭アドレスを保持している。 + +@code{FR}(フラグレジスタ、Flag Register)は、 +@code{OF}(Overflow Flag)、@code{SF}(Sign Flag)、@code{ZF}(Zero Flag)と呼ぶ +3個のビットからなり、演算命令などの実行によって次の値が設定される。 +これらの値は、条件付き分岐命令で参照される。 + +@table @code +@item OF +算術演算命令の場合は、演算結果が-32768~32767に収まらなくなったとき1になり、 +それ以外のとき0になる。 +論理演算命令の場合は、演算結果が0~65535に収まらなくなったとき1になり、 +それ以外のとき0になる。 + +@item SF +演算結果の符号が負(ビット番号15が1)のとき1、それ以外のとき0になる。 + +@item ZF +演算結果が零(全部のビットが0)のとき1、それ以外のとき0になる。 +@end table + +@item +論理加算又は論理減算は、被演算データを符号のない数値とみなして、 +加算又は減算する。 +@end enumerate + +@section 命令 + +命令の形式及びその機能を示す。 +ここで、一つの命令コードに対し2種類のオペランドがある場合、 +上段はレジスタ間の命令、下段はレジスタと主記憶間の命令を表す。 + +@enumerate +@item ロード、ストア、ロードアドレス命令 +@multitable @columnfractions .25 .10 .15 .30 .20 +@headitem 命令 @tab 書き方 @* 命令コード @tab 書き方 @* オペランド @tab 命令の説明 @tab FRの設定 +@item ロード @* LoaD @tab @code{LD} @tab @code{r1,r2} @* ----- @* @code{r,adr[,x]} @tab @code{r1 ← (r2)} @* ----- @* @code{r ← (実効アドレス)} @tab ○ @* ただし、@code{OF}には@code{0}が設定される。 +@item ストア @* STore @tab @code{ST} @tab @code{r,adr[,x]} @tab @code{実効アドレス ← (r)} @tab -- +@item ロードアドレス @* Load ADdress @tab @code{LAD} @tab @code{r,adr[,x]} @tab @code{r ← 実効アドレス} @tab -- +@end multitable + +@item 算術、論理演算命令 +@multitable @columnfractions .25 .10 .15 .30 .20 +@headitem 命令 @tab 書き方 @* 命令コード @tab 書き方 @* オペランド @tab 命令の説明 @tab FRの設定 +@item 算術加算 @* ADD Arithmetic @tab @code{ADDA} @tab @code{r1,r2} @* ----- @* @code{r,adr[,x]} @tab @code{r1 ← (r1) + (r2)} @* ----- @* @code{r ← (r) + (実効アドレス)} @tab ○ +@item 論理加算 @* ADD Logical @tab @code{ADDL} @tab @code{r1,r2} @* ----- @* @code{r,adr[,x]} @tab @code{r1 ← (r1) +L (r2)} @* ----- @* @code{r ← (r) +L (実効アドレス)} @tab ○ +@item 算術減算 @* SUBtract Arithmetic @tab @code{SUBA} @tab @code{r1,r2} @* ----- @* @code{r,adr[,x]} @tab @code{r1 ← (r1) - (r2)} @* ----- @* @code{r ← (r) - (実効アドレス)} @tab ○ +@item 論理減算 @* SUBtract Logical @tab @code{SUBL} @tab @code{r1,r2} @* ----- @* @code{r,adr[,x]} @tab @code{r1 ← (r1) - L(r2)} @* ----- @* @code{r ← (r) - L(実効アドレス)} @tab ○ +@item 論理積 @* AND @tab @code{AND} @tab @code{r1,r2} @* ----- @* @code{r,adr[,x]} @tab @code{r1 ← (r1) AND (r2)} @* ----- @* @code{r ← (r) AND (実効アドレス)} @tab ○ @* ただし、@code{OF}には@code{0}が設定される。 +@item 論理和 @* OR @tab @code{OR} @tab @code{r1,r2} @* ----- @* @code{r,adr[,x]} @tab @code{r1 ← (r1) OR (r2)} @* ----- @* @code{r ← (r) OR (実効アドレス)} @tab ○ @* ただし、@code{OF}には@code{0}が設定される。 +@item 排他的論理和 @* eXclusive OR @tab @code{XOR} @tab @code{r1,r2} @* ----- @* @code{r,adr[,x]} @tab @code{r1 ← (r1) XOR (r2)} @* ----- @* @code{r ← (r) XOR (実効アドレス)} @tab ○ @* ただし、@code{OF}には@code{0}が設定される。 +@end multitable + +@item 比較演算命令 +@multitable @columnfractions .25 .10 .15 .30 .20 +@headitem 命令 @tab 書き方 @* 命令コード @tab 書き方 @* オペランド @tab 命令の説明 @tab FRの設定 +@item 算術比較 @* ComPare Arithmetic @tab @code{CPA}@tab @code{r1,r2} @* ----- @* @code{r,adr[,x]} @tab @code{(r1)}と@code{(r2)}、又は@code{(r)}と@code{(実効アドレス)}の算術比較を行い、比較結果によって、@code{FR}に次の値を設定する。 +@table @dfn +@item 比較結果 +FRの値 +@item @code{(r1) > (r2)} 又は @code{(r) > (実効アドレス)} +@code{SF:0, ZF:0} +@item @code{(r1) = (r2)} 又は @code{(r) = (実効アドレス)} +@code{SF:0, ZF:1} +@item @code{(r1) < (r2)} 又は @code{(r) < (実効アドレス)} +@code{SF:1, ZF:0} +@end table +@tab ○ @* ただし、@code{OF}には@code{0}が設定される。 +@item 論理比較 @* ComPare Logical @tab @code{CPL} @tab @code{r1,r2} @* ----- @* @code{r,adr[,x]} @tab @code{(r1)}と@code{(r2)}、又は@code{(r)}と@code{(実効アドレス)}の論理比較を行い、比較結果によって、@code{FR}に次の値を設定する。 +@table @dfn +@item 比較結果 +FRの値 +@item @code{(r1) > (r2)} 又は @code{(r) > (実効アドレス)} +@code{SF:0}, @code{ZF:0} +@item @code{(r1) = (r2)} 又は @code{(r) = (実効アドレス)} +@code{SF:0}, @code{ZF:1} +@item @code{(r1) < (r2)} 又は @code{(r) < (実効アドレス)} +@code{SF:1}, @code{ZF:0} +@end table +@tab ○ @* ただし、@code{OF}には@code{0}が設定される。 +@end multitable + +@item シフト演算命令 +@multitable @columnfractions .25 .10 .15 .30 .20 +@headitem 命令 @tab 書き方 @* 命令コード @tab 書き方 @* オペランド @tab 命令の説明 @tab FRの設定 +@item 算術左シフト @* Shift Left Arithmetic @tab @code{SLA} @tab @code{r,adr[,x]} @tab 符号を除き@code{(r)}を実効アドレスで指定したビット数だけ左にシフトする。シフトの結果、空いたビット位置には、@code{0}が入る。 @tab ○ @* ただし、@code{OF}にはレジスタから最後に送り出されたビットの値が設定される。 +@item 算術右シフト @* Shift Right Arithmetic @tab @code{SRA} @tab @code{r,adr[,x]} @tab 符号を除き@code{(r)}を実効アドレスで指定したビット数だけ右にシフトする。シフトの結果、空いたビット位置には、符号と同じものが入る。 @tab ○ @* ただし、@code{OF}にはレジスタから最後に送り出されたビットの値が設定される。 +@item 論理左シフト @* Shift Left Logical @tab @code{SLL} @tab @code{r,adr[,x]} @tab 符号を含み@code{(r)}を実効アドレスで指定したビット数だけ左にシフトする。シフトの結果,空いたビット位置には@code{0}が入る。 @tab ○ @* ただし、@code{OF}にはレジスタから最後に送り出されたビットの値が設定される。 +@item 論理右シフト @* Shift Right Logical @tab @code{SRL} @tab @code{r,adr[,x]} @tab 符号を含み@code{(r)}を実効アドレスで指定したビット数だけ右にシフトする。シフトの結果、空いたビット位置には@code{0}が入る。 @tab ○ @* ただし、@code{OF}にはレジスタから最後に送り出されたビットの値が設定される。 +@end multitable + +@item 分岐命令 +@multitable @columnfractions .25 .10 .15 .30 .20 +@headitem 命令 @tab 書き方 @* 命令コード @tab 書き方 @* オペランド @tab 命令の説明 @tab FRの設定 +@item 正分岐 @* Jump on Plus @tab @code{JPL} @tab @code{adr[,x]} @tab @code{FR}の値によって、実効アドレスに分岐する。分岐しないときは、次の命令に進む。 +@table @dfn +@item 分岐するときの@code{FR}の値 +@code{SF:0, ZF:0} +@end table +@tab -- +@item 負分岐 @* Jump on MINUS @tab @code{JMI} @tab @code{adr[,x]} @tab @code{FR}の値によって、実効アドレスに分岐する。分岐しないときは、次の命令に進む。 +@table @dfn +@item 分岐するときの@code{FR}の値 +@code{SF:1} +@end table +@tab -- +@item 非零分岐 @* Jump on Non Zero @tab @code{JNZ} @tab @code{adr[,x]} @tab @code{FR}の値によって、実効アドレスに分岐する。分岐しないときは、次の命令に進む。 +@table @dfn +@item 分岐するときの@code{FR}の値 +@code{ZF:0} +@end table +@tab -- +@item 零分岐 @* Jump on ZEro @tab @code{JZE} @tab @code{adr[,x]} @tab @code{FR}の値によって、実効アドレスに分岐する。分岐しないときは、次の命令に進む。 +@table @dfn +@item 分岐するときの@code{FR}の値 +@code{ZF:1} +@end table +@tab -- +@item オーバーフロー分岐 @* Jump on OVerflow @tab @code{JOV} @tab @code{adr[,x]} @tab @code{FR}の値によって、実効アドレスに分岐する。分岐しないときは、次の命令に進む。 +@table @dfn +@item 分岐するときの@code{FR}の値 +@code{OF:1} +@end table +@tab -- +@item 無条件分岐 @* unconditional Jump @tab @code{JUMP} @tab @code{adr[,x]} @tab 無条件に実効アドレスに分岐する。 @tab -- +@end multitable + +@item スタック操作命令 +@multitable @columnfractions .25 .10 .15 .30 .20 +@headitem 命令 @tab 書き方 @* 命令コード @tab 書き方 @* オペランド @tab 命令の説明 @tab FRの設定 +@item プッシュ @* PUSH @tab @code{PUSH} @tab @code{adr[,x]} @tab @code{SP ← (SP)-L1}, @* @code{(SP)← (実効アドレス)} @tab -- +@item ポップ @* POP @tab @code{POP} @tab @code{r} @tab @code{r ← ( (SP) )}, @* @code{SP ← (SP) +L 1} @tab -- +@end multitable + +@item コール、リターン命令 +@multitable @columnfractions .25 .10 .15 .30 .20 +@headitem 命令 @tab 書き方 @* 命令コード @tab 書き方 @* オペランド @tab 命令の説明 @tab FRの設定 +@item コール @* CALL subroutine @tab @code{CALL} @tab @code{adr[,x]} @tab @code{SP ← (SP)-L 1}, @* @code{(SP) ← (PR)}, @* @code{PR ← 実効アドレス} @tab -- +@item リターン @* RETrun form subroutine @tab @code{RET} @tab @tab @code{PR ← ( (SP) )}, @* @code{SP ← (SP) +L 1} @tab -- +@end multitable + +@item その他 +@multitable @columnfractions .25 .10 .15 .30 .20 +@headitem 命令 @tab 書き方 @* 命令コード @tab 書き方 @* オペランド @tab 命令の説明 @tab FRの設定 +@item スーパーバイザコール @* SuperVisor CALL @tab @code{SVC} @tab @code{adr[,x]} @tab 実効アドレスを引数として割出しを行う。実行後の@code{GR}と@code{FR}は不定となる。 @tab -- +@item ノーオペレーション @* No operation @tab @code{NOP} @tab @tab 何もしない。 @tab -- +@end multitable +@end enumerate + +@itemize +@item +注 +@table @dfn +@item @code{r}, @code{r1}, @code{r2} +いずれも @code{GR}を示す。指定できる@code{GR}は@code{GR0}~@code{GR7} + +@item @code{adr} +アドレスを示す。指定できる値の範囲は@code{0}~@code{65535} + +@item @code{x} +指標レジスタとして用いる@code{GR}を示す。指定できる@code{GR}は@code{GR1}~@code{GR7} + +@item @code{[ ]} +[ ]内の指定は省略できることを示す。 + +@item @code{( )} +( )内のレジスタ又はアドレスに格納されている内容を示す。 + +@item @code{実効アドレス} +@code{adr}と@code{x}の内容との論理加算値又はその値が示す番地 + +@item @code{←} +演算結果を、左辺のレジスタ又はアドレスに格納することを示す。 + +@item @code{+L}, @code{-L} +論理加算、論理減算を示す。 + +@item @code{FR}の設定 +@itemize +@item ○: 設定されることを示す。 +@item ー: 実行前の値が保持されることを示す。 +@end itemize +@end table +@end itemize + +@section 文字の符号表 +@enumerate +@item +JIS X 0201 ラテン文字・片仮名用8ビット符号で規定する文字の符号表を使用する。 + +@item + + +@end enumerate +(1) + 行 列 + 0 + +1 +(2) 右に符号表の一部を示す。1 文字は 8 ビットからなり,上位 4 ビットを列で,下位 4 ビットを行で示す。例えば,間隔,4,H,¥ のビット構成は,16 進表示で,それぞれ 20,34,48, +2 + +3 + +4 + +5 +6 +5C である。16 進表示で,ビット構成が 21 ~7E(及び表では省略している A1 ~ DF)に対応する文字を図形文字という。図形文字は,表示(印刷)装置で,文字として表示(印字)できる。 +7 + +8 + +9 + 10 + +(3) この表にない文字とそのビット構成が必要な場合は,問題中で与える。 +11 + +12 +13 +14 +15 +02 03 +間隔 0 +! +1 +” +2 +# +3 +$ +4 +% +5 +& +6 +' +7 +( +8 +) +9 +* +: ++ +; +, +< +‐ += +. +> +/ +? +04 +@ +A +B +C +D +E +F +G +H +I +J +K +L +M +N +O +05 +P +Q +R +S +T +U +V +W +X +Y +Z +[ +¥ +] +^ +_ +06 +` +a +b +c +d +e +f +g +h +i +j +k +l +m +n +o +07 +p +q +r +s +t +u +v +w +x +y +z +{ +| +} +~ + +@bye + + +シフト演算命令 +算術左シフト SLA r,adr[,x] + Shift Left Arithmetic + r,adr[,x] + +SLL r,adr[,x] +SRL r,adr[,x] +JPL adr[,x] +JMI adr[,x] +JNZ adr[,x] +JZE adr[,x] +JOV adr[,x] +JUMP adr[,x] +論理左シフト +Shift Left Logical +論理右シフト +Shift Right Logical +(5) +←(r1)+(r2) +←(r)+(実効アドレス) +←(r1)+L(r2) +←(r)+L(実効アドレス) +←(r1)-(r2) +←(r)-(実効アドレス) +←(r1)-L(r2) +←(r)-L(実効アドレス) +←(r1)AND(r2) +←(r)AND(実効アドレス) +←(r1)OR(r2) +←(r)OR(実効アドレス) +←(r1)XOR(r2) +←(r)XOR(実効アドレス) +比較演算命令 +r1,r2 +(4) +r1 +r +r1 +r +r1 +r +r1 +r +r1 +r +r1 +r +r1 +r +分岐命令 +正分岐 +Jump on PLus +負分岐 +Jump on MInus +非零分岐 +Jump on Non Zero +零分岐 +Jump on ZEro +オーバフロー分岐 +Jump on OVerflow +無条件分岐 +unconditional JUMP +FR の値によって、実効アドレスに分岐す +る。分岐しないときは、次の命令に進む。 +分岐するときの FR の値 +命令 +OF +SF +ZF +0 +0 +JPL +1 +JMI + +JNZ +0 +1 +JZE +JOV +1 +無条件に実効アドレスに分岐する。 + +(6) +スタック操作命令 +プッシュ +PUSH +ポップ +POP +PUSH adr[,x] +POP r +コール CALL adr[,x] + CALL subroutine +リターン RET + RETurn from subroutine +SVC adr[,x] +NOP +(7) +(8) +SP ←(SP)-L 1, - + (SP)← 実効アドレス + r ←((SP)) + , + SP ←(SP)+L 1 +SP ←(SP)-L 1, - + (SP)←(PR) + , + PR ← 実効アドレス + PR ←((SP)) + , + SP ←(SP)+L 1 +コール,リターン命令 +その他 +スーパバイザコール +SuperVisor Call +ノーオペレーション +No OPeration +(注) r,r1,r2 + +adr + +x +[ +] + +( +) + +実効アドレス +← + ++L,-L +FR の設定 +実効アドレスを引数として割出しを行 +う。実行後の GR と FR は不定となる。 +- +何もしない。 +いずれも GR を示す。指定できる GR は GR0 ~ GR7 +アドレスを示す。指定できる値の範囲は 0 ~ 65535 +指標レジスタとして用いる GR を示す。指定できる GR は GR1 ~ GR7 +[ +]内の指定は省略できることを示す。 +( +)内のレジスタ又はアドレスに格納されている内容を示す。 +adr と x の内容との論理加算値又はその値が示す番地 +演算結果を、左辺のレジスタ又はアドレスに格納することを示す。 +論理加算、論理減算を示す。 +○ :設定されることを示す。 +- :実行前の値が保持されることを示す。 + +@section 文字の符号表 +(1) JIS X 0201 ラテン文字・片仮名用 8 ビット符 行 列 +0 +号で規定する文字の符号表を使用する。 +1 +(2) 右に符号表の一部を示す。1 文字は 8 ビット +2 +からなり、上位 4 ビットを列で、下位 4 ビット +3 +を行で示す。例えば、間隔、4、H、¥ のビット +4 +構成は、16 進表示で、それぞれ 20、34、48、 +5 +6 +5C である。16 進表示で、ビット構成が 21 ~ +7 +7E(及び表では省略している A1 ~ DF)に対応 +8 +する文字を図形文字という。図形文字は、表示 +9 +(印刷)装置で、文字として表示(印字)できる。 10 +(3) この表にない文字とそのビット構成が必要な +11 +場合は、問題中で与える。 +12 +13 +14 +15 +02 03 +間隔 0 +! +1 +” +2 +# +3 +$ +4 +% +5 +& +6 +' +7 +( +8 +) +9 +* +: ++ +; +, +< +‐ += +. +> +/ +? +04 +@ +A +B +C +D +E +F +G +H +I +J +K +L +M +N +O +05 +P +Q +R +S +T +U +V +W +X +Y +Z +[ +¥ +] +^ +_ +06 +` +a +b +c +d +e +f +g +h +i +j +k +l +m +n +o +07 +p +q +r +s +t +u +v +w +x +y +z +{ +| +} +~ + +@chapter アセンブラ言語 CASLIIの仕様 +@section 言語の仕様 +(1) CASLIIは、COMETIIのためのアセンブラ言語である。 +(2) プログラムは、命令行及び注釈行からなる。 +(3) 1 命令は 1 命令行で記述し、次の行へ継続できない。 +(4) 命令行及び注釈行は、次に示す記述の形式で、行の 1 文字目から記述する。 +行 の 種 類 +記 述 の 形 式 +オペランドあり [ラベル] +{空白} +{命令コード} +{空白} +{オペランド} +[{空白} +[コメント] +] +命令行 +オペランドなし [ラベル] +{空白} +{命令コード} +[{空白} +[{;} +[コメント]] +] +注釈行 +[空白] [コメント] +{;} +(注) [ +] [ +]内の指定が省略できることを示す。 +{ +} { +}内の指定が必須であることを示す。 +その命令の(先頭の語の)アドレスを他の命令やプログラムから参照するための +ラベル +名前である。長さは 1 ~ 8 文字で、先頭の文字は英大文字でなければならない。 +以降の文字は、英大文字又は数字のいずれでもよい。なお、予約語である GR0 ~ +GR7 は、使用できない。 +空白 +1 文字以上の間隔文字の列である。 +命令コード 命令ごとに記述の形式が定義されている。 +オペランド 命令ごとに記述の形式が定義されている。 +コメント +覚え書きなどの任意の情報であり、処理系で許す任意の文字を書くことができる。 + +@section 命令の種類 +命令は、4 種類のアセンブラ命令(START,END,DS,DC) 種類のマクロ命令(IN, +,4 +OUT,RPUSH,RPOP)及び機械語命令(COMETIIの命令)からなる。その仕様を次に示 +す。 +命令の種類 +ラベル +命 令 +コード +オペランド +機 +能 +プログラムの先頭を定義 +プログラムの実行開始番地を定義 +ラベル START [実行開始番地] +他のプログラムで参照する入口名 +を定義 +アセンブラ命令 +END +プログラムの終わりを明示 + + +[ラベル] DS +語数 +領域を確保 +[ラベル] DC +定数[,定数]... +定数を定義 +[ラベル] IN +入力領域,入力文字長領域 入力装置から文字データを入力 +[ラベル] OUT +出力領域,出力文字長領域 出力装置へ文字データを出力 +マクロ命令 +[ラベル] RPUSH +GR の内容をスタックに格納 +[ラベル] RPOP +スタックの内容を GR に格納 +機械語命令 +[ラベル] +( +「1.2 命令」を参照) + +@section アセンブラ命令 +アセンブラ命令は、アセンブラの制御などを行う。 +(1) +START [実行開始番地] +START 命令は、プログラムの先頭を定義する。 +実行開始番地は、そのプログラム内で定義されたラベルで指定する。指定がある場合 +はその番地から、省略した場合は START 命令の次の命令から、実行を開始する。 +また、この命令につけられたラベルは、他のプログラムから入口名として参照できる。 +(2) +END +END 命令は、プログラムの終わりを定義する。 +(3) +DS +語数 +DS 命令は、指定した語数の領域を確保する。 +語数は、10 進定数(≧ 0)で指定する。語数を 0 とした場合、領域は確保しないが、 +ラベルは有効である。 +(4) +DC +定数[,定数]... +DC 命令は,定数で指定したデータを(連続する)語に格納する。 +定数には、10 進定数、16 進定数、文字定数、アドレス定数の 4 種類がある。 +定数の種類 +書き方 +命 令 の 説 明 +n で指定した 10 進数値を、 語の 2 進数データとして格納する。ただし、n +1 +10 進定数 +n +が-32768 ~ 32767 の範囲にないときは、その下位 16 ビットを格納する。 +h は 4 けたの 16 進数(16 進数字は 0 ~ 9、A ~ F)とする。h で指定した +16 進定数 +#h +16 進数値を 1 語の 2 進数データとして格納する(0000 ≦ h ≦ FFFF) +。 +文字列の文字数(> 0)分の連続する領域を確保し、最初の文字は第 1 語の +下位 8 ビットに、2 番目の文字は第 2 語の下位 8 ビットに、...と順次文字 +文字定数 +'文字列' データとして格納する。各語の上位 8 ビットには 0 のビットが入る。 +文字列には、間隔及び任意の図形文字を書くことができる。ただし、アポ +ストロフィ(')は 2 個続けて書く。 +アドレス定数 ラベル ラベルに対応するアドレスを 1 語の 2 進数データとして格納する。 + +@section マクロ命令 +マクロ命令は、あらかじめ定義された命令群とオペランドの情報によって、目的の機 +能を果たす命令群を生成する(語数は不定) +。 +(1) +IN +入力領域、入力文字長領域 +IN 命令は、あらかじめ割り当てた入力装置から、1 レコードの文字データを読み込む。 +入力領域は、256 語長の作業域のラベルであり、この領域の先頭から、1 文字を 1 語に +対応させて順次入力される。レコードの区切り符号(キーボード入力の復帰符号など) +は、格納しない。格納の形式は、DC 命令の文字定数と同じである。入力データが 256 文 +字に満たない場合、入力領域の残りの部分は実行前のデータを保持する。入力データが +256 文字を超える場合、以降の文字は無視される。 +入力文字長領域は、1 語長の領域のラベルであり、入力された文字の長さ(≧ 0)が 2 +進数で格納される。ファイルの終わり(end of file)を検出した場合は、-1 が格納され +る。 +IN 命令を実行すると、GR の内容は保存されるが、FR の内容は不定となる。 +(2) +OUT +出力領域、出力文字長領域 +OUT 命令は、あらかじめ割り当てた出力装置に、文字データを、1 レコードとして書き +出す。 +出力領域は、出力しようとするデータが 1 文字 1 語で格納されている領域のラベルで +ある。格納の形式は、DC 命令の文字定数と同じであるが、上位 8 ビットは、OS が無視 +するので 0 でなくてもよい。 +出力文字長領域は、1 語長の領域のラベルであり、出力しようとする文字の長さ +(≧ 0) +を 2 進数で格納しておく。 +OUT 命令を実行すると、GR の内容は保存されるが、FR の内容は不定となる。 +(3) +RPUSH +RPUSH 命令は、GR の内容を、GR1,GR2,...,GR7 の順序でスタックに格納する。 +(4) +RPOP +RPOP 命令は、スタックの内容を順次取り出し、GR7,GR6,...,GR1 の順序で GR に +格納する。 +@section 機械語命令 +機械語命令のオペランドは、次の形式で記述する。 +r, r1, r2 +x +adr +GR は、記号 GR0 ~ GR7 で指定する。 +指標レジスタとして用いる GR は、記号 GR1 ~ GR7 で指定する。 +アドレスは、10 進定数、16 進定数、アドレス定数又はリテラルで指定する。 +リテラルは、一つの 10 進定数、16 進定数又は文字定数の前に等号(=)を付けて +記述する。CASLIIは、等号の後の定数をオペランドとする DC 命令を生成し、そ +のアドレスを adr の値とする。 +@section その他 +(1) アセンブラによって生成される命令語や領域の相対位置は、アセンブラ言語での記述 +順序とする。ただし、リテラルから生成される DC 命令は、END 命令の直前にまとめて +配置される。 +(2) 生成された命令語、領域は、主記憶上で連続した領域を占める。 + +@chapter プログラム実行の手引 +@section OS +プログラムの実行に関して、次の取決めがある。 +(1) アセンブラは、未定義ラベル(オペランド欄に記述されたラベルのうち、そのプログ +ラム内で定義されていないラベル)を、他のプログラムの入口名(START 命令のラベ +ル)と解釈する。この場合、アセンブラはアドレスの決定を保留し、その決定を OS に +任せる。OS は、実行に先立って他のプログラムの入口名との連係処理を行いアドレス +を決定する(プログラムの連係) +。 +(2) プログラムは、OS によって起動される。プログラムがロードされる主記憶の領域は +不定とするが、プログラム中のラベルに対応するアドレス値は、OS によって実アドレ +スに補正されるものとする。 +(3) プログラムの起動時に、OS はプログラム用に十分な容量のスタック領域を確保し、 +その最後のアドレスに 1 を加算した値を SP に設定する。 +(4) OS は、CALL 命令でプログラムに制御を渡す。プログラムを終了し OS に制御を戻す +ときは、RET 命令を使用する。 +(5) IN 命令に対応する入力装置、OUT 命令に対応する出力装置の割当ては、プログラムの +実行に先立って利用者が行う。 +(6) OS は、入出力装置や媒体による入出力手続の違いを吸収し、システムでの標準の形 +式及び手続(異常処理を含む)で入出力を行う。したがって、IN、OUT 命令では、入出 +力装置の違いを意識する必要はない。 +@section 未定義事項 +プログラムの実行等に関し、この仕様で定義しない事項は、処理系によるものとする。 + +@unnumbered参考資料 + +参考資料は、COMETIIの理解を助けるため又は COMETIIの処理系作成者に対する +便宜のための資料である。したがって、COMETII、CASLIIの仕様に影響を与えるもの +ではない。 + +@section 命令語の構成 +命令語の構成は定義しないが、次のような構成を想定する。ここで、OP の数値は 16 +進表示で示す。 +15 +11 +7 +3 +第1語 +0 15 +OP +r/r1 x/r2 +主OP副OP +0 +0 +- +- +1 +0 +1 +2 +4 +2 +0 +1 +2 +3 +4 +5 +6 +7 +3 +0 +1 +2 +4 +5 +6 +4 +0 +1 +4 +5 +5 +0 +1 +2 +3 +6 +1 +- +2 +- +3 +- +4 +- +5 +- +6 +- +7 +0 +- +1 +- +8 +0 +- +1 +- +- +9 +~ +E +F +0 +- +0 +第2語 +adr +- +- +- +- +- +- +- +- +- +- +- +- +- +ビット番号 +命令語とアセンブラとの対応 +命令 +語長 +1 +2 +2 +2 +1 +2 +2 +2 +2 +1 +1 +1 +1 +2 +2 +2 +1 +1 +1 +2 +2 +1 +1 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +1 +2 +1 +機械語命令 +NOP +LD +ST +LAD +LD +ADDA +SUBA +ADDL +SUBL +ADDA +SUBA +ADDL +SUBL +AND +OR +XOR +AND +OR +XOR +CPA +CPL +CPA +CPL +SLA +SRA +SLL +SRL +JMI +JNZ +JZE +JUMP +JPL +JOV +PUSH +POP +CALL +RET + +r,adr,x +r,adr,x +r,adr,x +r1,r2 +r,adr,x +r,adr,x +r,adr,x +r,adr,x +r1,r2 +r1,r2 +r1,r2 +r1,r2 +r,adr,x +r,adr,x +r,adr,x +r1,r2 +r1,r2 +r1,r2 +r,adr,x +r,adr,x +r1,r2 +r1,r2 +r,adr,x +r,adr,x +r,adr,x +r,adr,x +adr,x +adr,x +adr,x +adr,x +adr,x +adr,x +adr,x +r +adr,x +意味 +no operation +load +store +load address +load +add arithmetic +subtract arithmetic +add logical +subtract logical +add arithmetic +subtract arithmetic +add logical +subtract logical +and +or +exclusive or +and +or +exclusive or +compare arithmetic +compare logical +compare arithmetic +compare logical +shift left arithmetic +shift right arithmetic +shift left logical +shift right logical +jump on minus +jump on non zero +jump on zero +unconditional jump +jump on plus +jump on overflow +push +pop +call subroutine +return from subroutine +その他の命令 +2 +SVC +adr,x +supervisor call + +@section マクロ命令 +マクロ命令が生成する命令群は定義しない(語数不定)が,次の例のような命令群を +生成することを想定する。 +〔例〕IN 命令 +LABEL IN +IBUF,LEN + +マクロ生成 + + +LABEL + + + + + + +PUSH +PUSH +LAD +LAD +SVC +POP +POP +0,GR1 +0,GR2 +GR1,IBUF +GR2,LEN +1 +GR2 +GR1 +3. +シフト演算命令におけるビットの動き +シフト演算命令において,例えば,1 ビットのシフトをしたときの動き及び OF の変化 +は,次のとおりである。 +(1) 算術左シフトでは,ビット番号 14 の値が設定される。 +OF +15 +14 +13 +12 +11 +10 +9 +8 +7 +6 +5 +4 +3 +2 +1 +0 +0 +(2) 算術右シフトでは,ビット番号 0 の値が設定される。 +15 +14 +13 +12 +11 +10 +9 +8 +7 +6 +5 +4 +3 +2 +1 0 +1 +OF +0 +(3) 論理左シフトでは,ビット番号 15 の値が設定される。 +OF +15 +14 +13 +12 +11 +10 +9 +8 +7 +6 +5 +4 +3 +2 +0 +(4) 論理右シフトでは,ビット番号 0 の値が設定される。 +15 +14 +13 +12 +11 +10 +9 +8 +7 +6 +5 +4 +3 +2 +1 +0 +OF +0 +4. +プログラムの例 +COUNT1 +; +; +; + + + + + +MORE + + + +RETURN + + + + +START +入力 +処理 +出力 +PUSH +PUSH +SUBA +AND +JZE +LAD +LAD +AND +JNZ +LD +POP +POP +RET +END + +; +GR1:検索する語 +GR1 中の'1'のビットの個数を求める +GR0:GR1 中の'1'のビットの個数 +0,GR1 +; +0,GR2 +; +GR2,GR2 +; Count = 0 +GR1,GR1 +; 全部のビットが'0'? +RETURN +; 全部のビットが'0'なら終了 +GR2,1,GR2 +; Count = Count + 1 +GR0,‐1,GR1 +; 最下位の'1'のビット 1 個を +GR1,GR0 +; '0'に変える +MORE +; '1'のビットが残っていれば繰返し +GR0,GR2 +; GR0 = Count +GR2 +; +GR1 +; + +; 呼出しプログラムへ戻る + +; + diff --git a/doc/style.css b/doc/style.css index d117590..1f7d790 100644 --- a/doc/style.css +++ b/doc/style.css @@ -120,4 +120,8 @@ pre.example strong { dt { font-weight: bold; +} + +dfn { + font-style: normal; } \ No newline at end of file diff --git a/doc/yacasl2.info b/doc/yacasl2.info new file mode 100644 index 0000000..264952b --- /dev/null +++ b/doc/yacasl2.info @@ -0,0 +1,1182 @@ +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