1 \input texinfo @c -*-texinfo-*-
4 @documentlanguage ja_JP
6 @setfilename casl2_spec
7 @documentencoding UTF-8
8 @settitle 情報処理技術者試験 アセンブラ言語の仕様
9 @firstparagraphindent insert
17 Copyright @copyright{} Information-technology Promotion Agency, Japan. All rights reserved 2012
21 @title 情報処理技術者試験 アセンブラ言語の仕様
22 @subtitle 「試験で使用する情報処理用語・プログラム言語など Ver 2.2(平成24年5月22日) 別紙1」より
25 @chapter システム COMET IIの仕様
31 1語は16ビットで,そのビット構成は,次のとおりである。
33 @image{img/1_1-01,15cm}
36 主記憶の容量は65536語で,そのアドレスは0~65535番地である。
39 数値は,16ビットの2進数で表現する。負数は,2の補数で表現する。
42 制御方式は逐次制御で,命令語は1語長又は2語長である。
45 レジスタとして,@code{GR}(16ビット),@code{SP}(16ビット),@code{PR}(16ビット),@code{FR}(3ビット)の4種類がある。
50 @code{GR}(汎用レジスタ,General Register)は,@code{GR0}~@code{GR7}の8個があり,
51 算術,論理,比較,シフトなどの演算に用いる。
52 このうち,@code{GR1}~@code{GR7}のレジスタは,指標レジスタ(index register)
56 @code{SP}(スタックポインタ,Stack Pointer)は,
60 @code{PR}(プログラムレジスタ,Program Register)は,
61 次に実行すべき命令語の先頭アドレスを保持している。
64 @code{FR}(フラグレジスタ,Flag Register)は,
65 @code{OF}(Overflow Flag),@code{SF}(Sign Flag),@code{ZF}(Zero Flag)と呼ぶ
66 3個のビットからなり,演算命令などの実行によって次の値が設定される。
67 これらの値は,条件付き分岐命令で参照される。
71 算術演算命令の場合は,演算結果が-32768~32767に収まらなくなったとき1になり,
73 論理演算命令の場合は,演算結果が0~65535に収まらなくなったとき1になり,
77 演算結果の符号が負(ビット番号15が1)のとき1,それ以外のとき0になる。
80 演算結果が零(全部のビットが0)のとき1,それ以外のとき0になる。
85 論理加算又は論理減算は,被演算データを符号のない数値とみなして,
92 ここで,一つの命令コードに対し2種類のオペランドがある場合,
93 上段はレジスタ間の命令,下段はレジスタと主記憶間の命令を表す。
95 @image{img/1_2-00,15cm}
97 @subsection ロード,ストア,ロードアドレス命令
99 @image{img/1_2-01,15cm}
101 @subsection 算術,論理演算命令
103 @image{img/1_2-02,15cm}
107 @image{img/1_2-03,15cm}
111 @image{img/1_2-04,15cm}
115 @image{img/1_2-05,15cm}
119 @image{img/1_2-06,15cm}
121 @subsection コール,リターン命令
123 @image{img/1_2-07,15cm}
127 @image{img/1_2-08,15cm}
132 @item @code{r}, @code{r1}, @code{r2}
133 いずれも @code{GR}を示す。指定できる@code{GR}は@code{GR0}~@code{GR7}
136 アドレスを示す。指定できる値の範囲は@code{0}~@code{65535}
139 指標レジスタとして用いる@code{GR}を示す。指定できる@code{GR}は@code{GR1}~@code{GR7}
142 @code{[ ]}内の指定は省略できることを示す。
145 @code{( )}内のレジスタ又はアドレスに格納されている内容を示す。
148 @code{adr}と@code{x}の内容との論理加算値又はその値が示す番地
151 演算結果を,左辺のレジスタ又はアドレスに格納することを示す。
153 @item @code{+L}, @code{-L}
158 @item @code{○ }: 設定されることを示す。
159 @item @code{○*1}: 設定されることを示す。ただし、@code{OF}には0が設定される。
160 @item @code{○*2}: 設定されることを示す。ただし、@code{OF}にはレジスタから最後に送り出されたビットの値が設定される。
161 @item @code{— }: 実行前の値が保持されることを示す。
168 JIS X 0201 ラテン文字・片仮名用8ビット符号で規定する文字の符号表を使用する。
173 @image{img/1_3-01,5cm}
175 1文字は8ビットからなり,上位4ビットを列で,下位4ビットを行で示す。 例えば,@code{間隔},@code{4},@code{H},@code{@backslashchar{}}のビット構成は,16進表示で,それぞれ20,34,48,5Cである。ビット構成が21~7E(及び表では省略しているA1~DF)に対応する文字を図形文字という。 図形文字は,表示(印刷)装置で,文字として表示(印字)できる。
178 この表にない文字とそのビット構成が必要な場合は,問題中で与える。
181 @chapter アセンブラ言語CASL IIの仕様
187 CASL IIは,COMET IIのためのアセンブラ言語である。
190 プログラムは,命令行および注釈行からなる。
193 1命令は1命令行で記述し,次の行へ継続できない。
196 命令行および注釈行は,次に示す記述の形式で,行の1文字目から記述する。 @*
198 @image{img/2_1-01,15cm}
211 その命令の(先頭の語の)アドレスを他の命令やプログラムから参照するための名前である。 長さは1~8文字で,先頭の文字は英大文字でなければならない。 以降の文字は,英大文字又は数字のいずれでもよい。 なお,予約語であるGR0~GR7は,使用できない。
223 覚え書きなどの任意の情報であり,処理系で許す任意の文字を書くことができる。
228 命令は,4種類のアセンブラ命令(@code{START},@code{END},@code{DS},@code{DC}), 4種類のマクロ命令(@code{IN},@code{OUT})および機械語命令(COMET IIの命令)からなる。 その仕様を次に示す。
230 @image{img/2_2-01,15cm}
234 アセンブラ命令は,アセンブラの制御などを行う。
238 @item @* @image{img/2_3-01,5cm} @*
240 @code{START}命令は,プログラムの先頭を定義する。
242 実行開始番地は,そのプログラム内で定義されたラベルで指定する。指定がある場合はその番地から,省略した場合は@code{START}命令の次の命令から,実行を開始する。
244 また,この命令につけられたラベルは,他のプログラムから入口名として参照できる。
246 @item @* @image{img/2_3-02,5cm} @*
248 @code{END}命令は,プログラムの終わりを定義する。
250 @item @* @image{img/2_3-03,5cm} @*
252 @code{DS}命令は,指定した語数の領域を確保する。
254 語数は,10進定数(@geq{} 0)で指定する。語数を0とした場合,領域は確保しないが,ラベルは有効である。
256 @item @* @image{img/2_3-04,5cm} @*
258 @code{DC}命令は,定数で指定したデータを(連続する)語に格納する。
259 定数には,10進定数,16進定数,文字定数,アドレス定数の4種類がある。 @*
261 @image{img/2_3-05,15cm}
266 マクロ命令は,あらかじめ定義された命令群とオペランドの情報によって, 目的の機能を果たす命令群を生成する(語数は不定)。
270 @item @* @image{img/2_4-01,5cm} @*
272 @code{IN}命令は,あらかじめ割り当てた入力装置から,1レコードの文字データを読み込む。
274 入力領域は,256語長の作業域のラベルであり,この領域の先頭から,1文字を1語に対応させて順次入力される。レコードの区切り符号(キーボ-ド入力の復帰符号など)は,格納しない。格納の形式は,DC命令の文字定数と同じである。入力データが256文字に満たない場合, 入力領域の残りの部分は実行前のデータを保持する。入力データが256文字を超える場合, 以降の文字は無視される。
276 入力文字長領域は,1語長の領域のラベルであり,入力された文字の長さ(@geq{} 0)が2進数で格納される。ファイルの終わり(end of file)を検出した場合は,-1が格納される。
278 @code{IN}命令を実行すると,@code{GR}の内容は保存されるが,@code{FR}の内容は不定となる。
280 @item @* @image{img/2_4-02,5cm} @*
282 @code{OUT}命令は,あらかじめ割り当てた出力装置に,文字データを,1レコードとして書き出す。
284 出力領域は,出力しようとするデータが1文字1語で格納されている領域のラベルである。 格納の形式は,@code{DC}命令の文字定数と同じであるが, 上位8ビットは,OSが無視するので0でなくてもよい。
286 出力文字長領域は,1語長の領域のラベルであり, 出力しようとする文字の長さ(@geq{} 0)を2進数で格納しておく。
288 @code{OUT}命令を実行すると,@code{GR}の内容は保存されるが,@code{FR}の内容は不定となる。
290 @item @* @image{img/2_4-03,5cm} @*
292 @code{RPUSH}命令は,@code{GR}の内容を,@code{GR1},@code{GR2},…,@code{GR7}の順でスタックに格納する。
294 @item @* @image{img/2_4-04,5cm} @*
296 @code{RPOP}命令は,スタックの内容を順次取り出し,@code{GR7},@code{GR6},…,@code{GR1}の順で@code{GR}に格納する。`
301 機械語命令のオペランドは,次の形式で記述する。
306 @code{GR}は,記号@code{GR0}~@code{GR7}で指定する。
309 指標レジスタとして用いる@code{GR}は,記号@code{GR1}~@code{GR7}で指定する。
312 アドレスは,10進定数,16進定数,アドレス定数又はリテラルで指定する。
313 リテラルは,ひとつの10進定数,16進定数又は文字定数の前に等号(=)を付けて 記述する。CASL IIは,等号の後の定数をオペランドとする@code{DC}命令を生成し, そのアドレスをadrの値とする。
320 アセンブラによって生成される命令語や領域の相対位置は,アセンブラ言語での記述順序とする。ただし,リテラルから生成される@code{DC}命令は,@code{END}命令の直前にまとめて配置される。
323 生成された命令語,領域は,主記憶上で連続した領域を占める。
329 プログラムの実行に関して,次の取決めがある。
333 アセンブラは,未定義ラベル(オペランド欄に記述されたラベルのうち,そのプログラム内で定義されていないラベル)を,他のプログラムの入口名(@code{START}命令のラベル)と解釈する。この場合,アセンブラはアドレスの決定を保留し,その決定をOSに任せる。OSは,実行に先立って他のプログラムの入口名との連係処理を行いアドレスを決定する(プログラムの連係)。
336 プログラムは,OS によって起動される。プログラムがロードされる主記憶の領域は不定とするが,プログラム中のラベルに対応するアドレス値は,OSによって実アドレスに補正されるものとする。
339 プログラムの起動時に,OS はプログラム用に十分な容量のスタック領域を確保し,その最後のアドレスに1を加算した値を@code{SP}に設定する。
342 OSは,@code{CALL}命令でプログラムに制御を渡す。プログラムを終了し OSに制御を戻すときは,@code{RET}命令を使用する。
345 @code{IN}命令に対応する入力装置,@code{OUT}命令に対応する出力装置の割当ては,プログラムの実行に先立って利用者が行う。
348 OSは,入出力装置や媒体による入出力手続の違いを吸収し,システムでの標準の形式及び手続(異常処理を含む)で入出力を行う。したがって,@code{IN},@code{OUT}命令では,入出力装置の違いを意識する必要はない。
353 プログラムの実行等に関し,この仕様で定義しない事項は,処理系によるものとする。
356 参考資料は,COMET IIの理解を助けるため又は COMET IIの処理系作成者に対する便宜のための資料である。したがって,COMET II,CASL IIの仕様に影響を与えるものではない。
360 命令語の構成は定義しないが,次のような構成を想定する。ここで,@code{OP}の数値は16進表示で示す。
362 @image{img/r_1-01,15cm}
366 マクロ命令が生成する命令群は定義しない(語数不定)が,次の例のような命令群を生成することを想定する。
385 @section シフト演算命令におけるビットの動き
387 シフト演算命令において,例えば,1ビットのシフトをしたときの動き及び@code{OF}の変化は,次のとおりである。
391 @item 算術左シフトでは,ビット番号14の値が設定される。 @*
393 @image{img/r_1-02,15cm}
395 @item 算術右シフトでは,ビット番号0の値が設定される。 @*
397 @image{img/r_1-03,15cm}
399 @item 論理左シフトでは,ビット番号15の値が設定される。 @*
401 @image{img/r_1-04,15cm}
403 @item 論理右シフトでは,ビット番号0の値が設定される。 @*
405 @image{img/r_1-05,15cm}
413 ; 処理 ; GR1 中の'1'のビットの個数を求める
414 ; 出力 ; GR0:GR1 中の'1'のビットの個数
416 PUSH 0,GR2 ; Count = 0
417 SUBA GR2,GR2 ; 全部のビットが'0'?
418 AND GR1,GR1 ; 全部のビットが'0'なら終了
419 JZE RETURN ; Count = Count + 1
420 MORE LAD GR2,1,GR2 ; 最下位の'1'のビット 1 個を
421 LAD GR0,-1,GR1 ; '0'に変える
422 AND GR1,GR0 ; '1'のビットが残っていれば繰返し
423 JNZ MORE ; GR0 = Count