アセンブラ言語の仕様[1]
-
1語は16ビットで,そのビット構成は,次のとおりである。
上位8ビット
下位8ビット
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
符号(負:1,非負:0)
-
主記憶の容量は65536語で,そのアドレスは0~65535番地である。
-
数値は,16ビットの2進数で表現する。負数は,2の補数で表現する。
-
制御方式は逐次制御で,命令語は1語長または2語長である。
-
レジスタとして,GR(16ビット),SP(16ビット),PR(16ビット),FR(3ビット)の4種類がある。
-
GR(汎用レジスタ,General Register)は,GR0~GR7の8個があり,算術,論理,比較,シフトなどの演算に用いる。このうち,GR1~GR7のレジスタは,指標レジスタ(index register)としてアドレスの修飾にも用いる。
-
SP(スタックポインタ,Stack Pointer)は,スタックの最上段のアドレスを保持している。
-
PR(プログラムレジスタ,Program Register)は,次に実行すべき命令語の先頭アドレスを保持している。
-
FR(フラグレジスタ,Flag Register)は,OF(Overflow Flag),SF(Sign Flag),ZF(Zero Flag)と呼ぶ3個のビットからなり,演算命令などの実行によって次の値が設定される。これらの値は,条件付き分岐命令で参照される。
- OF
-
算術演算命令の場合は,演算結果が-32768~32767に収まらなくなったとき1になり,それ以外のとき0になる。論理演算命令の場合は,演算結果が0~65535に収まらなくなったとき1になり,それ以外のとき0になる。
- SF
-
演算結果の符号が負(ビット番号15が1)のとき1,それ以外のとき0になる。
- ZF
-
演算結果の符号が零(全部のビットが0)のとき1,それ以外のとき0になる。
-
-
論理加算又は論理減算は,被演算データを符号のない数値とみなして,加算又は減算する。
命令の形式及びその機能を示す。ここで,一つの命令コードに対し2種類のオペランドがある場合,上段はレジスタ間の命令,下段はレジスタと主記憶間の命令を表す。
-
ローア,ストア,ロードアドレス命令
命令 コード オペランド 命令の説明 FRの設定 ロード
LoaDLD
r1, r2
r1 ← (r2)
○
r,adr[,x]
(r) ← 実効アドレス
ストア
SToreST
r,adr[,x]
実効アドレス ← (r)
-
ロードアドレス
Load ADdressLAD
r,adr[,x]
(r) ← 実効アドレス
-
算術,論理演算命令
命令 コード オペランド 命令の説明 FRの設定 算術加算
ADD ArithmeticADDA
r1, r2
r1 ← (r1) + (r2)
○
r,adr[,x]
r ← (r) + (実効アドレス)
論理加算
ADD LogicalADDA
r1, r2
r1 ← (r1) +L (r2)
r,adr[,x]
r ← (r) +L (実効アドレス)
算術減算
SUBtract ArithmeticSUBA
r1, r2
r1 ← (r1) - (r2)
r,adr[,x]
r ← (r) + (実効アドレス)
論理減算
SUBtract LogicalSUBL
r1, r2
r1 ← (r1) -L (r2)
r,adr[,x]
r ← (r) +L (実効アドレス)
論理積
ANDAND
r1, r2
r1 ← (r1) AND (r2)
○*1
r,adr[,x]
r ← (r) AND (実効アドレス)
論理和
OROR
r1, r2
r1 ← (r1) OR (r2)
r,adr[,x]
r ← (r) OR (実効アドレス)
排他的論理和
eXculsive ORXOR
r1, r2
r1 ← (r1) XOR (r2)
r,adr[,x]
r ← (r) XOR (実効アドレス)
-
比較演算命令
命令 コード オペランド 命令の説明 FRの設定 算術比較
ComPare ArithmeticCPA
r1, r2
(r1)と(r2),又は(r)と(実効アドレス)の算術比較又は論理比較を行い,比較結果によって,FRに次の値を設定する。
○*1
r,adr[,x]
論理比較
ComPare LogicalCPL
r1, r2
r1 ← (r2)
比較結果
FRの値
SF
ZF
(r1) > (r2)
0
0
(r) > (実効アドレス)
(r1) = (r2)
0
1
(r) = (実効アドレス)
(r1) < (r2)
1
0
(r) < (実効アドレス)
-
シフト演算命令
命令 コード オペランド 命令の説明 FRの設定 算術左シフト
Shift Left ArithmeticSLA
r,adr[,x]
符号を除き(r)を実効アドレスで指定したビット数だけ左又は右にシフトする。
シフトの結果,空いたビット位置には,左シフトのときは0,右シフトのときは符号と同じものが入る。○*2
算術右シフト
Shift Right ArithmeticSRA
r,adr[,x]
論理左シフト
Shift Left LogicalSLL
r,adr[,x]
符号を含み(r)を実効アドレスで指定したビット数だけ左又は右にシフトする。
シフトの結果,空いたビット位置には0が入る。論理右シフト
Shift Right LogicalSRL
r,adr[,x]
-
分岐命令
命令 コード オペランド 命令の説明 FRの設定 正分岐
Jump on PLusJPL
adr[,x]
FRの値によって,実効アドレスに分岐する。分岐しないときは,次の命令に進む。
-
負分岐
Jump on MInusJMI
adr[,x]
非零分岐
Jump on Non ZeroJNZ
adr[,x]
零分岐
Jump on ZEroJZE
adr[,x]
オーバーフロー分岐
Jump on OVerflowJOV
adr[,x]
無条件分岐
unconditional JUMPJUMP
adr[,x]
無条件に実効アドレスに分岐する。
命令
分岐するときのFRの値
OF
SF
ZF
JPL
0
0
JPL
1
JNZ
0
JZE
1
JOV
1
-
スタック操作命令
命令 コード オペランド 命令の説明 FRの設定 プッシュ
PUSHPUSH
adr[,x]
SP ← (SP) -L 1,
(SP) ← 実効アドレス-
ポップ
POPPOP
r
r ← SP,
SP ← (SP) +L 1 -
コール,リターン命令
命令 コード オペランド 命令の説明 FRの設定 コール
CALL subroutineCALL
adr[,x]
SP ← (SP) -L 1,
(SP) ← (PR),
(SP) ← 実効アドレス-
リターン
RETurn from subroutineRET
PR ← ((SP)),
SP ← (SP) +L 1 -
その他
命令 コード オペランド 命令の説明 FRの設定 スーパバイザーコール
SuperVisor CallSVC
adr[,x]
実効アドレスを引数として割出しを行う。実効後のGRとFRは不定となる。
-
ノーオペレーション
No OPerationNOP
何もしない。
- r, r1, r2
-
いずれもGRを示す。指定できるGRはGR0~GR7
- adr
-
アドレスを示す。指定できる値の範囲は0~65535
- x
-
指標レジスタとして用いるGRを示す。指定できるGRはGR1~GR7
- [ ]
-
[ ]内の指定は省略できることを示す。
- ( )
-
( )内のレジスタ又はアドレスに格納されている内容を示す。
- 実効アドレス
-
adrとxの内容との論理加算又はその値が示す番地
- ←
-
演算結果を,左辺のレジスタ又はアドレスに格納することを示す。
- +L,-L
-
論理加算,論理減算を示す。
- FRの設定
-
- ○
-
設定されることを示す。
- ○*1
-
設定されることを示す。ただし,OFには0が設定される。
- ○*2
-
設定されることを示す。ただし,OFにはレジスタから最後に送り出されたビットの値が設定される。
- -
-
実行前の値が保持されることを示す。
-
JIS X 0201 ラテン文字・片仮名用8ビット符号で規定する文字の符号表を使用する。
-
右に符号表の一部を示す。1文字は8ビットからなり,
-
この表にない文字とそのビット構成が必要な場合は,問題中で与える。
| 行\列 | 02 | 03 | 04 | 05 | 06 | 07 |
|---|---|---|---|---|---|---|
0 |
間隔 |
0 |
@ |
P |
` |
p |
1 |
! |
1 |
A |
Q |
a |
q |
2 |
" |
2 |
B |
R |
b |
r |
3 |
# |
3 |
C |
S |
c |
s |
4 |
$ |
4 |
D |
T |
d |
t |
5 |
% |
5 |
E |
U |
e |
t |
6 |
& |
6 |
F |
V |
f |
v |
7 |
' |
7 |
G |
W |
g |
w |
8 |
( |
8 |
H |
X |
h |
x |
9 |
) |
9 |
I |
Y |
i |
y |
10 |
* |
: |
J |
Z |
j |
z |
11 |
+ |
; |
K |
[ |
k |
{ |
12 |
, |
< |
L |
\ |
l |
| |
13 |
_ |
= |
M |
] |
m |
} |
14 |
. |
> |
N |
^ |
n |
~ |
15 |
/ |
? |
O |
_ |
o |
-
CASL2は,COMET2のためのアセンブラ言語である。
-
プログラムは,命令行および注釈行からなる。
-
1命令は1命令行で記述し,次の行へ継続できない。
-
命令行および注釈行は,次に示す記述の形式で,行の1文字目から記述する。
| 行の種類 | 記述の形式 | |
|---|---|---|
命令行 |
オペランドあり |
[ラベル] {空白} {命令コード} {空白} {オペランド} [ {空白} [コメント] ] |
オペランドなし |
[ラベル] {空白} {命令コード} [ {空白} [ {;} [コメント]]] |
|
注釈行 |
[空白] {;} [コメント] |
|
- [ ]
-
[ ]内の指定が省略できることを示す。
- { }
-
{ }内の指定が必須であることを示す。
- ラベル
-
その命令(先頭の語の)アドレスを他の命令やプログラムから参照するための名前である。 長さは1~8文字で,先頭の文字は英大文字でなければならない。 以降の文字は,英大文字または数字のいずれでもよい。 なお,予約後であるGR0~GR7は,使用できない。
- 空白
-
1文字以上の間隔文字の列である。
- 命令コード
-
命令ごとに記述の形式が定義されている。
- オペランド
-
命令ごとに記述の形式が定義されている。
- コメント
-
覚え書きなどの任意の情報であり,処理系で許す任意の文字を書くことができる。
命令は,4種類のアセンブラ命令(START,END,DS,DC),4種類のマクロ命令及び機械語命令からなる。 その仕様を次に示す。
| 命令の種類 | ラベル | 命令コード | オペランド | 機能 |
|---|---|---|---|---|
アセンブラ命令 |
ラベル |
START |
[実行開始番地] |
プログラムの先頭を定義 プログラムの実行開始番地を定義 他のプログラムで参照する入口名を定義 |
END |
プログラムの終わりを明示 |
|||
[ラベル] |
DS |
語数 |
領域を確保 |
|
[ラベル] |
DC |
定数[,定数] … |
定数を定義 |
|
マクロ命令 |
[ラベル] |
IN |
入力領域,入力文字長領域 |
入力装置から文字データを入力 |
[ラベル] |
OUT |
出力領域,出力文字長領域 |
出力装置から文字データを出力 |
|
[ラベル] |
RPUSH |
GRの内容をスタックに格納 |
||
[ラベル] |
RPOP |
スタックの内容をGRに格納 |
||
機械語命令 |
[ラベル] |
(「1.2 命令」を参照) |
||
アセンブラ命令は,アセンブラの制御などを行う。
-
START [実行開始番地]
START命令は,プログラムの先頭を定義する。 実行開始番地は,そのプログラム内で定義されたラベルで指定する。 指定がある場合はその番地から,省略した場合はSTART命令の次の命令から,実行を開始する。 また,この命令につけられたラベルは,他のプログラムから入口名として参照できる。
-
END
END命令は,プログラムの終わりを定義する。
-
DS 語数
DS命令は,指定した語数の領域を確保する。 語数は,10進定数(≧0)で指定する。 語数を0とした場合,領域は確保しないが,ラベルは有効である。
-
DC 定数,[定数] …
DC命令は,定数で指定したデータを(連続する)語に格納する。 定数には,10進定数,16進定数,文字定数,アドレス定数の4種類がある。
定数の種類 書き方 命令の説明 10進定数
n
nで指定した10進数値を,1語の2進数データとして格納する。 ただし,nが-32768~32767の範囲にないときは,その下位16ビットを格納する。
16進定数
#h
hは4けたの16進数(16進数字は0~9,A~F)とする。 hで指定した16進数値を1語の2進数データとして格納する(0000≦h≦FFFF)。
文字定数
'文字列'
文字列の文字数(>0)分の連続する領域を確保し,最初の文字は第1語の下位8ビットに,2番目の文字は第2語の下位8ビットに,…と順次文字データとして格納する。 覚悟の上位8ビットには0のビットが入る。 文字列には,間隔及び任意の図形文字を書くことができる。 ただし,アポストロフィ(')は2個続けて書く。
アドレス定数
ラベル
ラベルに対応するアドレスを1語の2進数データとして格納する。
マクロ命令は,あらかじめ定義された命令群とオペランドの情報によって,目的の機能を果たす命令群を生成する(語数は不定)。
-
IN 入力領域,入力文字長領域
IN 命令は,あらかじめ割り当てた入力装置から,1レコードの文字データを読み込む。
入力領域は,256語長の作業域のラベルであり,この領域の先頭から,1文字を1語に対応させて順次入力される。 レコードの区切り符号(キーボード入力の復帰符号など)は,格納しない。 格納の形式は, DC 命令の文字定数と同じである。 入力データが256文字に満たない場合,入力領域の残りの部分は実行前のデータを保持する。 入力デー タが256文字を超える場合,以降の文字は無視される。
入力文字長領域は,1語長の領域のラベルであり,入力された文字の長さ (≧0)が2進数で格納される。 ファイルの終わり(end of file)を検出した場合は,-1が格納される。 IN命令を実行すると,GRの内容は保存されるが,FRの内容は不定となる。
-
OUT 出力領域,出力文字長領域
OUT命令は,あらかじめ割り当てた出力装置に, 文字データを,1レコードとして書き出す。
出力領域は,出力しようとするデー タが 1文字 1語で格納されている領域のラベルである。 格納の形式は,DC 命令の文字定数と同じであるが,上位8ビットは,OSが無視するので 0 でなくてもよい。
出力文字長領域は, 1 語長の領域のラベルであり,出力しようとする文字の長さ(≧0)を2進数で格納しておく。
OUT 命令を実行すると,GRの内容は保存されるが,FRの内容は不定となる。
-
RPUSH
RPUSH命令は,GRの内容を,GR1,GR2,…,GR7の順序でスタックに格納する。
-
RPOP
RPOP命令は,スタックの内容を順次取り出し,GR7,GR6,…,GR1の順序でGRに格納する。
機械語命令のオペランドは,次の形式で記述する。
r, r1, r2-
GRは記号GR0~GR7で指定する。
x-
指標レジスタとして用いるGRは,記号GR1~GR7で指定する。
adr-
アドレスは,10進定数,16進定数,アドレス定数又はリテラルで指定する。
リテラルは,一つの10進定数,16進定数又は文字定数の前に等号(=)を付けて記述する。 CASL2は等号の後の定数をオペランドとするDC命令を生成し,そのアドレスをadrの値とする。
プログラムの実行に関して,以下の取り決めがある。
-
アセンブラは,未定義ラベル(オペランド欄に記述されたラベルのうち,そのプログラム内で定義されていないラベル)を,他のプログラムの入り口名(START命令のラベル)と解釈する。この場合,アセンブラはアドレスの決定を保留し,その決定をOSに任せる。 OSは,実行に先立って他のプログラムの入り口名との連携処理を行いアドレスを決定する(プログラムの連係)。
-
プログラムは, OS によって起動される。プログラムがロードされる主記憶の領域は不定とするが, プログラム中のラベルに対応するアドレス値は, OS によって実アドレスに補正されるものとする。
-
プログラムの起動時に, OS はプログラム用に十分な容量のスタック領域を確保し,その最後のアドレスに1を加算した値をSPに設定する。
-
OS は, CALL 命令でプログラムに制御を渡す。 プログラムを終了し OS に制御を戻すときは, RET 命令を使用する。
-
IN 命令に対応する入力装置, OUT 命令に対応する出力装置の割当ては,プログラムの実行に先立って利用者が行う。
-
OS は, 入出力装置や媒体による入出力手続の違いを吸収し, システムでの標準の形式及び手続(異常処理を含む)で入出力を行う。 したがって,IN,OUT命令では, 入出力装置の違いを意識する必要はない。
参考資料は,COMET2の理解を助けるため又はCOMET2の処理系作成者に対する便宜のための資料である。 したがって,COMET2,CASL2の仕様に影響を与えるものではない。
命令語の構成は定義しないが,次のような構成を想定する。 ここで,OPの数値は16進表示で示す。
第1語 |
第2語 |
命令語長 |
命令語とアセンブラとの対応 |
||||
OP |
r/r1 |
x/r2 |
adr |
機械語命令 |
意味 |
||
主OP |
副OP |
||||||
0 |
0 |
- |
- |
- |
1 |
|
no operation |
1 |
0 |
2 |
|
load |
|||
1 |
2 |
|
store |
||||
2 |
2 |
|
load address |
||||
4 |
- |
1 |
|
load |
|||
2 |
0 |
2 |
|
add arithmetic |
|||
1 |
2 |
|
subtract arithmetic |
||||
2 |
2 |
|
add logical |
||||
3 |
2 |
|
subtract arithmetic |
||||
4 |
- |
1 |
|
add arithmetic |
|||
5 |
- |
1 |
|
add logical |
|||
6 |
- |
1 |
|
subtract arithmetic |
|||
7 |
- |
1 |
|
subtract logical |
|||
3 |
0 |
2 |
|
and |
|||
1 |
2 |
|
or |
||||
2 |
2 |
|
exclusive or |
||||
4 |
- |
1 |
|
and |
|||
5 |
- |
1 |
|
or |
|||
6 |
- |
1 |
|
exclusive or |
|||
4 |
0 |
2 |
|
compare arithmetic |
|||
1 |
2 |
|
compare logical |
||||
4 |
- |
1 |
|
compare arithmetic |
|||
5 |
- |
1 |
|
compare logical |
|||
5 |
0 |
2 |
|
shift left arithmetic |
|||
1 |
2 |
|
shift right arithmetic |
||||
2 |
2 |
|
shift left logical |
||||
3 |
2 |
|
shift right logical |
||||
6 |
1 |
- |
2 |
|
jump on minus |
||
2 |
- |
2 |
|
jump on non zero |
|||
3 |
- |
2 |
|
jump on zero |
|||
4 |
- |
2 |
|
unconditional jump |
|||
5 |
- |
2 |
|
jump on plus |
|||
6 |
- |
2 |
|
jump on overflow |
|||
7 |
0 |
- |
2 |
|
push |
||
1 |
- |
- |
1 |
|
pop |
||
8 |
0 |
- |
2 |
|
call subroutine |
||
1 |
- |
- |
- |
1 |
|
return from subroutine |
|
9~E |
その他の命令 |
||||||
F |
0 |
- |
2 |
|
supervisor call |
||
マクロ命令が生成する命令群は定義しない(語数不定)が,次の例のような命令群を生成することを想定する。
LABEL IN IBUF,LEN
マクロ生成
LABEL PUSH 0,GR1
PUSH 0,GR2
LAD GR1,IBUF
LAD GR2,LEN
SVC 1
POP GR2
POP GR1
シフト演算において,例えば,1ビットのシフトをした時の動き及びOFの変化は,次の通りである。
-
算術左シフトでは,ビット番号14の値が設定される。
-
算術右シフトでは,ビット番号0の値が設定される。
-
論理左シフトでは,ビット番号15の値が設定される。
-
論理右シフトでは,ビット番号0の値が設定される。
| 命令 | OF | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
実行前 |
a |
b |
c |
d |
e |
f |
g |
h |
i |
j |
k |
l |
n |
m |
o |
p |
|
算術左シフト |
b |
a |
c |
d |
e |
f |
g |
h |
i |
j |
k |
l |
n |
m |
o |
p |
0 |
算術右シフト |
p |
a |
a |
b |
c |
d |
e |
f |
g |
h |
i |
j |
k |
l |
n |
m |
o |
論理左シフト |
a |
b |
c |
d |
e |
f |
g |
h |
i |
j |
k |
l |
n |
m |
o |
p |
0 |
論理右シフト |
p |
0 |
a |
b |
c |
d |
e |
f |
g |
h |
i |
j |
k |
l |
n |
m |
o |
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 ;
-
[[[1]]] IPA. "試験で使用する情報技術に関する用語・プログラミング言語など Ver2.0". 2011年. pp.3-10