アセンブリ言語 CASL2 に対応する機械語一覧
アセンブリ言語CASL2の機械語ってどうなっているか気にりませんか?実はCASL2にも対応した機械語が存在します。
今回はCASL2に対応するコンピューター(COMET2)の機械語はどんな数値になっているのか見てみたいと思います。
COMET2の機械語
COMET2の機械語は、1語長と2語長の命令の2種類があります。
- 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進数) |
GR0 | 0000 |
GR1 | 0001 |
GR2 | 0010 |
GR3 | 0011 |
GR4 | 0100 |
GR5 | 0101 |
GR6 | 0110 |
GR7 | 0111 |
このように、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進数) |
GR0 | 0000 |
GR1 | 0001 |
GR2 | 0010 |
GR3 | 0011 |
GR4 | 0100 |
GR5 | 0101 |
GR6 | 0110 |
GR7 | 0111 |
ということは、GR0~GR7に加えて、以下のようにレジスタを増設できるということになります。
汎用レジスタ名 | 機械語(2進数) |
GR8 | 1000 |
GR9 | 1001 |
GR10 | 1010 |
GR11 | 1011 |
GR12 | 1100 |
GR13 | 1101 |
GR14 | 1110 |
GR15 | 1111 |
このように、汎用レジスタを追加しても仕様に支障を来たさない範囲で改良できますよね。
具体的な機械語
それではCOMET2の機械語を具体的に見てみたいと思います。
【オペレーションコード】
ニーモニック | 機械語(2進数) | 機械語(16進数) | 語数 |
転送命令 | |||
LD | 0001 0100 | 14 | 1 |
0001 0000 | 10 | 2 | |
LAD | 0001 0010 | 12 | 2 |
ST | 0001 0001 | 11 | 2 |
加減算命令 | |||
ADDA | 0010 0100 | 24 | 1 |
0010 0000 | 20 | 2 | |
ADDL | 0010 0110 | 26 | 1 |
0010 0010 | 22 | 2 | |
SUBA | 0010 0101 | 25 | 1 |
0010 0001 | 21 | 2 | |
SUBL | 0010 0111 | 27 | 1 |
0010 0011 | 23 | 2 | |
論理演算命令 | |||
AND | 0011 0100 | 34 | 1 |
0011 0000 | 30 | 2 | |
OR | 0011 0101 | 35 | 1 |
0011 0001 | 31 | 2 | |
XOR | 0011 0110 | 36 | 1 |
0011 0010 | 32 | 2 | |
比較命令 | |||
CPA | 0100 0100 | 44 | 1 |
0100 0000 | 40 | 2 | |
CPL | 0100 0101 | 45 | 1 |
0100 0001 | 41 | 2 | |
シフト演算命令 | |||
SLA | 0101 0000 | 50 | 2 |
SRA | 0101 0001 | 51 | 2 |
SLL | 0101 0010 | 52 | 2 |
SRL | 0101 0011 | 53 | 2 |
分岐命令 | |||
JMI | 0110 0001 | 61 | 2 |
JNZ | 0110 0010 | 62 | 2 |
JZE | 0110 0011 | 63 | 2 |
JUMP | 0110 0100 | 64 | 2 |
JPL | 0110 0101 | 65 | 2 |
JOV | 0110 0110 | 66 | 2 |
スタック操作命令 | |||
PUSH | 0111 0000 | 70 | 2 |
POP | 0111 0001 | 71 | 1 |
その他の命令 | |||
CALL | 1000 0000 | 80 | 2 |
RET | 1000 0001 | 81 | 1 |
SVC | 1111 0000 | F0 | 2 |
NOP | 0000 0000 | 00 | 1 |
語数によって、同じニーモニックでも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, GR1 | 0001 0100 0000 0001 | 1401 |
LD GR0, 10, GR1 | 0001 0000 0000 0001 | 1001 |
0000 0000 0000 1010 | 000A | |
LAD GR3, 5 | 0001 0010 0011 0000 | 1230 |
0000 0000 0000 0101 | 0005 | |
ADDA GR1, GR2 | 0010 0100 0001 0010 | 2412 |
ADDA GR0, 100 | 0010 0000 0000 0000 | 2000 |
0000 0000 0110 0100 | 0064 | |
SUBL GR1, GR4 | 0010 0111 0001 0100 | 2714 |
SUBL GR1, =1 | 0010 0011 0001 0000 | 2310 |
不定 | 不定 | |
SLA GR3, 1, GR2 | 0101 0000 0011 0010 | 5032 |
0000 0000 0000 0001 | 0001 |
上記の「SUBL GR1, =1」はリテラルの場合の機械語です。
リテラルの場合、アドレスはコンピューター(COMET2)によって決定されるので具体的なアドレスをニーモニックから読み取ることはできません。
そのため「不定」と記してあります。
さいごに
この記事を作成するに当たり以下のサイト様を参考にさせていただきました。
「WEB教材・プログラミング言語入門 <アセンブラ言語CASLⅡってなに?> - 1-24 機械語の形式(1)」
機械語の仕様において1語または2語の両方が存在することの意味が明快に解説されていました。
こちらも参考になさってください。
また、機械語の例として以下のシミュレータで命令を実行し参考にしました。
こちらも、テキトーな命令を記述し実行すると、実行中にレジスタやメモリの値(機械語)を見ることができます。
それでは次回にお会いしましょう。