YACASL2 - Linux上のCASL II処理系

Table of Contents

1 YACASL2の概要

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

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

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

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

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

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

要件

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

インストール時に、targccmakeが必要です。

2 YACASL2のインストール

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

  1. YACASL2ファイルのダウンロード
  2. YACASL2ファイルの検証
  3. YACASL2ファイルの展開
  4. casl2comet2dumpwordのビルド
  5. casl2の実行テスト
  6. 詳細なテスト
  7. 環境変数PATHの設定

2.1 YACASL2ファイルのダウンロード

GitHub/j8takagi/YACASL2ダウンロードページから最新版のtgzファイルをダウンロードします(2010年3月6日現在、v0.1j8takagi-YACASL2-6323ce4.tar.gz)。

続けて、対応するmd5sumフィルをダウンロードします(2010年3月6日現在、j8takagi-YACASL2-6323ce4.tar.gz.md5sum)。

2.2 YACASL2ファイルの検証

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

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

2.3 YACASL2ファイルの展開

YACASL2ファイルをダウンロードしたら、次のコマンドで展開します。

  $ tar xvzf yacasl2.tar.gz

2.4 casl2comet2dumpwordのビルド

展開したら、次のコマンドでcasl2comet2dumpwordをビルドします。

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

2.5 casl2の実行テスト

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

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

2.6 詳細なテスト

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

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

2.7 環境変数PATHの設定

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

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

  $ echo $SHELL
  /bin/bash

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

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

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

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

3 YACASL2 の使い方

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

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

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

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

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

  $ casl2 hello.casl
  Hello, World!

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

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

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

  $ casl2 addl.casl
  $

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

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

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

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

  $ casl2 sum_10.casl
  $

3.2 アセンブル結果の確認

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

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

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

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

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

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

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

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

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

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

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

3.3.1 特定のレジスタを表示

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  $ casl2 -Ohello.o hello.casl

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

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

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

  $ comet2 hello.o
  Hello, World!

3.5 1語の解析

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

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

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

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

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

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

3.6 CASL2ライブラリの使用

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

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

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

3.6.1 数値を出力する

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

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

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

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

4 YACASL2コマンドマニュアル

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

4.1 casl2

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

  $ casl2 hello.casl

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

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

オプション

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

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

4.2 comet2

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

  $ comet2 hello.o

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

オプション

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

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

4.3 dumpword

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

  $ dumpword 10

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

オプション

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

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

5 CASL2LIBマニュアル

5.1 ABS - abs.casl

入力された整数を絶対値に変換して出力

入力

GR1
-32768〜32767の整数

出力

GR1
入力された整数の絶対値
OF
入力されたGR1が-32768の場合、1
SF
入力されたGR1が負数(-32767〜-1)の場合、1

依存する副プログラム

なし

使用例

  ;;; ABSを呼び出す
  MAIN    START
          LAD     GR2,0
  MLOOP   CPA     GR2,MLEN
          JZE     MFIN
          LD      GR1,MVAL,GR2
          CALL    OUTA
          CALL    ABS
          JOV     PUTOV
          JMI     PUTM
          OUT     PLUS,=1
          JUMP    PUTD
  PUTM    OUT     MINUS,=1
          JUMP    PUTD
  PUTOV   OUT     OV,=2
  PUTD    CALL    OUTA
          OUT     SEP,MLEN
          LAD     GR2,1,GR2
          JUMP    MLOOP
  MFIN    RET
  MVAL    DC      12,-12,1,-1,32767,-32767,0,-32768
  MLEN    DC      8
  SEP     DC      '--------'
  PLUS    DC      '+'
  MINUS   DC      '-'
  OV      DC      'OV'
          END
  ../../../../casl2 abs.casl ../../../../as/casl2lib/outa.casl
  12
  +
  12
  --------
  -12
  -
  12
  --------
  1
  +
  1
  --------
  -1
  -
  1
  --------
  32767
  +
  32767
  --------
  -32767
  -
  32767
  --------
  0
  +
  0
  --------
  -32768
  OV
  -32768
  --------

5.2 ADDL32 - addl32.casl

32ビットの値を、連続する2語の領域に格納

入力

GR1
32ビット値1の先頭アドレス
GR2
32ビット値2の先頭アドレス

出力

GR0
和の先頭アドレス
OF
上位アドレスでオーバーフローした場合、1
SF
和が負数(-32767〜-1)の場合、1
ZF
和が0の場合、1

使用例

  MAIN    START
          LAD     GR1,A
          LAD     GR2,B
          CALL    ADDL32
          LD      GR2,GR0
          LD      GR1,1,GR2
          CALL    OUTL
          LD      GR1,0,GR2
          CALL    OUTL
          RET
  A       DC      6,10
  B       DC      2,65530
          END
  4
  9

依存する副プログラム

なし

5.3 DIVA -diva.casl

-32,767〜32,767の範囲にある整数の割算(筆算方式)を行う

入力

GR1
被除数
GR2
除数

出力

GR0

GR3
剰余
OF
除数が0の場合、1
SF
商が負数(-32767〜-1)の場合、1
ZF
商が0の場合、1

依存する副プログラム

5.4 DIVL - divl.casl

0〜65,535の範囲にある整数の割算(筆算方式)を行う

入力

GR1
被除数
GR2
除数

出力

GR0

GR3
剰余
OF
除数が0の場合、1
SF
商が32,768〜65535の場合、1
ZF
商が0の場合、1

依存する副プログラム

なし

使用例

  MAIN    START
  BEGIN   LAD     GR1,101
          LAD     GR2,10
          CALL    DIVL
          RET
          END

5.5 INL - inl.casl

5.6 L2STR - l2str.casl

5.7 MAX - max.casl

5.8 MINIM - minim.casl

5.9 MULA - mula.casl

5.10 MULL - mull.casl

5.11 OUTA - outa.casl

5.12 OUTB - outb.casl

5.13 OUTD_Q15 - outd_q15.casl

5.14 OUTL - outl.casl

5.15 REV - rev.casl

5.16 STR2L - str2l.casl