\input texinfo @c -*-texinfo-*- @c %**start of header @ifnottex @documentlanguage ja_JP @end ifnottex @setfilename casl2_spec @documentencoding UTF-8 @settitle 情報処理技術者試験 アセンブラ言語の仕様 @firstparagraphindent insert @paragraphindent 1 @ifhtml @exampleindent 0 @end ifhtml @c %**end of header @copying Copyright @copyright{} Information-technology Promotion Agency, Japan. All rights reserved 2021 @end copying @titlepage @title 情報処理技術者試験 アセンブラ言語の仕様 @subtitle 「試験で使用する情報処理用語・プログラム言語など Ver 4.3(2021年10月8日) 別紙2」より @end titlepage @chapter システム COMET IIの仕様 @section ハードウェアの仕様 @enumerate @item 1語は16ビットで,そのビット構成は,次のとおりである。 @image{img/1_1-01,15cm,,,.svg} @item 主記憶の容量は65536語で,そのアドレスは0~65535番地である。 @item 数値は,16ビットの2進数で表現する。負数は,2の補数で表現する。 @item 制御方式は逐次制御で,命令語は1語長又は2語長である。 @item レジスタとして,@code{GR}(16ビット),@code{SP}(16ビット),@code{PR}(16ビット),@code{FR}(3ビット)の4種類がある。 @itemize @w{ } @item @code{GR}(汎用レジスタ,General Register)は,@code{GR0}~@code{GR7}の8個があり, 算術,論理,比較,シフトなどの演算に用いる。 このうち,@code{GR1}~@code{GR7}のレジスタは,指標レジスタ(index register) としてアドレスの修飾にも用いる。 @item @code{SP}(スタックポインタ,Stack Pointer)は, スタックの最上段のアドレスを保持している。 @item @code{PR}(プログラムレジスタ,Program Register)は, 次に実行すべき命令語の先頭アドレスを保持している。 @item @code{FR}(フラグレジスタ,Flag Register)は, @code{OF}(Overflow Flag),@code{SF}(Sign Flag),@code{ZF}(Zero Flag)と呼ぶ 3個のビットからなり,演算命令などの実行によって次の値が設定される。 これらの値は,条件付き分岐命令で参照される。 @table @code @item OF 算術演算命令の場合は,演算結果が-32768~32767に収まらなくなったとき1になり, それ以外のとき0になる。 論理演算命令の場合は,演算結果が0~65535に収まらなくなったとき1になり, それ以外のとき0になる。 @item SF 演算結果の符号が負(ビット番号15が1)のとき1,それ以外のとき0になる。 @item ZF 演算結果が零(全部のビットが0)のとき1,それ以外のとき0になる。 @end table @end itemize @item 論理加算又は論理減算は,被演算データを符号のない数値とみなして, 加算又は減算する。 @end enumerate @section 命令 命令の形式及びその機能を示す。 ここで,一つの命令コードに対し2種類のオペランドがある場合, 上段はレジスタ間の命令,下段はレジスタと主記憶間の命令を表す。 @image{img/1_2-00,15cm,,,.svg} @subsection ロード,ストア,ロードアドレス命令 @image{img/1_2-01,15cm,,,.svg} @subsection 算術,論理演算命令 @image{img/1_2-02,15cm,,,.svg} @subsection 比較演算命令 @image{img/1_2-03,15cm,,,.svg} @subsection シフト演算命令 @image{img/1_2-04,15cm,,,.svg} @subsection 分岐命令 @image{img/1_2-05,15cm,,,.svg} @subsection スタック操作命令 @image{img/1_2-06,15cm,,,.svg} @subsection コール,リターン命令 @image{img/1_2-07,15cm,,,.svg} @subsection その他 @image{img/1_2-08,15cm,,,.svg} @unnumberedsubsec 注 @table @dfn @item @code{r}, @code{r1}, @code{r2} いずれも @code{GR}を示す。指定できる@code{GR}は@code{GR0}~@code{GR7} @item @code{adr} アドレスを示す。指定できる値の範囲は@code{0}~@code{65535} @item @code{x} 指標レジスタとして用いる@code{GR}を示す。指定できる@code{GR}は@code{GR1}~@code{GR7} @item @code{[ ]} @code{[ ]}内の指定は省略できることを示す。 @item @code{( )} @code{( )}内のレジスタ又はアドレスに格納されている内容を示す。 @item @code{実効アドレス} @code{adr}と@code{x}の内容との論理加算値又はその値が示す番地 @item @code{←} 演算結果を,左辺のレジスタ又はアドレスに格納することを示す。 @item @code{+L}, @code{-L} 論理加算,論理減算を示す。 @item @code{FR}の設定 @itemize @w{} @item @code{○ }: 設定されることを示す。 @item @code{○*1}: 設定されることを示す。ただし、@code{OF}には0が設定される。 @item @code{○*2}: 設定されることを示す。ただし、@code{OF}にはレジスタから最後に送り出されたビットの値が設定される。 @item @code{— }: 実行前の値が保持されることを示す。 @end itemize @end table @section 文字の符号表 @enumerate @item JIS X 0201 ラテン文字・片仮名用8ビット符号で規定する文字の符号表を使用する。 @item 次に符号表の一部を示す。 @* @image{img/1_3-01,5cm,,,.svg} 1文字は8ビットからなり,上位4ビットを列で,下位4ビットを行で示す。 例えば,@code{間隔},@code{4},@code{H},@code{@backslashchar{}}のビット構成は,16進表示で,それぞれ20,34,48,5Cである。ビット構成が21~7E(及び表では省略しているA1~DF)に対応する文字を図形文字という。 図形文字は,表示(印刷)装置で,文字として表示(印字)できる。 @item この表にない文字とそのビット構成が必要な場合は,問題中で与える。 @end enumerate @chapter アセンブラ言語CASL IIの仕様 @section 言語の仕様 @enumerate @item CASL IIは,COMET IIのためのアセンブラ言語である。 @item プログラムは,命令行および注釈行からなる。 @item 1命令は1命令行で記述し,次の行へ継続できない。 @item 命令行および注釈行は,次に示す記述の形式で,行の1文字目から記述する。 @* @image{img/2_1-01,15cm,,,.svg} @end enumerate @unnumberedsubsec 注 @table @dfn @item [ ] [ ]内の指定が省略できることを示す。 @item { } { }内の指定が必須であることを示す。 @item ラベル その命令の(先頭の語の)アドレスを他の命令やプログラムから参照するための名前である。 長さは1~8文字で,先頭の文字は英大文字でなければならない。 以降の文字は,英大文字又は数字のいずれでもよい。 なお,予約語であるGR0~GR7は,使用できない。 @item 空白 1文字以上の間隔文字の列である。 @item 命令コード 命令ごとに記述の形式が定義されている。 @item オペランド 命令ごとに記述の形式が定義されている。 @item コメント 覚え書きなどの任意の情報であり,処理系で許す任意の文字を書くことができる。 @end table @section 命令の種類 命令は,4種類のアセンブラ命令(@code{START},@code{END},@code{DS},@code{DC}), 4種類のマクロ命令(@code{IN},@code{OUT})および機械語命令(COMET IIの命令)からなる。 その仕様を次に示す。 @image{img/2_2-01,15cm,,,.svg} @section アセンブラ命令 アセンブラ命令は,アセンブラの制御などを行う。 @enumerate @item @* @image{img/2_3-01,5cm,,,.svg} @* @code{START}命令は,プログラムの先頭を定義する。 実行開始番地は,そのプログラム内で定義されたラベルで指定する。指定がある場合はその番地から,省略した場合は@code{START}命令の次の命令から,実行を開始する。 また,この命令につけられたラベルは,他のプログラムから入口名として参照できる。 @item @* @image{img/2_3-02,5cm,,,.svg} @* @code{END}命令は,プログラムの終わりを定義する。 @item @* @image{img/2_3-03,5cm,,,.svg} @* @code{DS}命令は,指定した語数の領域を確保する。 語数は,10進定数(@geq{} 0)で指定する。語数を0とした場合,領域は確保しないが,ラベルは有効である。 @item @* @image{img/2_3-04,5cm,,,.svg} @* @code{DC}命令は,定数で指定したデータを(連続する)語に格納する。 定数には,10進定数,16進定数,文字定数,アドレス定数の4種類がある。 @* @image{img/2_3-05,15cm,,,.svg} @end enumerate @section マクロ命令 マクロ命令は,あらかじめ定義された命令群とオペランドの情報によって, 目的の機能を果たす命令群を生成する(語数は不定)。 @enumerate @item @* @image{img/2_4-01,5cm,,,.svg} @* @code{IN}命令は,あらかじめ割り当てた入力装置から,1レコードの文字データを読み込む。 入力領域は,256語長の作業域のラベルであり,この領域の先頭から,1文字を1語に対応させて順次入力される。レコードの区切り符号(キーボ-ド入力の復帰符号など)は,格納しない。格納の形式は,@code{DC}命令の文字定数と同じである。入力データが256文字に満たない場合, 入力領域の残りの部分は実行前のデータを保持する。入力データが256文字を超える場合, 以降の文字は無視される。 入力文字長領域は,1語長の領域のラベルであり,入力された文字の長さ(@geq{} 0)が2進数で格納される。ファイルの終わり(end of file)を検出した場合は,-1が格納される。 @code{IN}命令を実行すると,@code{GR}の内容は保存されるが,@code{FR}の内容は不定となる。 @item @* @image{img/2_4-02,5cm,,,.svg} @* @code{OUT}命令は,あらかじめ割り当てた出力装置に,文字データを,1レコードとして書き出す。 出力領域は,出力しようとするデータが1文字1語で格納されている領域のラベルである。 格納の形式は,@code{DC}命令の文字定数と同じであるが, 上位8ビットは,OSが無視するので0でなくてもよい。 出力文字長領域は,1語長の領域のラベルであり, 出力しようとする文字の長さ(@geq{} 0)を2進数で格納しておく。 @code{OUT}命令を実行すると,@code{GR}の内容は保存されるが,@code{FR}の内容は不定となる。 @item @* @image{img/2_4-03,5cm,,,.svg} @* @code{RPUSH}命令は,@code{GR}の内容を,@code{GR1},@code{GR2},…,@code{GR7}の順でスタックに格納する。 @item @* @image{img/2_4-04,5cm,,,.svg} @* @code{RPOP}命令は,スタックの内容を順次取り出し,@code{GR7},@code{GR6},…,@code{GR1}の順で@code{GR}に格納する。 @end enumerate @section 機械語命令 機械語命令のオペランドは,次の形式で記述する。 @table @code @item r, r1 , r @code{GR}は,記号@code{GR0}~@code{GR7}で指定する。 @item x 指標レジスタとして用いる@code{GR}は,記号@code{GR1}~@code{GR7}で指定する。 @item adr アドレスは,10進定数,16進定数,アドレス定数又はリテラルで指定する。 リテラルは,ひとつの10進定数,16進定数又は文字定数の前に等号(=)を付けて 記述する。CASL IIは,等号の後の定数をオペランドとする@code{DC}命令を生成し, そのアドレスをadrの値とする。 @end table @section その他 @enumerate @item アセンブラによって生成される命令語や領域の相対位置は,アセンブラ言語での記述順序とする。ただし,リテラルから生成される@code{DC}命令は,@code{END}命令の直前にまとめて配置される。 @item 生成された命令語,領域は,主記憶上で連続した領域を占める。 @end enumerate @chapter プログラム実行の手引 @section OS プログラムの実行に関して,次の取決めがある。 @enumerate @item アセンブラは,未定義ラベル(オペランド欄に記述されたラベルのうち,そのプログラム内で定義されていないラベル)を,他のプログラムの入口名(@code{START}命令のラベル)と解釈する。この場合,アセンブラはアドレスの決定を保留し,その決定をOSに任せる。OSは,実行に先立って他のプログラムの入口名との連係処理を行いアドレスを決定する(プログラムの連係)。 @item プログラムは,OS によって起動される。プログラムがロードされる主記憶の領域は不定とするが,プログラム中のラベルに対応するアドレス値は,OSによって実アドレスに補正されるものとする。 @item プログラムの起動時に,OS はプログラム用に十分な容量のスタック領域を確保し,その最後のアドレスに1を加算した値を@code{SP}に設定する。 @item OSは,@code{CALL}命令でプログラムに制御を渡す。プログラムを終了し OSに制御を戻すときは,@code{RET}命令を使用する。 @item @code{IN}命令に対応する入力装置,@code{OUT}命令に対応する出力装置の割当ては,プログラムの実行に先立って利用者が行う。 @item OSは,入出力装置や媒体による入出力手続の違いを吸収し,システムでの標準の形式及び手続(異常処理を含む)で入出力を行う。したがって,@code{IN},@code{OUT}命令では,入出力装置の違いを意識する必要はない。 @end enumerate @section 未定義事項 プログラムの実行等に関し,この仕様で定義しない事項は,処理系によるものとする。 @unnumbered 参考資料 参考資料は,COMET IIの理解を助けるため又は COMET IIの処理系作成者に対する便宜のための資料である。したがって,COMET II,CASL IIの仕様に影響を与えるものではない。 @section 命令語の構成 命令語の構成は定義しないが,次のような構成を想定する。ここで,@code{OP}の数値は16進表示で示す。 @image{img/r_1-01,15cm,,,.svg} @section マクロ命令 マクロ命令が生成する命令群は定義しない(語数不定)が,次の例のような命令群を生成することを想定する。 〔例〕@code{IN}命令 @verbatim LABEL IN IBUF,LEN @end verbatim マクロ生成 @verbatim LABEL PUSH 0,GR1 PUSH 0,GR2 LAD GR1,IBUF LAD GR2,LEN SVC 1 POP GR2 POP GR1 @end verbatim @section シフト演算命令におけるビットの動き シフト演算命令において,例えば,1ビットのシフトをしたときの動き及び@code{OF}の変化は,次のとおりである。 @enumerate @item 算術左シフトでは,ビット番号14の値が設定される。 @* @image{img/r_1-02,15cm,,,.svg} @item 算術右シフトでは,ビット番号0の値が設定される。 @* @image{img/r_1-03,15cm,,,.svg} @item 論理左シフトでは,ビット番号15の値が設定される。 @* @image{img/r_1-04,15cm,,,.svg} @item 論理右シフトでは,ビット番号0の値が設定される。 @* @image{img/r_1-05,15cm,,,.svg} @end enumerate @section プログラムの例 @verbatim COUNT1 START ; ; 入力 ; GR1:検索する語 ; 処理 ; GR1 中の'1'のビットの個数を求める ; 出力 ; GR0:GR1 中の'1'のビットの個数 PUSH 0,GR1 ; PUSH 0,GR2 ; SUBA GR2,GR2 ; Count = 0 AND GR1,GR1 ; 全部のビットが'0'? JZE RETURN ; 全部のビットが'0'なら終了 MORE LAD GR2,1,GR2 ; Count = Count + 1 LAD GR0,-1,GR1 ; 最下位の'1'のビット 1 個を AND GR1,GR0 ; '0'に変える JNZ MORE ; '1'のビットが残っていれば繰返し RETURN LD GR0,GR2 ; GR0 = Count POP GR2 ; POP GR1 ; RET ; 呼出しプログラムへ戻る END ; @end verbatim @bye