ニッシー
1990年生まれ
血液型 O型

こんにちは。ITブログアルケーナム管理人のニッシーです。

詳細プロフィールへ

お問い合わせへ






2019-02-05

CASL2に対応する機械語はどうなっているのか?




アセンブリ言語のCASL2の仕様を確認しても、ニーモニックに対応する機械語の詳細を現在では確認することはできません。


今回は、CASL2に対応する機械語はどんな数値になっているのか、見てみたいと思います。










COMET2の機械語



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


※ 1語 = 16ビット


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


制御方式は逐次制御で、命令語は1語長又は2語長である。


出典:IPA, 基本情報技術者試験午後問題, 2017, P.70


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


以前は、機械語の仕様を「IPAの公式サイト」でも確認できたはずですが、現在では見つけることができませんでした。



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


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


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



例1:LDの命令長


① LD GR0, GR1・・・1語長

② LD GR0, 10・・・2語長

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


ということがいえます。


これは、LDに限らず、ADDAやCPA命令などにおいても同じです。



は、「汎用レジスタ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 を指標レジスタとして使えない理由



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


表1.【汎用レジスタの区別】
汎用レジスタ名機械語(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


ということは、上記にプラスして以下のようにレジスタを増設できるということになります。


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


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





機械語の具体的な値



機械語の具体的な数値について見てみたいと思います。


表2.【オペレーションコード】
ニーモニック機械語(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)



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



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


表3.【ニーモニックと機械語の対応】
ニーモニック機械語(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


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


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


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







機械語は自由に決めることができる



機械語は、前述した具体的な値でなくても、CPU設計者が好きに決めることができます。


予め機械語の数値を決めてから、その機械語で動作するようにCPUを後から設計すればいいからです。


機械語というと難しそうに聞こえますが、難しく考える必要はありません。


具体的なハードウェアの設計方法は知らん ^^;





最後に



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


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


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


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



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


キャッスルシミュレータ


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


こちらも、大変参考になります。



機械語の具体的な数字自体は問題ではなく、機械語の数字の並び方にこだわらなくても自由に数字の並びを決めて設計することができたりします。


テキトーに決めた数字の羅列(機械語)を基に、後からCPUが動作するように回路を設計すればいいわけですからね。


それでは、続きはまた次回にご期待を!









プロフィール

ニッシー
1990年生まれ
血液型 O型

こんにちは。ITブログアルケーナム管理人のニッシーです。

詳細プロフィールへ

お問い合わせへ