(1) COMET は,1語16ビットの計算機であって,アクセスできるアドレスは0番地から65535番地までである.
(2)1語のビット構成は次の通りである.
(3) 数値は,16ビットの2進数により表現する.負数は,2の補数表記である.
(4) 制御方式は,逐次制御で,2語長の命令語をもつ.
(5) レジスタとして,GR(16ビット),PC(16ビット),FR(2ビット)をもつ.
GR(汎用レジスタ,general register)は5個あり,汎用レジスタ0番から4番までとする.
この5個のレジスタは,算術,論理,比較,シフト演算などに用いる.このうち,1番から4番までのレジスタは,指標レジスタ(index
register)としても用いる. また4番のレジスタは,更にスタックポインタ(stack
pointer)として用いる.
スタックポインタは,スタックの最上段(stack top)のアドレスを保持しているレジスタである.
PC(プログラムカウンタ,program counter)は,実行中の命令の先頭アドレスを保持し,命令の実行が終わると,次に実行する命令語の先頭アドレスが設定される.一般に,命令の実行が終わると,PCに2がアドレス加算(
注)され,分岐,コール,リターン命令の場合は,新たに分岐先のアドレスが設定される.
FR(フラグレジスタ,flag register)は,ロードアドレス命令及び算術,論理,シフトの各演算命令の実行の結果,GRに設定されたデータが負,零,正のいずれであるかの情報,又は比較演算命令の実行により得られた,二数間の大小関係の情報を保持する.
すなわち,実行結果により,FRは次の表のとおり設定される(ただし,比較については,
「1.2(4)比較演算命令」参照).
GRに設定されたデータ |
|||
---|---|---|---|
負 |
零 |
正 |
|
FRの値 |
10 |
01 |
00 |
上の表で,負はGRの符号ビットが1,零はGRの全ビットが0,正は符号ビットが0で,かつ零でないデータをいう.
FRの第1(左端の)ビットはGRの符号を示し,第2ビットはGRが零か否かを示す.
FRの値は,条件付き分岐命令で参照する.
その他の命令の実行によって,FRの値は変更されない.
(6) 命令語の構成
2語長の命令語をもつ.その構成については定義しない.
(7) 命令の表記
各命令の説明には,次の表記法を用いる.
GR | GRの値を番号とする汎用レジスタ(ただし,0≦GR≦4) |
---|---|
XR | XRの値を番号とする指標レジスタ(ただし,1≦GR≦4) |
SP | スタックポインタ(汎用レジスタ4番) |
adr | ラベル名(ラベル名に対応する番地を示す)又は10進定数(ただし, -32768≦adr≦65535とする.adrはアドレスとして,0〜65535の値をもつが, 32768〜65535の値を負の10進定数で記述することもできる.) |
有効アドレス | adrとXRの内容とのアドレス加算値又はその値が示す番地 |
(X) | X番地の内容,Xがレジスタの場合はレジスタの内容 |
[ ] | [ ] に囲まれた部分は,省略可能であることをしめす. XRを省略した場合は,指標レジスタによる修飾を行わない. |
1.2 命令
命令及びその機能を示す.命令はアセンブラの表記法で記述する.
GR |
書き方 |
命令の説明 |
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
命令コード |
オペランド |
||||||||||||
(1)ロード,ストア命令 | |||||||||||||
ロード LoaD | LD | GR,adr[,XR] | (有効アドレス)をGRに設定する. | ||||||||||
ストア STore | ST | GR,adr[,XR] | (GR)を有効アドレスが示す番地に設定する. | ||||||||||
(2)ロードアドレス命令 | |||||||||||||
ロードアドレス Load Effective Address | LEA | GR,adr[,XR] | 有効アドレスをGRに設定する. GRの値によりFRを設定する. |
||||||||||
(3)算術,論理演算命令 | |||||||||||||
算術加算 ADD arithmetic | ADD | GR,adr[,XR] | (GR)と(有効アドレス)に,指定した演算を施し,
結果をGRに設定する. なお,算術減算では,(GR)から(有効アドレス)を減算する. 演算結果によりFRを設定する. |
||||||||||
算術減算 SUBtract arithmetic | SUB | GR,adr[,XR] | |||||||||||
論理積 AND | AND | GR,adr[,XR] | |||||||||||
論理和 OR | OR | GR,adr[,XR] | |||||||||||
排他的論理和 EOR | EOR | GR,adr[,XR] | |||||||||||
(4)比較演算命令 | |||||||||||||
算術比較 ComPare Arithmetic | CPA | GR,adr[,XR] |
(GR)と(有効アドレス)の算術比較又は論理比較を行い,比較結果によりFRに次の値を設定する.
|
||||||||||
論理比較 ComPare Logical | CPL | GR,adr[,XR] | |||||||||||
(5)シフト演算命令 | |||||||||||||
算術左シフト Shift Left Arithmetic | SLA | GR,adr[,XR] |
(GR)を符号を除き有効アドレスで指定したビット数だけ左又は右にシフトする. シフトの結果,空いたビット位置には,左シフトのときは0,右シフトのときは符号と同じものが入る. シフトの結果によりFRを設定する. |
||||||||||
算術右シフト Shift Right Arithmetic | SRA | GR,adr[,XR] | |||||||||||
論理左シフト Shift Left Logical | SLL | GR,adr[,XR] |
(GR)を符号を含み有効アドレスで指定したビット数だけ左又は右にシフトする. シフトの結果,空いたビット位置には0が入る. シフトの結果によりFRを設定する. |
||||||||||
論理右シフト Shift Right Logical | SRL | GR,adr[,XR] | |||||||||||
(6)分岐命令 | |||||||||||||
正分岐 Jump on Plus or Zero | JPZ | adr[,XR] |
FRの値により,有効アドレスに分岐する.分岐しないときは次の命令に進む.
|
||||||||||
負分岐 Jump on MInus | JMI | adr[,XR] | 非零分岐 Jump on Non Zero | JNZ | adr[,XR] | 零分岐 Jump on ZEro | JZE | adr[,XR] | 無条件分岐 unconditional JuMP | JMP | adr[,XR] | 無条件に有効アドレスに分岐する. | |
(7)スタック操作命令 | |||||||||||||
プッシュ PUSH effective address | PUSH | adr[,XR] | SPから1をアドレス減算した後,有効アドレスを(SP)番地に格納する. | ||||||||||
ポップ POP up | POP | GR | (SP)番地の内容をGRに設定した後,SPに1アドレス加算する. | ||||||||||
(8)コール,リターン命令 | |||||||||||||
コール CALL subroutine | CALL | adr[,XR] | SPから1をアドレス減算した後,PCの現在値に2をアドレス加算した値を(SP)番地に格納し,有効アドレスに分岐する. | ||||||||||
リターン RETurn form subroutine | RET | (SP)番地の内容を取り出した後,SPに1アドレス加算し,先に取り出した内容(番地)に分岐する(取り出した内容をPCに設定する). |
COMETはJIS X0201ローマ字・片仮名用8単位符号で規定する文字の組をもつ.
次に符号表の一部を示す.この表にない文字が必要な場合には,その文字のビット構成を問題中で与える.
行 / 列 | 0 2 | 0 3 | 0 4 | 0 5 |
---|---|---|---|---|
0 | 間隔 | 0 | @ | P |
1 | ! | 1 | A | Q |
2 | " | 2 | B | R |
3 | # | 3 | C | S |
4 | $ | 4 | D | T |
5 | % | 5 | E | U |
6 | & | 6 | F | V |
7 | ' | 7 | G | W |
8 | ( | 8 | H | X |
9 | ) | 9 | I | Y |
10 | * | : | J | Z |
11 | + | ; | K | [ |
12 | , | < | L | \ |
13 | - | = | M | ] |
14 | . | > | N | ^ |
15 | / | ? | O | _ |
COMETのためのアセンブラ言語はCASLといい,その仕様は次のとおりである.
2.1 命令の種類
CASLは,4種類の擬似命令START,END,DS,DC,3種類のマクロ命令IN,OUT,EXIT及び機械語命令(COMETの命令)からなる.
(1)擬似命令
擬似命令は,アセンブラの制御,定数の定義,プログラム連結のために必要なデータの生成などを行う.擬似命令の機能は下の表のとおりである.
擬似命令 | 機能 |
---|---|
START | プログラムの先頭の定義 プログラムの実行開始番地の定義 他のプログラムとの連結のための入口名の定義 |
END | プログラムの終わりの定義 |
DS | 領域の確保 |
DC | 定数の定義 |
(2)マクロ命令
マクロ命令は,あらかじめ定義された命令群とオペランドの情報により,目的の機能を果たす命令群を生成する.
CASLで用意されているマクロ命令は,入出力及びプログラムの終了などを行う命令である.CASLでは,機械語の入出力命令などを定義していないので,このような処理はオペレーティングシステムに任せる.マクロ命令が現れるとCASLは,オペレーティングシステムを呼ぶための命令群を生成する.ただし,生成される命令群の語数は不定とする.
マクロ命令を実行すると,GRの内容は保存されるが,FRの内容は不定となる.
マクロ命令の機能は下の表のとおりである.
マクロ命令 | 機 能 |
---|---|
IN | 入力 |
OUT | 出力 |
EXIT | プログラムの実行終了 |
(3)機械語命令
「1.2 命令」で説明した23種類の機械語命令がある.
擬似命令,マクロ命令,機械語命令は,ラベル欄,命令コード欄,オペランド欄,注釈欄をもつ.各欄は,次のとおり定義する.
ラベル欄 | 第1文字からラベルの文字数分(最大6文字) |
---|---|
命令コード欄 | @ラベルをつけないとき 第2文字以降の任意の位置から Aラベルをつけたとき ラベルのあと少なくとも一つの空白をおいたあと,任意の文字位置から |
オペランド欄 | 命令コードのあと少なくとも一つの空白をおいたあと,第72文字までとする.次の行に継続することはできない. |
注釈欄 | 行中にセミコロン(;)があると,それ以降行の終わりまで注釈として扱う(ただし,DC命令の文字列中の;を除く). なお,第1文字位置に;がある場合,又は;の前に空白しかない場合は,その行全体を注釈として扱う. 注釈欄には,処理系で許す任意の文字を書くことができる. |
ラベル | 命令コード | オペランド | 読み方 |
---|---|---|---|
label | START | [ 実行開始番地 ] | START |
空白 | END | 空白 | END |
[ label ] | DC | 定数 | Define Constant |
[ label ] | DS | 領域の語数 | Define Storage |
[ label ] | IN | 入力領域,入力文字長 | INput |
[ label ] | OUT | 出力領域,出力文字長 | OUTput |
[ label ] | EXIT | 空白 | EXIT |
[ label ] | 機械語命令(「1.2命令」参照) |
(1) レジスタの指定
機械語命令のオペランド欄のレジスタの指定は,汎用レジスタ番号に対応する0〜4の数字で行うものとするが,下の表の記号で指定することもできる.
レジスタの記号による指定 | 汎用レジスタ番号 |
---|---|
GR0 | 0 |
GR1 | 1 |
GR2 | 2 |
GR3 | 3 |
GR4 | 4 |
(2) ラベル欄
ラベル欄のlableは,ラベルである.ラベルは6文字以内で,先頭の文字は英大文字でなければならない.以降の文字は英大文字,数字のいずれでもよい.DC,DS,IN,OUT,EXIT及び機械語の命令につけられたラベルは,その領域又は命令語(マクロ命令のときは命令群)の先頭の語のアドレスを示す.
START命令につけられたラベルは,別のプログラムの入口名として参照できる.
(1) START | [ 実行開始番地 ]
プログラムの先頭を示す.すなわち,プログラムの最初にこれを書かなければならない.
実行開始番地は,このプログラム内で定義されているラベル名とし,このプログラムの実行開始番地を指定する.省略した場合は,プログラムの先頭から実行を開始する.
(2) END
プログラムの終わりを示す.プログラムの最後にこれを書かなければならない.
(3) DC | 定数
定数で指定した定数データを格納する.定数には,10進定数,16進定数,文字定数,アドレス定数の4種類がある.
定数の種類 | 書き方 | 説 明 | |
---|---|---|---|
命令コード | オペランド | ||
10進定数 | DC | n | nで指定した10進数値を1語の2進数データとして格納する.ただし,nが-32768〜32767の範囲にないときは,その下位16ビットを格納する. |
16進定数 | DC | #h | hは4桁の16進数(16進数字は0〜9,A〜F)とする.hで指定した16進数値を1語の2進数データとして格納する(0000≦FFFF). |
文字定数 | DC | '文字列' | 文字列の左端から1文字ずつ,連続する語の下位8ビットに,文字データを格納する.すなわち最初の文字は第1語の第8〜15ビットに,2番目の文字は第2語の第8〜15ビットに,・・・と順次,文字列の文字数分文字データを格納する.各語の第0〜7ビットには0のビットが入る.文字列には,間隔及び任意の図形文字(「1.3 文字の組」参照)を書くことができる.ただし,アポストロフィ(')は書けない. 文字列の長さは0(文字列が空)であってはならない. |
アドレス定数 | DC | ラベル名 | ラベル名に対応するアドレス値を1語の2進数データとして格納する. ラベル名がこのプログラム内で定義されていない場合,アセンブラはアドレスの決定を保留し,アドレスの決定をオペレーティングシステムに任せる(「3.1 (5)未定義ラベル」参照). |
(4) DS | 領域の語数
指定した語数の領域を確保する.
領域の語数は,10進定数(≧ 0 )で指定する.領域の語数を0とした場合,領域は確保しない.ただし,ラベル欄のラベル名は有効である.
(1) IN
あらかじめ割り当てられた入力装置から入力領域に,1レコードのデータ(文字データ)を入力する(入力装置の割当てについては,「3.1 (3)入出力装置の割当て」参照).
オペランド欄の入力領域,入力文字長には,ラベル名を書く.
入力領域は,80語長(80文字分)の作業域のラベル名とし,この領域に(先頭番地から)1文字を1語に対応させて,順次入力する.各語の第0〜7ビットには,0のビットを格納する(DC命令の文字定数に同じ).入力したデータの長さ(入力レコードの文字数)を,入力文字長で指定した領域(1語)に2進データの形で格納する.レコードの区切符号(鍵盤入力のときの復帰符号など)は,格納しない.
入力データが80語に満たない場合,入力領域の残りの部分は実行前のデータを保持する.入力データが80文字を超える場合,以降の文字は無視する.
次の場合,入力文字長に0又は-1を格納する.
0 : 空のレコードの入力(タイプライタで復帰符号だけが入力されたときなど) -1 : EOF(end of file)が検出された(カードの読取り装置など)(2) OUT
(3) EXIT
プログラムの実行を終了する(制御をオペレーティングシステムに戻す).
2.5 命令,領域の相対位置
アセンブラにより生成される命令語や領域の相対位置は,アセンブラ言語での記述順序とする.また生成された命令語,領域は,主記憶上で連続した領域を占める.
3.1 オペレーティングシステム
プログラムの実行に関して,利用者プログラムとオペレーティングシステムとの間に,次の取り決めがある.
(1) プログラムの起動
プログラムはオペレーティングシステムにより起動される.プログラムが格納される番地は不定とするが,(2)で述べるスタック領域も含めてプログラムの実行に支障を与えないものとする.
(2) スタック領域
プログラムの起動時に,オペレーティングシステムは,スタック領域を確保し,スタック領域の最後のアドレスに1をアドレス加算した値をSPに設定する.この領域は,プログラムでスタックとして利用される.
スタック領域は,試験問題のプログラムで使用するのに十分な容量が確保されているものとする.
(3) 入出力装置の割当て
IN命令に対応する入力装置,OUT命令に対応する出力装置の割当ては,プログラムの実行に先立ってオペレータが行う.入出力装置には,コンソール表示装置,タイプライタ,カード読み取り装置,カードせん孔装置などがある.
(4) 入出力装置
各種の入出力装置からのデータの入出力は,IN,OUTマクロ命令で行うが,媒体や装置による入出力手続きの違いはすべてオペレーティングシステムが吸収し,システムの標準手続き(異常処理を含む),標準形式で入出力を行う.したがって,このマクロ命令の使用者は,入出力装置の違いを意識する必要はない.
(5) 未定義ラベル
アセンブラは,機械語命令のオペランド中のラベル,DC命令のアドレス定義のラベルのうち,そのプログラム内で定義されていないラベルを,他のプログラムのSTART命令のラベル(他のプログラムの入口名)と解釈する.
この場合,アセンブラはアドレスの決定を保留し,その決定をオペレーティングシステムに任せる.オペレーティングシステムは,実行に先立って他のプログラムのSTART命令のラベルとの結合処理を行いアドレスを決定する(プログラムの連結).
3.2 未定義事項
プログラムの実行等に関し,本仕様で定義していない事項は,処理系によるものとする.