試験センターから発表されているCASL仕様です。入力ミスがあるかも知れませんので,使用にあたっては,試験センターからの資料を確認して下さい。
図,表は,意味を変えないようしていますが,入力しやすいように変更しています。
原典@公式 http://www.jitec.jp/1_01mosikomi/17h_annaisho/17h_10.pdf
(1) 1 語は16 ビットで,そのビット構成は,次のとおりである。
| 上位8ビット | 下位8ビット | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| ↑符号(負:1,非負:0) | |||||||||||||||
斎藤注:上の表の中の15〜1は,ビット番号というコメントがついています。
(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) 論理加算又は論理減算は,被演算データを符号のない数値とみなして,加算又は減算する。
(↑ここまでレイアウトチェック済み)
命令の形式及びその機能を示す。ここで,一つの命令コードに対し2 種類のオペランドがある場合,上段はレジスタ間の命令,下段はレジスタと主記憶間の命令を表す。
書き方
命令命令
コードオペランド命令の説明FRの設定
(1) ロード,ストア,ロードアドレス命令
r1,r2 r1 ←(r2) ロード
LoaD LD
r,adr[,x] r ←(実効アドレス)
○*1
ストア
STore ST r,adr[,x] 実効アドレス←(r)
ロードアドレス
Load ADdress LAD r,adr[,x] r ← 実効アドレス
−
− 33 −
(2) 算術,論理演算命令
r1,r2 r1 ←(r1)+(r2) 算術加算
ADD Arithmetic ADDA
r,adr[,x] r ←(r)+(実効アドレス)
r1,r2 r1 ←(r1)+L(r2) 論理加算
ADD Logical ADDL
r,adr[,x] r ←(r)+L(実効アドレス)
r1,r2 r1 ←(r1)−(r2) 算術減算
SUBtract Arithmetic SUBA
r,adr[,x] r ←(r)−(実効アドレス)
r1,r2 r1 ←(r1)−L(r2) 論理減算
SUBtract Logical SUBL
r,adr[,x] r ←(r)−L(実効アドレス)
○
r1,r2 r1 ←(r1)AND(r2) 論理積
AND AND
r,adr[,x] r ←(r)AND(実効アドレス)
r1,r2 r1 ←(r1)OR(r2) 論理和
OR OR
r,adr[,x] r ←(r)OR(実効アドレス)
r1,r2 r1 ←(r1)XOR(r2) 排他的論理和
eXclusive OR XOR
r,adr[,x] r ←(r)XOR(実効アドレス)
○*1
(3) 比較演算命令
r1,r2
算術比較
ComPare Arithmetic CPA
r,adr[,x]
r1,r2
論理比較
ComPare Logical CPL
r,adr[,x]
(r1)と(r2),又は(r)と(実効アドレ
ス)の算術比較又は論理比較を行い,比較結
果によって,FR に次の値を設定する。
FR の値
比較結果SF ZF
(r1)>(r2)
(r)>(実効アドレス)
0 0
(r1)=(r2)
(r)=(実効アドレス)
0 1
(r1)<(r2)
(r)<(実効アドレス)
1 0
○*1
(4) シフト演算命令
算術左シフト
Shift Left Arithmetic SLA r,adr[,x]
算術右シフト
Shift Right Arithmetic SRA r,adr[,x]
符号を除き(r)を実効アドレスで指定し
たビット数だけ左又は右にシフトする。
シフトの結果,空いたビット位置には,
左シフトのときは0,右シフトのときは符号
と同じものが入る。
論理左シフト
Shift Left Logical SLL r,adr[,x]
論理右シフト
Shift Right Logical SRL r,adr[,x]
符号を含み(r)を実効アドレスで指定し
たビット数だけ左又は右にシフトする。
シフトの結果,空いたビット位置には0
が入る。
○*2
(5) 分岐命令
正分岐
Jump on PLus JPL adr[,x]
負分岐
Jump on MInus JMI adr[,x]
非零分岐
Jump on Non Zero JNZ adr[,x]
零分岐
Jump on ZEro JZE adr[,x]
オーバフロー分岐
Jump on OVerflow JOV adr[,x]
FR の値によって,実効アドレスに分岐す
る。分岐しないときは,次の命令に進む。
分岐するときのFR の値
命令
OF SF ZF
JPL 0 0
JMI 1
JNZ 0
JZE 1
JOV 1
無条件分岐
unconditional JUMP JUMP adr[,x] 無条件に実効アドレスに分岐する。
−
− 34 −
(6) スタック操作命令
プッシュ
PUSH PUSH adr[,x]
SP ←(SP)−L 1,
(SP)← 実効アドレス
ポップ
POP POP r
r ←((SP)),
SP ←(SP)+L 1
−
(7) コール,リターン命令
コール
CALL subroutine CALL adr[,x]
SP ←(SP)−L 1,
(SP)←(PR),
PR ← 実効アドレス
リターン
RETurn from subroutine RET
PR ←((SP)),
SP ←(SP)+L 1
−
(8) その他
スーパバイザコール
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 の設定○ :設定されることを示す。
○*1 :設定されることを示す。ただし,OF には0 が設定される。
○*2 :設定されることを示す。ただし,OF にはレジスタから最後に送り出
されたビットの値が設定される。
− :実行前の値が保持されることを示す。
(1) JIS X 0201 ラテン文字・片仮名用8 ビット符号で規定する文字の符号表を使用する。
(2) 右に符号表の一部を示す。1 文字は8 ビットからなり,上位4 ビットを列で,下位4 ビットを行で示す。例えば,間隔,4,H,\ のビット構成は,16 進表示で,それぞれ20,34,48,5C である。16 進表示で,ビット構成が21 〜 7E(及び表では省略しているA1 〜 DF)に対応する文字を図形文字という。図形文字は,表示(印刷)装置で,文字として表示(印字)できる。
(3) この表にない文字とそのビット構成が必要な場合は,問題中で与える。
行列02 03 04 05 06 07
0 間隔0 @ P ` p
1 ! 1 A Q a q
2 ” 2 B R b r
3 # 3 C S c s
4 $ 4 D T d t
5 % 5 E U e u
6 & 6 F V f v
7 ' 7 G W g w
8 ( 8 H X h x
9 ) 9 I Y i y
10 * : J Z j z
11 + ; K [ k {
12 , < L \ l |
13 - = M ] m }
14 . > N ^ n ~
15 / ? O _ o
(1) CASLUは,COMETUのためのアセンブラ言語である。
(2) プログラムは,命令行及び注釈行からなる。
(3) 1 命令は1 命令行で記述し,次の行へ継続できない。
(4) 命令行及び注釈行は,次に示す記述の形式で,行の1 文字目から記述する。行の種類記述の形式
オペランドあり[ラベル]{空白}{命令コード}{空白}{オペランド}[{空白}[コメント]]
命令行
オペランドなし[ラベル]{空白}{命令コード}[{空白}[{;}[コメント]]]
注釈行[空白]{;}[コメント]
(注)[ ] [ ]内の指定が省略できることを示す。
{ } { }内の指定が必須であることを示す。
ラベルその命令の(先頭の語の)アドレスを他の命令やプログラムから参照するための名
前である。長さは1 〜 8 文字で,先頭の文字は英大文字でなければならない。以降
の文字は,英大文字又は数字のいずれでもよい。なお,予約語であるGR0 〜 GR7
は,使用できない。
空白1文字以上の間隔文字の列である。
命令コード命令ごとに記述の形式が定義されている。
オペランド命令ごとに記述の形式が定義されている。
コメント覚え書きなどの任意の情報であり,処理系で許す任意の文字を書くことができる。
命令は,4 種類のアセンブラ命令(START,END,DS,DC),4 種類のマクロ命令(IN,OUT,RPUSH,RPOP)及び機械語命令(COMETUの命令)からなる。その仕様を次に示す。
命令の種類ラベル
命令
コード
オペランド機能
ラベルSTART [実行開始番地]
プログラムの先頭を定義
プログラムの実行開始番地を定義
他のプログラムで参照する入口名
を定義
END プログラムの終わりを明示
[ラベル] DS 語数領域を確保
アセンブラ命令
[ラベル] DC 定数[,定数]… 定数を定義
[ラベル] IN 入力領域,入力文字長領域入力装置から文字データを入力
[ラベル] OUT 出力領域,出力文字長領域出力装置へ文字データを出力
[ラベル] RPUSH GR の内容をスタックに格納マクロ命令
[ラベル] RPOP スタックの内容をGR に格納
機械語命令[ラベル] (「1.2 命令」を参照)
アセンブラ命令は,アセンブラの制御などを行う。
(1) START [実行開始番地]
START 命令は,プログラムの先頭を定義する。
実行開始番地は,そのプログラム内で定義されたラベルで指定する。指定がある場合はその番地から,省略した場合はSTART 命令の次の命令から,実行を開始する。また,この命令につけられたラベルは,他のプログラムから入口名として参照できる。
(2) END
END 命令は,プログラムの終わりを定義する。
(3) DS 語数
DS 命令は,指定した語数の領域を確保する。
語数は,10 進定数(≧ 0)で指定する。語数を0 とした場合,領域は確保しないが,
ラベルは有効である。
(4) DC 定数[,定数]…
DC 命令は,定数で指定したデータを(連続する)語に格納する。
定数には,10 進定数,16 進定数,文字定数,アドレス定数の4 種類がある。
定数の種類書き方命令の説明
10 進定数n
n で指定した10 進数値を,1 語の2 進数データとして格納する。ただし,n
が−32768 〜 32767 の範囲にないときは,その下位16 ビットを格納する。
16 進定数#h
h は4 けたの16 進数(16 進数字は0 〜 9,A 〜 F)とする。h で指定した
16 進数値を1 語の2 進数データとして格納する(0000 ≦ h ≦ FFFF)。
文字定数'文字列'
文字列の文字数(> 0)分の連続する領域を確保し,最初の文字は第1 語の
下位8 ビットに,2 番目の文字は第2 語の下位8 ビットに,…と順次文字デ
ータとして格納する。各語の上位8 ビットには0 のビットが入る。
文字列には,間隔及び任意の図形文字を書くことができる。ただし,アポ
ストロフィ(')は2 個続けて書く。
アドレス定数ラベルラベルに対応するアドレスを1 語の2 進数データとして格納する。
マクロ命令は,あらかじめ定義された命令群とオペランドの情報によって,目的の機能を果たす命令群を生成する(語数は不定)。
(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 に
格納する。
機械語命令のオペランドは,次の形式で記述する。
r, r1, r2 GR は,記号GR0 〜 GR7 で指定する。
x 指標レジスタとして用いるGR は,記号GR1 〜 GR7 で指定する。
adr アドレスは,10 進定数,16 進定数,アドレス定数又はリテラルで指定する。
リテラルは,一つの10 進定数,16 進定数又は文字定数の前に等号(=)を付けて
記述する。CASLUは,等号の後の定数をオペランドとするDC 命令を生成し,そ
のアドレスをadr の値とする。
(1) アセンブラによって生成される命令語や領域の相対位置は,アセンブラ言語での記述順序とする。ただし,リテラルから生成されるDC 命令は,END 命令の直前にまとめて配置される。
(2) 生成された命令語,領域は,主記憶上で連続した領域を占める。
プログラムの実行に関して,次の取決めがある。
(1) アセンブラは,未定義ラベル(オペランド欄に記述されたラベルのうち,そのプログラム内で定義されていないラベル)を,他のプログラムの入口名(START 命令のラベル)と解釈する。この場合,アセンブラはアドレスの決定を保留し,その決定をOS に
任せる。OS は,実行に先立って他のプログラムの入口名との連係処理を行いアドレスを決定する(プログラムの連係)。
(2) プログラムは,OS によって起動される。プログラムがロードされる主記憶の領域は不定とするが,プログラム中のラベルに対応するアドレス値は,OS によって実アドレスに補正されるものとする。
(3) プログラムの起動時に,OS はプログラム用に十分な容量のスタック領域を確保し,その最後のアドレスに1 を加算した値をSP に設定する。
(4) OS は,CALL 命令でプログラムに制御を渡す。プログラムを終了しOS に制御を戻すときは,RET 命令を使用する。
(5) IN 命令に対応する入力装置,OUT 命令に対応する出力装置の割当ては,プログラムの実行に先立って利用者が行う。
(6) OS は,入出力装置や媒体による入出力手続の違いを吸収し,システムでの標準の形式及び手続(異常処理を含む)で入出力を行う。したがって,IN,OUT 命令では,入出力装置の違いを意識する必要はない。
プログラムの実行等に関し,この仕様で定義しない事項は,処理系によるものとする。