• icon-clock
  • icon-undo

アセンブリ言語 CASL2 に対応する機械語一覧

アセンブリ言語 CASL2 に対応する機械語一覧

アセンブリ言語CASL2の機械語ってどうなっているか気にりませんか?実はCASL2にも対応した機械語が存在します。

今回はCASL2に対応するコンピューター(COMET2)の機械語はどんな数値になっているのか見てみたいと思います。




COMET2の機械語

COMET2の機械語は、1語長と2語長の命令の2種類があります。

  1. 1語 = 16ビット


基本情報技術者試験午後問題の70~75ページにある「アセンブラ言語の仕様」を見ると、70ページに機械語の長さに関する記述があります。

制御方式は逐次制御で、命令語は1語長又は2語長である。
出典:IPA, 基本情報技術者試験午後問題, 2017, P.70


ただし、COMET2で使用される具体的な機械語を確認することはできません。

この記述によると、命令は、1語または2語の、2通りの場合があるということが判ります。

なぜ、1語長と2語長の命令の2種類があるかというと、メモリのデータを用いる場合レジスタ間でのみデータを用いる場合があるためです。

「LD命令」を例に具体的に見てみます。


例1: LDの命令長

① LD GR0, GR1・・・1語長

② LD GR0, 10・・・2語長

③ LD GR0, 0, GR1・・・2語長


ということがいえます。

これはLDに限らず、他の命令においても同じです。

は、「汎用レジスタGR0に、汎用レジスタGR1の値を転送せよ」という意味で、メモリのデータは使用しない内容になっています。

は、「汎用レジスタGR0に、メモリ10番地の値を転送せよ」という意味で、メモリのデータをレジスタに転送しています。

は、「汎用レジスタGR0に、メモリ『GR1の値 + 0番地』の値を転送せよ」という意味で、指標修飾によりメモリのデータをレジスタに転送しています。



このようにデータの扱いにおいてメモリを介するか否かで命令の長さが変化しています。


1語長の場合

1語長の命令は、機械語レベルでは以下のような構成になっています。

図1: 1語長の命令機械語

1語長の機械語は、オペレーションコードが8ビット、第1オペランドが4ビット、そして、第2オペランドも4ビットという構成になっています。

具体的に、LD命令を例に見てみます。


図2: LD命令の1語長の機械語機械語

図2中の「0001 0100 0000 0001」は、「LD GR0, GR1」に対応する機械語です。

機械語の具体的な数値については後述します。

このように、機械語とは、アセンブリ言語(ニーモニック)に対応するものであることが分かると思います。


2語長の場合


図3:2語長の命令

2語長の機械語は、オペレーションコードが8ビット、第1オペランドが4ビット、第2オペランドが16ビット、そして、第3オペランドが4ビットという構成になっています。

こちらも、LD命令を例に見てみます。

図4: LD命令の2語長の機械語(指標修飾)

次に、指標修飾を使用しない場合を見てみます。

図5: LD命令の2語長の機械語(指標修飾なし)

第3オペランドが 0((0000)2のとき、「指標レジスタの指定なし」という意味になります。

実は、この機械語の仕様が、CASL2において指標レジスタとして汎用レジスタ「GR0」を使用できない理由です。

詳細は次の章で述べます。


汎用レジスタ GR0 を指標レジスタとして使えない理由

機械語において汎用レジスタを区別する場合、単純な番号を振って実現しています。

【汎用レジスタの区別】
汎用レジスタ名機械語(2進数)
GR00000
GR10001
GR20010
GR30011
GR40100
GR50101
GR60110
GR70111

このように、GR1なら1(=(0001)2を、GR7なら7(=(0111)2が対応しています。

これによって、汎用レジスタの番号を区別しています。

図6: LD命令の2語長の機械語(指標修飾なし)

図6のように、汎用レジスタを指標レジスタとして指定しない場合、第3オペランド0(=(0000)2)で表すことで実現しています。

汎用レジスタGR0もオール0(=(0000)2)で区別しているため、指標レジスタを指定していないのか汎用レジスタGR0なのか区別がつかなくなってしまうため、GR0は指標修飾に使用できないということになります。

× LD GR0, 10, GR0

指標レジスタにGR0は使用できません。


汎用レジスタは GR15 まで増設できる

汎用レジスタの識別値を見ると、4ビットであり、GR0~GR7までで先頭の1ビットが余っていることが分かると思います。

汎用レジスタ名機械語(2進数)
GR00000
GR10001
GR20010
GR30011
GR40100
GR50101
GR60110
GR70111

ということは、GR0~GR7に加えて、以下のようにレジスタを増設できるということになります。

汎用レジスタ名機械語(2進数)
GR81000
GR91001
GR101010
GR111011
GR121100
GR131101
GR141110
GR151111

このように、汎用レジスタを追加しても仕様に支障を来たさない範囲で改良できますよね。



具体的な機械語

それではCOMET2の機械語を具体的に見てみたいと思います。


【オペレーションコード】
ニーモニック機械語(2進数)機械語(16進数)語数
転送命令
LD0001 0100141
0001 0000102
LAD0001 0010122
ST0001 0001112
加減算命令
ADDA0010 0100241
0010 0000202
ADDL0010 0110261
0010 0010222
SUBA0010 0101251
0010 0001212
SUBL0010 0111271
0010 0011232
論理演算命令
AND0011 0100341
0011 0000302
OR0011 0101351
0011 0001312
XOR0011 0110361
0011 0010322
比較命令
CPA0100 0100441
0100 0000402
CPL0100 0101451
0100 0001412
シフト演算命令
SLA0101 0000502
SRA0101 0001512
SLL0101 0010522
SRL0101 0011532
分岐命令
JMI0110 0001612
JNZ0110 0010622
JZE0110 0011632
JUMP0110 0100642
JPL0110 0101652
JOV0110 0110662
スタック操作命令
PUSH0111 0000702
POP0111 0001711
その他の命令
CALL1000 0000802
RET1000 0001811
SVC1111 0000F02
NOP0000 0000001

語数によって、同じニーモニックでも2種類の機械語が用意されています。

  • 1語・・・レジスタ間のデータのやり取りをする場合
  • 2語・・・レジスタとメモリ間のデータのやり取りをする場合


命令長の違いで、「レジスタ~レジスタ」と「レジスタ~メモリ」の違いを区別しています。

また、このオペレーションコードの機械語を見てみると、上位4ビットが命令の種類を表していることが分かります。

  • 転送命令:1 = (0001)2
  • 加減算命令:2 = (0010)2
  • 論理演算命令:3 = (0011)2
  • 比較命令:4 = (0100)2
  • シフト演算命令:5 = (0101)2
  • 分岐命令:6 = (0110)2
  • スタック操作命令:7 = (0111)2


ニーモニックと機械語の対応例

オペランドも併せて、ニーモニックと機械語を対応させて見てみたいと思います。

【ニーモニックと機械語の対応】
ニーモニック機械語(2進数)機械語(16進数)
LD GR0, GR10001 0100 0000 00011401
LD GR0, 10, GR10001 0000 0000 00011001
0000 0000 0000 1010000A
LAD GR3, 50001 0010 0011 00001230
0000 0000 0000 01010005
ADDA GR1, GR20010 0100 0001 00102412
ADDA GR0, 1000010 0000 0000 00002000
0000 0000 0110 01000064
SUBL GR1, GR40010 0111 0001 01002714
SUBL GR1, =10010 0011 0001 00002310
不定不定
SLA GR3, 1, GR20101 0000 0011 00105032
0000 0000 0000 00010001


上記のSUBL GR1, =1」はリテラルの場合の機械語です。

リテラルの場合、アドレスはコンピューター(COMET2)によって決定されるので具体的なアドレスをニーモニックから読み取ることはできません。

そのため「不定」と記してあります。



さいごに

この記事を作成するに当たり以下のサイト様を参考にさせていただきました。

WEB教材・プログラミング言語入門 <アセンブラ言語CASLⅡってなに?> - 1-24 機械語の形式(1)

機械語の仕様において1語または2語の両方が存在することの意味が明快に解説されていました。

こちらも参考になさってください。

また、機械語の例として以下のシミュレータで命令を実行し参考にしました。

キャッスルシミュレータ

こちらも、テキトーな命令を記述し実行すると、実行中にレジスタやメモリの値(機械語)を見ることができます。

それでは次回にお会いしましょう。