a28ed7a9738603d94c24869dc53d53207cda6e54
[YACASL2.git] / doc / casl2_spec / casl2_spec.texi
1 \input texinfo   @c -*-texinfo-*-
2 @c %**start of header
3 @ifnottex
4 @documentlanguage ja_JP
5 @end ifnottex
6 @setfilename casl2_spec
7 @documentencoding UTF-8
8 @settitle 情報処理技術者試験 アセンブラ言語の仕様
9 @firstparagraphindent insert
10 @paragraphindent 1
11 @ifhtml
12 @exampleindent 0
13 @end ifhtml
14 @c %**end of header
15
16 @copying
17 Copyright @copyright{} Information-technology Promotion Agency, Japan. All rights reserved 2012
18 @end copying
19
20 @titlepage
21 @title 情報処理技術者試験 アセンブラ言語の仕様
22 @subtitle 「試験で使用する情報処理用語・プログラム言語など Ver 2.2(平成24年5月22日) 別紙1」より
23 @end titlepage
24
25 @chapter システム COMET IIの仕様
26
27 @section ハードウェアの仕様
28
29 @enumerate
30 @item
31 1語は16ビットで,そのビット構成は,次のとおりである。
32
33 @image{img/1_1-01,15cm,,,.svg}
34
35 @item
36 主記憶の容量は65536語で,そのアドレスは0~65535番地である。
37
38 @item
39 数値は,16ビットの2進数で表現する。負数は,2の補数で表現する。
40
41 @item
42 制御方式は逐次制御で,命令語は1語長又は2語長である。
43
44 @item
45 レジスタとして,@code{GR}(16ビット),@code{SP}(16ビット),@code{PR}(16ビット),@code{FR}(3ビット)の4種類がある。
46
47 @itemize @w{ }
48
49 @item
50 @code{GR}(汎用レジスタ,General Register)は,@code{GR0}~@code{GR7}の8個があり,
51 算術,論理,比較,シフトなどの演算に用いる。
52 このうち,@code{GR1}~@code{GR7}のレジスタは,指標レジスタ(index register)
53 としてアドレスの修飾にも用いる。
54
55 @item
56 @code{SP}(スタックポインタ,Stack Pointer)は,
57 スタックの最上段のアドレスを保持している。
58
59 @item
60 @code{PR}(プログラムレジスタ,Program Register)は,
61 次に実行すべき命令語の先頭アドレスを保持している。
62
63 @item
64 @code{FR}(フラグレジスタ,Flag Register)は,
65 @code{OF}(Overflow Flag),@code{SF}(Sign Flag),@code{ZF}(Zero Flag)と呼ぶ
66 3個のビットからなり,演算命令などの実行によって次の値が設定される。
67 これらの値は,条件付き分岐命令で参照される。
68
69 @table @code
70 @item OF
71 算術演算命令の場合は,演算結果が-32768~32767に収まらなくなったとき1になり,
72 それ以外のとき0になる。
73 論理演算命令の場合は,演算結果が0~65535に収まらなくなったとき1になり,
74 それ以外のとき0になる。
75
76 @item SF
77 演算結果の符号が負(ビット番号15が1)のとき1,それ以外のとき0になる。
78
79 @item ZF
80 演算結果が零(全部のビットが0)のとき1,それ以外のとき0になる。
81 @end table
82 @end itemize
83
84 @item
85 論理加算又は論理減算は,被演算データを符号のない数値とみなして,
86 加算又は減算する。
87 @end enumerate
88
89 @section 命令
90
91 命令の形式及びその機能を示す。
92 ここで,一つの命令コードに対し2種類のオペランドがある場合,
93 上段はレジスタ間の命令,下段はレジスタと主記憶間の命令を表す。
94
95 @image{img/1_2-00,15cm,,,.svg}
96
97 @subsection ロード,ストア,ロードアドレス命令
98
99 @image{img/1_2-01,15cm,,,.svg}
100
101 @subsection 算術,論理演算命令
102
103 @image{img/1_2-02,15cm,,,.svg}
104
105 @subsection 比較演算命令
106
107 @image{img/1_2-03,15cm,,,.svg}
108
109 @subsection シフト演算命令
110
111 @image{img/1_2-04,15cm,,,.svg}
112
113 @subsection 分岐命令
114
115 @image{img/1_2-05,15cm,,,.svg}
116
117 @subsection スタック操作命令
118
119 @image{img/1_2-06,15cm,,,.svg}
120
121 @subsection コール,リターン命令
122
123 @image{img/1_2-07,15cm,,,.svg}
124
125 @subsection その他
126
127 @image{img/1_2-08,15cm,,,.svg}
128
129 @unnumberedsubsec 注
130
131 @table @dfn
132 @item @code{r}, @code{r1}, @code{r2}
133 いずれも @code{GR}を示す。指定できる@code{GR}は@code{GR0}~@code{GR7}
134
135 @item @code{adr}
136 アドレスを示す。指定できる値の範囲は@code{0}~@code{65535}
137
138 @item @code{x}
139 指標レジスタとして用いる@code{GR}を示す。指定できる@code{GR}は@code{GR1}~@code{GR7}
140
141 @item @code{[ ]}
142 @code{[ ]}内の指定は省略できることを示す。
143
144 @item @code{( )}
145 @code{( )}内のレジスタ又はアドレスに格納されている内容を示す。
146
147 @item @code{実効アドレス}
148 @code{adr}と@code{x}の内容との論理加算値又はその値が示す番地
149
150 @item @code{←}
151 演算結果を,左辺のレジスタ又はアドレスに格納することを示す。 
152
153 @item @code{+L}, @code{-L}
154 論理加算,論理減算を示す。
155
156 @item @code{FR}の設定
157 @itemize @w{}
158 @item @code{○  }: 設定されることを示す。
159 @item @code{○*1}: 設定されることを示す。ただし、@code{OF}には0が設定される。
160 @item @code{○*2}: 設定されることを示す。ただし、@code{OF}にはレジスタから最後に送り出されたビットの値が設定される。
161 @item @code{—  }: 実行前の値が保持されることを示す。
162 @end itemize
163 @end table
164
165 @section 文字の符号表
166 @enumerate
167 @item
168 JIS X 0201 ラテン文字・片仮名用8ビット符号で規定する文字の符号表を使用する。
169
170 @item
171 次に符号表の一部を示す。 @*
172
173 @image{img/1_3-01,5cm,,,.svg}
174
175 1文字は8ビットからなり,上位4ビットを列で,下位4ビットを行で示す。 例えば,@code{間隔},@code{4},@code{H},@code{@backslashchar{}}のビット構成は,16進表示で,それぞれ20,34,48,5Cである。ビット構成が21~7E(及び表では省略しているA1~DF)に対応する文字を図形文字という。 図形文字は,表示(印刷)装置で,文字として表示(印字)できる。
176
177 @item
178 この表にない文字とそのビット構成が必要な場合は,問題中で与える。
179 @end enumerate
180
181 @chapter アセンブラ言語CASL IIの仕様
182
183 @section 言語の仕様
184
185 @enumerate
186 @item
187 CASL IIは,COMET IIのためのアセンブラ言語である。
188
189 @item
190 プログラムは,命令行および注釈行からなる。
191
192 @item
193 1命令は1命令行で記述し,次の行へ継続できない。
194
195 @item
196 命令行および注釈行は,次に示す記述の形式で,行の1文字目から記述する。 @*
197
198 @image{img/2_1-01,15cm,,,.svg}
199 @end enumerate
200
201 @unnumberedsubsec 注
202
203 @table @dfn
204 @item [ ]
205 [ ]内の指定が省略できることを示す。
206
207 @item { }
208 { }内の指定が必須であることを示す。
209
210 @item ラベル
211 その命令の(先頭の語の)アドレスを他の命令やプログラムから参照するための名前である。 長さは1~8文字で,先頭の文字は英大文字でなければならない。 以降の文字は,英大文字又は数字のいずれでもよい。 なお,予約語であるGR0~GR7は,使用できない。
212
213 @item 空白
214 1文字以上の間隔文字の列である。
215
216 @item 命令コード
217 命令ごとに記述の形式が定義されている。
218
219 @item オペランド
220 命令ごとに記述の形式が定義されている。
221
222 @item コメント
223 覚え書きなどの任意の情報であり,処理系で許す任意の文字を書くことができる。
224 @end table
225
226 @section 命令の種類
227
228 命令は,4種類のアセンブラ命令(@code{START},@code{END},@code{DS},@code{DC}), 4種類のマクロ命令(@code{IN},@code{OUT})および機械語命令(COMET IIの命令)からなる。 その仕様を次に示す。
229
230 @image{img/2_2-01,15cm,,,.svg}
231
232 @section アセンブラ命令
233
234 アセンブラ命令は,アセンブラの制御などを行う。
235
236 @enumerate
237
238 @item @* @image{img/2_3-01,5cm,,,.svg} @*
239
240 @code{START}命令は,プログラムの先頭を定義する。
241
242 実行開始番地は,そのプログラム内で定義されたラベルで指定する。指定がある場合はその番地から,省略した場合は@code{START}命令の次の命令から,実行を開始する。
243
244 また,この命令につけられたラベルは,他のプログラムから入口名として参照できる。
245
246 @item @* @image{img/2_3-02,5cm,,,.svg} @*
247
248 @code{END}命令は,プログラムの終わりを定義する。
249
250 @item @* @image{img/2_3-03,5cm,,,.svg} @*
251
252 @code{DS}命令は,指定した語数の領域を確保する。
253
254 語数は,10進定数(@geq{} 0)で指定する。語数を0とした場合,領域は確保しないが,ラベルは有効である。
255
256 @item @* @image{img/2_3-04,5cm,,,.svg} @*
257
258 @code{DC}命令は,定数で指定したデータを(連続する)語に格納する。
259 定数には,10進定数,16進定数,文字定数,アドレス定数の4種類がある。 @*
260
261 @image{img/2_3-05,15cm,,,.svg}
262 @end enumerate
263
264 @section マクロ命令
265
266 マクロ命令は,あらかじめ定義された命令群とオペランドの情報によって, 目的の機能を果たす命令群を生成する(語数は不定)。
267
268 @enumerate
269
270 @item @* @image{img/2_4-01,5cm,,,.svg} @*
271
272 @code{IN}命令は,あらかじめ割り当てた入力装置から,1レコードの文字データを読み込む。
273
274 入力領域は,256語長の作業域のラベルであり,この領域の先頭から,1文字を1語に対応させて順次入力される。レコードの区切り符号(キーボ-ド入力の復帰符号など)は,格納しない。格納の形式は,@code{DC}命令の文字定数と同じである。入力データが256文字に満たない場合, 入力領域の残りの部分は実行前のデータを保持する。入力データが256文字を超える場合, 以降の文字は無視される。
275
276 入力文字長領域は,1語長の領域のラベルであり,入力された文字の長さ(@geq{} 0)が2進数で格納される。ファイルの終わり(end of file)を検出した場合は,-1が格納される。
277
278 @code{IN}命令を実行すると,@code{GR}の内容は保存されるが,@code{FR}の内容は不定となる。
279
280 @item @* @image{img/2_4-02,5cm,,,.svg} @*
281
282 @code{OUT}命令は,あらかじめ割り当てた出力装置に,文字データを,1レコードとして書き出す。
283
284 出力領域は,出力しようとするデータが1文字1語で格納されている領域のラベルである。 格納の形式は,@code{DC}命令の文字定数と同じであるが, 上位8ビットは,OSが無視するので0でなくてもよい。
285
286 出力文字長領域は,1語長の領域のラベルであり, 出力しようとする文字の長さ(@geq{} 0)を2進数で格納しておく。
287
288 @code{OUT}命令を実行すると,@code{GR}の内容は保存されるが,@code{FR}の内容は不定となる。
289
290 @item @* @image{img/2_4-03,5cm,,,.svg} @*
291
292 @code{RPUSH}命令は,@code{GR}の内容を,@code{GR1},@code{GR2},…,@code{GR7}の順でスタックに格納する。
293
294 @item @* @image{img/2_4-04,5cm,,,.svg} @*
295
296 @code{RPOP}命令は,スタックの内容を順次取り出し,@code{GR7},@code{GR6},…,@code{GR1}の順で@code{GR}に格納する。
297 @end enumerate
298
299 @section 機械語命令
300
301 機械語命令のオペランドは,次の形式で記述する。
302
303 @table @code
304
305 @item r, r1 , r
306 @code{GR}は,記号@code{GR0}~@code{GR7}で指定する。
307
308 @item x
309 指標レジスタとして用いる@code{GR}は,記号@code{GR1}~@code{GR7}で指定する。
310
311 @item adr
312 アドレスは,10進定数,16進定数,アドレス定数又はリテラルで指定する。
313 リテラルは,ひとつの10進定数,16進定数又は文字定数の前に等号(=)を付けて 記述する。CASL IIは,等号の後の定数をオペランドとする@code{DC}命令を生成し, そのアドレスをadrの値とする。
314 @end table
315
316 @section その他
317
318 @enumerate
319 @item
320 アセンブラによって生成される命令語や領域の相対位置は,アセンブラ言語での記述順序とする。ただし,リテラルから生成される@code{DC}命令は,@code{END}命令の直前にまとめて配置される。
321
322 @item
323 生成された命令語,領域は,主記憶上で連続した領域を占める。
324 @end enumerate
325
326 @chapter プログラム実行の手引
327 @section OS
328
329 プログラムの実行に関して,次の取決めがある。
330
331 @enumerate
332 @item
333 アセンブラは,未定義ラベル(オペランド欄に記述されたラベルのうち,そのプログラム内で定義されていないラベル)を,他のプログラムの入口名(@code{START}命令のラベル)と解釈する。この場合,アセンブラはアドレスの決定を保留し,その決定をOSに任せる。OSは,実行に先立って他のプログラムの入口名との連係処理を行いアドレスを決定する(プログラムの連係)。
334
335 @item
336 プログラムは,OS によって起動される。プログラムがロードされる主記憶の領域は不定とするが,プログラム中のラベルに対応するアドレス値は,OSによって実アドレスに補正されるものとする。
337
338 @item
339 プログラムの起動時に,OS はプログラム用に十分な容量のスタック領域を確保し,その最後のアドレスに1を加算した値を@code{SP}に設定する。
340
341 @item
342 OSは,@code{CALL}命令でプログラムに制御を渡す。プログラムを終了し OSに制御を戻すときは,@code{RET}命令を使用する。
343
344 @item
345 @code{IN}命令に対応する入力装置,@code{OUT}命令に対応する出力装置の割当ては,プログラムの実行に先立って利用者が行う。
346
347 @item
348 OSは,入出力装置や媒体による入出力手続の違いを吸収し,システムでの標準の形式及び手続(異常処理を含む)で入出力を行う。したがって,@code{IN},@code{OUT}命令では,入出力装置の違いを意識する必要はない。
349 @end enumerate
350
351 @section 未定義事項
352
353 プログラムの実行等に関し,この仕様で定義しない事項は,処理系によるものとする。
354
355 @unnumbered 参考資料
356 参考資料は,COMET IIの理解を助けるため又は COMET IIの処理系作成者に対する便宜のための資料である。したがって,COMET II,CASL IIの仕様に影響を与えるものではない。
357
358 @section 命令語の構成
359
360 命令語の構成は定義しないが,次のような構成を想定する。ここで,@code{OP}の数値は16進表示で示す。
361
362 @image{img/r_1-01,15cm,,,.svg}
363
364 @section マクロ命令
365
366 マクロ命令が生成する命令群は定義しない(語数不定)が,次の例のような命令群を生成することを想定する。
367
368 〔例〕@code{IN}命令
369 @verbatim
370 LABEL  IN IBUF,LEN
371 @end verbatim
372
373 マクロ生成
374
375 @verbatim
376 LABEL PUSH 0,GR1
377       PUSH 0,GR2
378       LAD GR1,IBUF
379       LAD GR2,LEN
380       SVC 1
381       POP GR2
382       POP GR1
383 @end verbatim
384
385 @section シフト演算命令におけるビットの動き
386
387 シフト演算命令において,例えば,1ビットのシフトをしたときの動き及び@code{OF}の変化は,次のとおりである。
388
389 @enumerate
390
391 @item 算術左シフトでは,ビット番号14の値が設定される。 @*
392
393 @image{img/r_1-02,15cm,,,.svg}
394
395 @item 算術右シフトでは,ビット番号0の値が設定される。 @*
396
397 @image{img/r_1-03,15cm,,,.svg}
398
399 @item 論理左シフトでは,ビット番号15の値が設定される。 @*
400
401 @image{img/r_1-04,15cm,,,.svg}
402
403 @item 論理右シフトでは,ビット番号0の値が設定される。 @*
404
405 @image{img/r_1-05,15cm,,,.svg}
406 @end enumerate
407
408 @section プログラムの例
409
410 @verbatim
411 COUNT1  START                    ;
412 ;       入力    ; GR1:検索する語
413 ;       処理    ; GR1 中の'1'のビットの個数を求める
414 ;       出力    ; GR0:GR1 中の'1'のビットの個数
415         PUSH    0,GR1            ;
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
424 RETURN  LD      GR0,GR2          ;
425         POP     GR2              ;
426         POP     GR1              ;
427         RET                      ; 呼出しプログラムへ戻る
428         END                      ;
429 @end verbatim
430 @bye