1 input texinfo @c -*-texinfo-*-
4 @documentlanguage ja_JP
6 @setfilename casl2_spec
7 @documentencoding UTF-8
9 @firstparagraphindent insert
17 Copyright @copyright{} Information-technology Promotion Agency, Japan. All rights reserved 2012
22 @subtitle 「試験で使用する情報処理用語・プログラム言語など Ver 2.2(平成24年5月22日) 別紙1」より
25 @chapter システム COMET IIの仕様
31 1語は16ビットで、そのビット構成は、次のとおりである。
35 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |(ビット番号)
41 主記憶の容量は65536語で、そのアドレスは0~65535番地である。
44 数値は、16ビットの2進数で表現する。負数は、2の補数で表現する。
47 制御方式は逐次制御で、命令語は1語長又は2語長である。
50 レジスタとして、@code{GR}(16ビット)、@code{SP}(16ビット)、@code{PR}(16ビット)、@code{FR}(3ビット)の 4 種類がある。
52 @code{GR}(汎用レジスタ、General Register)は、@code{GR0}~@code{GR7}の8個があり、
53 算術、論理、比較、シフトなどの演算に用いる。
54 このうち、@code{GR1}~@code{GR7}のレジスタは、指標レジスタ(index register)
57 @code{SP}(スタックポインタ、Stack Pointer)は、
60 @code{PR}(プログラムレジスタ、Program Register)は、
61 次に実行すべき命令語の先頭アドレスを保持している。
63 @code{FR}(フラグレジスタ、Flag Register)は、
64 @code{OF}(Overflow Flag)、@code{SF}(Sign Flag)、@code{ZF}(Zero Flag)と呼ぶ
65 3個のビットからなり、演算命令などの実行によって次の値が設定される。
66 これらの値は、条件付き分岐命令で参照される。
70 算術演算命令の場合は、演算結果が-32768~32767に収まらなくなったとき1になり、
72 論理演算命令の場合は、演算結果が0~65535に収まらなくなったとき1になり、
76 演算結果の符号が負(ビット番号15が1)のとき1、それ以外のとき0になる。
79 演算結果が零(全部のビットが0)のとき1、それ以外のとき0になる。
83 論理加算又は論理減算は、被演算データを符号のない数値とみなして、
90 ここで、一つの命令コードに対し2種類のオペランドがある場合、
91 上段はレジスタ間の命令、下段はレジスタと主記憶間の命令を表す。
94 @item ロード、ストア、ロードアドレス命令
95 @multitable @columnfractions .25 .10 .15 .30 .20
96 @headitem 命令 @tab 書き方 @* 命令コード @tab 書き方 @* オペランド @tab 命令の説明 @tab FRの設定
97 @item ロード @* LoaD @tab @code{LD} @tab @code{r1,r2} @* ----- @* @code{r,adr[,x]} @tab @code{r1 ← (r2)} @* ----- @* @code{r ← (実効アドレス)} @tab ○ @* ただし、@code{OF}には@code{0}が設定される。
98 @item ストア @* STore @tab @code{ST} @tab @code{r,adr[,x]} @tab @code{実効アドレス ← (r)} @tab --
99 @item ロードアドレス @* Load ADdress @tab @code{LAD} @tab @code{r,adr[,x]} @tab @code{r ← 実効アドレス} @tab --
103 @multitable @columnfractions .25 .10 .15 .30 .20
104 @headitem 命令 @tab 書き方 @* 命令コード @tab 書き方 @* オペランド @tab 命令の説明 @tab FRの設定
105 @item 算術加算 @* ADD Arithmetic @tab @code{ADDA} @tab @code{r1,r2} @* ----- @* @code{r,adr[,x]} @tab @code{r1 ← (r1) + (r2)} @* ----- @* @code{r ← (r) + (実効アドレス)} @tab ○
106 @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 ○
107 @item 算術減算 @* SUBtract Arithmetic @tab @code{SUBA} @tab @code{r1,r2} @* ----- @* @code{r,adr[,x]} @tab @code{r1 ← (r1) - (r2)} @* ----- @* @code{r ← (r) - (実効アドレス)} @tab ○
108 @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 ○
109 @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}が設定される。
110 @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}が設定される。
111 @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}が設定される。
115 @multitable @columnfractions .25 .10 .15 .30 .20
116 @headitem 命令 @tab 書き方 @* 命令コード @tab 書き方 @* オペランド @tab 命令の説明 @tab FRの設定
117 @item 算術比較 @* ComPare Arithmetic @tab @code{CPA}@tab @code{r1,r2} @* ----- @* @code{r,adr[,x]} @tab @code{(r1)}と@code{(r2)}、又は@code{(r)}と@code{(実効アドレス)}の算術比較を行い、比較結果によって、@code{FR}に次の値を設定する。
121 @item @code{(r1) > (r2)} 又は @code{(r) > (実効アドレス)}
123 @item @code{(r1) = (r2)} 又は @code{(r) = (実効アドレス)}
125 @item @code{(r1) < (r2)} 又は @code{(r) < (実効アドレス)}
128 @tab ○ @* ただし、@code{OF}には@code{0}が設定される。
129 @item 論理比較 @* ComPare Logical @tab @code{CPL} @tab @code{r1,r2} @* ----- @* @code{r,adr[,x]} @tab @code{(r1)}と@code{(r2)}、又は@code{(r)}と@code{(実効アドレス)}の論理比較を行い、比較結果によって、@code{FR}に次の値を設定する。
133 @item @code{(r1) > (r2)} 又は @code{(r) > (実効アドレス)}
134 @code{SF:0}, @code{ZF:0}
135 @item @code{(r1) = (r2)} 又は @code{(r) = (実効アドレス)}
136 @code{SF:0}, @code{ZF:1}
137 @item @code{(r1) < (r2)} 又は @code{(r) < (実効アドレス)}
138 @code{SF:1}, @code{ZF:0}
140 @tab ○ @* ただし、@code{OF}には@code{0}が設定される。
144 @multitable @columnfractions .25 .10 .15 .30 .20
145 @headitem 命令 @tab 書き方 @* 命令コード @tab 書き方 @* オペランド @tab 命令の説明 @tab FRの設定
146 @item 算術左シフト @* Shift Left Arithmetic @tab @code{SLA} @tab @code{r,adr[,x]} @tab 符号を除き@code{(r)}を実効アドレスで指定したビット数だけ左にシフトする。シフトの結果、空いたビット位置には、@code{0}が入る。 @tab ○ @* ただし、@code{OF}にはレジスタから最後に送り出されたビットの値が設定される。
147 @item 算術右シフト @* Shift Right Arithmetic @tab @code{SRA} @tab @code{r,adr[,x]} @tab 符号を除き@code{(r)}を実効アドレスで指定したビット数だけ右にシフトする。シフトの結果、空いたビット位置には、符号と同じものが入る。 @tab ○ @* ただし、@code{OF}にはレジスタから最後に送り出されたビットの値が設定される。
148 @item 論理左シフト @* Shift Left Logical @tab @code{SLL} @tab @code{r,adr[,x]} @tab 符号を含み@code{(r)}を実効アドレスで指定したビット数だけ左にシフトする。シフトの結果,空いたビット位置には@code{0}が入る。 @tab ○ @* ただし、@code{OF}にはレジスタから最後に送り出されたビットの値が設定される。
149 @item 論理右シフト @* Shift Right Logical @tab @code{SRL} @tab @code{r,adr[,x]} @tab 符号を含み@code{(r)}を実効アドレスで指定したビット数だけ右にシフトする。シフトの結果、空いたビット位置には@code{0}が入る。 @tab ○ @* ただし、@code{OF}にはレジスタから最後に送り出されたビットの値が設定される。
153 @multitable @columnfractions .25 .10 .15 .30 .20
154 @headitem 命令 @tab 書き方 @* 命令コード @tab 書き方 @* オペランド @tab 命令の説明 @tab FRの設定
155 @item 正分岐 @* Jump on Plus @tab @code{JPL} @tab @code{adr[,x]} @tab @code{FR}の値によって、実効アドレスに分岐する。分岐しないときは、次の命令に進む。
157 @item 分岐するときの@code{FR}の値
161 @item 負分岐 @* Jump on MINUS @tab @code{JMI} @tab @code{adr[,x]} @tab @code{FR}の値によって、実効アドレスに分岐する。分岐しないときは、次の命令に進む。
163 @item 分岐するときの@code{FR}の値
167 @item 非零分岐 @* Jump on Non Zero @tab @code{JNZ} @tab @code{adr[,x]} @tab @code{FR}の値によって、実効アドレスに分岐する。分岐しないときは、次の命令に進む。
169 @item 分岐するときの@code{FR}の値
173 @item 零分岐 @* Jump on ZEro @tab @code{JZE} @tab @code{adr[,x]} @tab @code{FR}の値によって、実効アドレスに分岐する。分岐しないときは、次の命令に進む。
175 @item 分岐するときの@code{FR}の値
179 @item オーバーフロー分岐 @* Jump on OVerflow @tab @code{JOV} @tab @code{adr[,x]} @tab @code{FR}の値によって、実効アドレスに分岐する。分岐しないときは、次の命令に進む。
181 @item 分岐するときの@code{FR}の値
185 @item 無条件分岐 @* unconditional Jump @tab @code{JUMP} @tab @code{adr[,x]} @tab 無条件に実効アドレスに分岐する。 @tab --
189 @multitable @columnfractions .25 .10 .15 .30 .20
190 @headitem 命令 @tab 書き方 @* 命令コード @tab 書き方 @* オペランド @tab 命令の説明 @tab FRの設定
191 @item プッシュ @* PUSH @tab @code{PUSH} @tab @code{adr[,x]} @tab @code{SP ← (SP)-L1}, @* @code{(SP)← (実効アドレス)} @tab --
192 @item ポップ @* POP @tab @code{POP} @tab @code{r} @tab @code{r ← ( (SP) )}, @* @code{SP ← (SP) +L 1} @tab --
196 @multitable @columnfractions .25 .10 .15 .30 .20
197 @headitem 命令 @tab 書き方 @* 命令コード @tab 書き方 @* オペランド @tab 命令の説明 @tab FRの設定
198 @item コール @* CALL subroutine @tab @code{CALL} @tab @code{adr[,x]} @tab @code{SP ← (SP)-L 1}, @* @code{(SP) ← (PR)}, @* @code{PR ← 実効アドレス} @tab --
199 @item リターン @* RETrun form subroutine @tab @code{RET} @tab @tab @code{PR ← ( (SP) )}, @* @code{SP ← (SP) +L 1} @tab --
203 @multitable @columnfractions .25 .10 .15 .30 .20
204 @headitem 命令 @tab 書き方 @* 命令コード @tab 書き方 @* オペランド @tab 命令の説明 @tab FRの設定
205 @item スーパーバイザコール @* SuperVisor CALL @tab @code{SVC} @tab @code{adr[,x]} @tab 実効アドレスを引数として割出しを行う。実行後の@code{GR}と@code{FR}は不定となる。 @tab --
206 @item ノーオペレーション @* No operation @tab @code{NOP} @tab @tab 何もしない。 @tab --
214 @item @code{r}, @code{r1}, @code{r2}
215 いずれも @code{GR}を示す。指定できる@code{GR}は@code{GR0}~@code{GR7}
218 アドレスを示す。指定できる値の範囲は@code{0}~@code{65535}
221 指標レジスタとして用いる@code{GR}を示す。指定できる@code{GR}は@code{GR1}~@code{GR7}
227 ( )内のレジスタ又はアドレスに格納されている内容を示す。
230 @code{adr}と@code{x}の内容との論理加算値又はその値が示す番地
233 演算結果を、左辺のレジスタ又はアドレスに格納することを示す。
235 @item @code{+L}, @code{-L}
241 @item ー: 実行前の値が保持されることを示す。
249 JIS X 0201 ラテン文字・片仮名用8ビット符号で規定する文字の符号表を使用する。
252 次に符号表の一部を示す。1文字は8ビットからなり、上位4ビットを列で、下位4ビットを行で示す。 たとえば、間隔、4、H、\のビット構成は、16進表示で、ビット構成が 21~7E(及び表では省略しているA1~DF)に対応する文字を図形文字という。 図形文字は、表示(印刷)装置で、文字として表示(印字)できる。
254 @multitable @columnfractions .22 .13 .13 .13 .13 .13 .13
255 @headitem 行\列 @tab 02 @tab 03 @tab 04 @tab 05 @tab 06 @tab 07
256 @item 0 @tab 間隔 @tab 0 @tab @@ @tab P @tab ` @tab p
257 @item 1 @tab ! @tab 1 @tab A @tab Q @tab a @tab q
258 @item 2 @tab " @tab 2 @tab B @tab R @tab b @tab r
259 @item 3 @tab # @tab 3 @tab C @tab S @tab c @tab s
260 @item 4 @tab $ @tab 4 @tab D @tab T @tab d @tab t
261 @item 5 @tab % @tab 5 @tab E @tab U @tab e @tab u
262 @item 6 @tab & @tab 6 @tab F @tab V @tab f @tab v
263 @item 7 @tab ' @tab 7 @tab G @tab W @tab g @tab w
264 @item 8 @tab ( @tab 8 @tab H @tab X @tab h @tab x
265 @item 9 @tab ) @tab 9 @tab I @tab Y @tab i @tab y
266 @item 10 @tab * @tab : @tab J @tab Z @tab j @tab z
267 @item 11 @tab + @tab ; @tab K @tab [ @tab k @tab @{
268 @item 12 @tab 、 @tab < @tab L @tab \ @tab l @tab |
269 @item 13 @tab - @tab = @tab M @tab ] @tab m @tab @}
270 @item 14 @tab 。 @tab > @tab N @tab ^ @tab n @tab ~
271 @item 15 @tab / @tab ? @tab O @tab _ @tab o @tab
275 この表にない文字とそのビット構成が必要な場合は、問題中で与える。
278 @chapter アセンブラ言語CASL IIの仕様
284 CASL IIは、COMET IIのためのアセンブラ言語である。
287 プログラムは、命令行および注釈行からなる。
290 1命令は1命令行で記述し、次の行へ継続できない。
293 命令行および注釈行は、次に示す記述の形式で、行の1文字目から記述する。
294 @multitable @columnfractions .15 .15 .70
295 @headitem 行の種類 @tab @tab 記述の形式
296 @item 命令行 @tab オペランドあり @tab [ラベル]{空白}{命令コード}{空白}{オペランド}[{空白}[{;}[コメント]]
297 @item @tab オペランドなし @tab [ラベル]{空白}{命令コード}[{空白}[{;}[コメント]]
298 @item 注釈行 @tab @tab [空白]{;}[コメント]
311 その命令の(先頭の語の)アドレスを他の命令やプログラムから参照するための名前である。 長さは1~8文字で、先頭の文字は英大文字でなければならない。 以降の文字は、英大文字又は数字のいずれでもよい。 なお、予約語であるGR0~GR7は、使用できない。
323 覚え書きなどの任意の情報であり、処理系で許す任意の文字を書くことができる。
331 命令は、4種類のアセンブラ命令(START,END,DS,DC)、 4種類のマクロ命令(IN,OUT)および機械語命令(COMETⅡの命令)からなる。 その仕様を次に示す。
332 命令の種類 ラベル 命令コード オペランド 機能
333 アセンブラ命令 ラベル START [実行開始番地] プログラムの先頭を定義
340 [ラベル] DC 定数[,定数]・・・ 定数を定義
341 マクロ命令 [ラベル] IN 入力領域,入力文字長領域 入力装置から文字データを入力
342 [ラベル] OUT 出力領域,出力文字長領域 出力装置へ文字データを出力
347 機械語命令 [ラベル] (「1.2 命令」を参照)
350 アセンブラ命令は、アセンブラの制御などを行う。
353 START命令は、プログラムの先頭を定義する。
354 実行開始番地は、そのプログラム内で定義されたラベルでしていする。 指定がある場合はその番地から、省略した場合はSTART命令の次の命令から、実行を開始する。
355 また、この命令につけられたラベルは、他のプログラムから入口名として参照できる。
358 END命令は、プログラムの終わりを定義する。
361 DS命令は、指定した語数の領域を確保する。
362 語数は、10進定数(≧0)で指定する。語数を0とした場合、領域は確保しないが、ラベルは有効である。
365 DC命令は、定数で指定したデータを(連続する)語に格納する。
366 定数には、10進定数、16進定数、文字定数、アドレス定数の4種類がある。
368 10進定数 n nで指定した10進数値を、1語の2進数データとして格納する。 ただし、nが-32768~32767の範囲にないときは、その下位16ビットを格納する。
369 16進定数 #h hは4桁の16進数(16進数字は0~9,A~F)とする。 hで指定した16進数値を1語の2進数データとして格納する(0000≦h≦FFFF)。
370 文字定数 ’文字列’ 文字列の文字数(>0)分の連続する領域を確保し、最初の文字は第1語の下位8ビットに、 2番目の文字は第2語の下位8ビットに、・・・と順次文字データとして格納する。 各語の上位8ビットには0のビットが入る。
371 文字列には、間隔および任意の図形文字を書くことができる。 ただし、アポストロフィ(’)は2個続けて書く。
372 アドレス定数 ラベル ラベルに対応するアドレスを1語の2進数データとして格納する。
375 マクロ命令は、あらかじめ定義された命令群とオペランドの情報によって、 目的の機能を果たす命令群を生成する(語数は不定)。
378 IN命令は、あらかじめ割り当てた入力装置から、1レコードの文字データを読み込む。
379 入力領域は、256語長の作業域のラベルであり、この領域の先頭から、 1文字を1語に対応させて順次入力される。レコードの区切り符号(キーボ-ド入力の復帰符号など)は、 格納しない。格納の形式は、DC命令の文字定数と同じである。入力データが256文字に満たない場合、 入力領域の残りの部分は実行前のデータを保持する。入力データが256文字を超える場合、 以降の文字は無視される。
380 入力文字長領域は、1語長の領域のラベルであり、入力された文字の長さ(≧0)が2進数で格納される。 ファイルの終わり(end of file)を検出した場合は、-1が格納される。
381 IN命令を実行すると、GRの内容は保存されるが、FRの内容は不定となる。
384 OUT命令は、あらかじめ割り当てた出力装置に、文字データを、1レコードとして書き出す。
385 出力領域は、出力しようとするデータが1文字1語で格納されている領域のラベルである。 格納の形式は、DC命令の文字定数と同じであるが、 上位8ビットは、OSが無視するので0でなくてもよい。
386 出力文字長領域は、1語長の領域のラベルであり、 出力しようとする文字の長さ(≧0)を2進数で格納しておく。
387 OUT命令を実行すると、GRの内容は保存されるが、FRの内容は不定となる。
390 RPUSH命令は、GRの内容を、GR1、GR2、・・・、GR7の順でスタックに格納する。
393 RPOP命令は、スタックの内容を順次取り出し、GR7、GR6、・・・、GR1の順でGRに格納する。
396 機械語命令のオペランドは、次の形式で記述する。
397 r,r1,r2 GRは、記号GR0~GR7で指定する。
398 x 指標レジスタとして用いるGRは、記号GR1~GR7で指定する。
399 adr アドレスは、10進定数、16進定数、アドレス定数又はリテラルで指定する。
400 リテラルは、ひとつの10進定数、16進定数又は文字定数の前に等号(=)を付けて 記述する。CASL IIは、等号の後の定数をオペランドとするDC命令を生成し、 そのアドレスをadrの値とする。
403 アセンブラによって生成される命令語や領域の相対位置は、アセンブラ言語での記述順序とする。 ただし、リテラルから生成されるDC命令は、END命令の直前にまとめて配置される。
404 生成された命令語、領域は、主記憶上で連続した領域を占める。