• 検索結果がありません。

CASL入門

N/A
N/A
Protected

Academic year: 2021

シェア "CASL入門"

Copied!
11
0
0

読み込み中.... (全文を見る)

全文

(1)

4

44

4章

機械語

機械語

機械語

機械語の

の設計

設計

設計

設計

ここでは、機械語の設計をしてみましょう。 「機械語の設計!」そんなことができるのでしょうか。 情報処理技術者試験の CASLⅡ説明書の参考資料には「命令後の構成は定義しな いが」と記載されています。 アセンブラ言語を理解するためには機械語の理解が非常に大切になりますし、自分 で設計してみれば格段に理解が容易になります。 そこで、「定義されていないなら、定義してしまおう」というわけです。 CASLⅡが動くコンピュータである COMETⅡは仮想のコンピュータですから、どんな設 計をしてもかまわないのです。 しかし、「命令後の構成は定義しない」とする一方で、「次のような構成を想定する」と して、機械語が定義されています。 この章では「自分で最初から設計する」ことで話を進め、最終的には「想定された構 成」になるように考えてみましょう。

(2)

■ 4.1

4.1

4.1

4.1

設計

設計の

設計

設計

の手順

手順

手順

手順

設計といっても、どうすればよいのでしょうか。 その方法を考えてみましょう。 4.1.1 4.1.1 4.1.1 4.1.1 機械語機械語機械語機械語とはとはとはとは それでは、今さらですが、「機械語」とは何でしょうか。 プログラムは、アセンブラ言語であれ、高級言語であれ、ある程度人間が理解できるように書かれま す。 コンピュータは、もちろん理解できませんから、これを機械のわかる言葉(=機械語)に変換(つまり、 アセンブルする、コンパイルする)してからコンピュータに命令を与えることになります。 機械語は、実行時にはコンピュータのメモリーに置かれますから、ビットの集合です。 しかし、このビットの集合は、元はプログラムとして書かれたものですから、逆に機械語から元のプログ ラムが復元できるようになっていなければなりません。 4.1.2 4.1.2 4.1.2 4.1.2 実際実際実際実際にににに設計設計設計設計してみるしてみるしてみる してみる 例えば、 LD GR1,KINGAKU,GR2 という命令を機械語に変換することを考えてみましょう。 この命令を機械語に変換した結果として、(機械語から)次の情報を読み取ることができなければなり ません。 ① 命令(オペレーション)が、LD 命令であること ② 汎用レジスタ GR1 へロードする命令であること ③ ロード元としてアドレスが定義されていること (LD GR1,GR2 というような、ロード元が汎用レジスタではないこと) ④ アドレスとして、KINGAKU が指定されていること ⑤ インデックスとして汎用レジスタ GR2 が指定されていること それでは、順に考えていきましょう。 オペレーション オペレーションオペレーション オペレーション CASLⅡには全部で 38 種類の命令があります(命令の種類は 28 種類ですが、バリエーションを含める と 38 個になります)。 38 種類の命令を区別するためには、少なくとも 6 ビット必要です(6 ビットで 64 種類表現できますが、 5 ビットですと 32 種類しか表現できません)。 従って、命令のオペレーション部分として、最低 6 ビットが必要です。 汎用 汎用汎用 汎用レジスタレジスタレジスタ レジスタ 汎用レジスタは、0~7 までの 8 種類がありますから、最低 3 ビットが必要です。 アドレス アドレスアドレス アドレス アドレスは、0~65535 までありますから、16 ビットが必要です。

(3)

インデックス インデックスインデックス インデックス インデックスも汎用レジスタと同じく 3 ビットが必要です。 ここまで、必要なビット数は、28 ビットになりました。 さて、COMETⅡは 1 語が 16 ビットですから、28 ビットというのはいかにも中途半端です。そこで、少し もったいないのですが、16 ビットを 2 つ、合計 32 ビットを使用することにします。 ここで、再度、命令に必要なビット数を見ますと、アドレス部はそれだけで 16 ビットですので、これを 1 語として、残りの 1 語 16 ビットに他の部分を埋め込むことにします。 他の部分は 12 ビットですから、16 ビットを使うと 4 ビットが余ることになります。 余りは「未使用」でもかまわないのですが、将来拡張されることを考慮して、 ・オペレーションを 8 ビット ・汎用レジスタとインデックスをそれぞれ 4 ビット とします。 そうすれば、将来オペレーションの種類が 256 まで増えても大丈夫ですし、汎用レジスタが 16 個まで 増えても大丈夫です。 ここまでをまとめると次のようになります。 最初の 8 ビット オペレーションの種類 次の 4 ビット 汎用レジスタ 1 語目 最後の 4 ビット インデックスレジスタ 2 語目 アドレス 表 表 表 表 44-44---1111 語語語の語のの割の割り割割りりり振振振り振りりり それでは、 LD LD LD LD r1,r2r1,r2r1,r2 r1,r2 のような、インデックスが無い代わりに汎用レジスタが 2 個あり、アドレスも無い命令はどうなるでしょう か。 このような命令は、 ・アドレス部が不要なので、命令は 1 語となる ・インデックスの代わりに r2 を 1 語目最後の 4 ビットに設定する ということにします。 では、 RET や NOP のように、オペランドの無い命令はどうなるでしょうか。 このような命令は、1 語目の最初の 8 ビットのみであとは不要です。 この場合、命令は 8 ビットで済むのですが、COMETⅡでは番地が 1 語単位にしか割り振られていない ので、残りの 8 ビットをすべてゼロ1とし、命令の長さを 1 語にします。 つまり、全ての命令は 1 語か 2 語になるというわけです。 オペレーション部分は、勝手に(同じ値にならないように)割り振っていけばよいのですが、「想定され 1 特にゼロにする必要は無いが、通常このような場合はゼロにする

(4)

る命令語の構成」にしたがってみましょう。 この構成では、命令後の上位 4 ビットで命令を大きく分類し、下位 4 ビットで細かく分けているようで す。 このようにして全ての命令を設計したのが次の表で、情報処理推進機構のホームページに記載され ています。 1 語目(ビット位置) 命令 オペランド 15~8 7~4 3~0 2 語目 r1,r2 0001 0100 r1 r2 - LD LoaD r,adr[,x] 0001 0000 r x adr ST STore r,adr[,x] 0001 0001 r x adr LAD LoadADdress r,adr[,x] 0001 0010 r x adr

r1,r2 0010 0100 r1 r2 - ADDA ADD Arithmetic

r,adr[,x] 0010 0000 r x adr r1,r2 0010 0110 r1 r2 - ADDL ADD Logical

r,adr[,x] 0010 0010 r x adr r1,r2 0010 0101 r1 r2 - SUBA SUBtract Arithmetic

r,adr[,x] 0010 0001 r x adr r1,r2 0010 0111 r1 r2 - SUBL SUBtract Logical

r,adr[,x] 0010 0011 r x adr r1,r2 0011 0100 r1 r2 - AND AND r,adr[,x] 0011 0000 r x adr r1,r2 0011 0101 r1 r2 - OR OR r,adr[,x] 0011 0001 r x adr r1,r2 0011 0110 r1 r2 - XOR eXclusive OR r,adr[,x] 0011 0010 r x adr r1,r2 0100 0100 r1 r2 - CPA ComPare Arithmetic

r,adr[,x] 0100 0000 r x adr r1,r2 0100 0101 r1 r2 - CPL ComPare Logical

r,adr[,x] 0100 0001 r x adr SLA Shift Left Arithmetic r,adr[,x] 0101 0000 r x adr SRA Shift Right Arithmetic r,adr[,x] 0101 0001 r x adr SLL Shift Left Logical r,adr[,x] 0101 0010 r x adr SRL Shift Right Logical r,adr[,x] 0101 0011 r x adr JPL Jump on PLus adr[,x] 0110 0101 0000 x adr JMI Jump on MInus adr[,x] 0110 0001 0000 x adr JNZ Jump on Not Zero adr[,x] 0110 0010 0000 x adr JZE Jump on ZEro adr[,x] 0110 0011 0000 x adr JOV Jump on OVerflow adr[,x] 0110 0110 0000 x adr JUMP unconditional JUMP adr[,x] 0110 0100 0000 x adr PUSH PUSH adr[,x] 0111 0000 0000 x adr POP POP r 0111 0001 r 0000 - CALL CALL subroutines adr[,x] 1000 0000 0000 x adr RET RETurn from subroutines - 1000 0001 0000 0000 - SVC SuperViser Call adr[,x] 1111 0000 0000 x adr NOP No OPeration - 0000 0000 0000 0000 - 表 表 表 表 44-44---2222 機械語一覧機械語一覧機械語一覧(機械語一覧(((出典出典出典出典はは「はは「「「情報処理推進機構情報処理推進機構情報処理推進機構ホームページ情報処理推進機構ホームページホームページホームページ」)」)」)」) 4.1.3 4.1.3 4.1.3 4.1.3 宿題宿題宿題宿題のののの答答答答 それではここで、宿題の回答をしておきましょう。 宿題 宿題 宿題 宿題 汎用レジスタ 0 は、なぜインデックスレジスタとして使用できないのか。

(5)

命令の説明で書いたように、命令を構成する 16 ビットのうちの最後の 4 ビットでインデックスレジスタと して使用する汎用レジスタの番号を設定します。 ただし、インデックスレジスタが指定されていない場合はどうすれば良いでしょうか。 通常は、ゼロを設定しておきます。 すると、「インデックスレジスタとして汎用レジスタ 0 が指定された」のか、「インデックスが指定されてい ないのか」区別がつかなくなります。 そこで、「エイッ」とばかり、「汎用レジスタ 0 はインデックスとして使用できない1」としたのです。 この設計では、汎用レジスタが 7 個しかないのにレジスタ設定部として 4 ビットを確保していますので、 4 ビット中の最上位ビットは常に「0」となります。 ですから、たとえば「最上位ビットが 1 のときはインデックスを使用していない」とでも定義しておけばよ いのですが、将来汎用レジスタが 16 個に増えたりしたときには、この手は使えなくなりますので、「汎 用レジスタ 0 はインデックスとして使用できない」と決めたのです。

■ 4.2

4.2

4.2

4.2

アセンブル

アセンブルの

アセンブル

アセンブル

の仕組

仕組

仕組み

仕組

それではここで、定義した機械語を使って、実際にアセンブラ2がどのようにソースプログラムから機械 語を作り出していくかを見てみましょう。 4.2.1 4.2.1 4.2.1 4.2.1 プログラムプログラムプログラムプログラム例例例例 例として、次のようなプログラムを紙上でアセンブルしてみましょう。 このプログラムは、「SUCHI1」にある値と「SUCHI2」にある値を加算して、結果を「KOTAE」へ格納すると いうもので、非常に単純なプログラムです。 加算は、一旦 SUCHI1 の内容を汎用レジスタ 1 へ持ってきて、そこへ SUCHI2 の内容を加算し、結果を 16 進の X’F0F0’で論理積をとって KOTAE へ格納します。 論理積をとるのは、あまり意味はないのですが、リテラルの説明のためにあえてこの命令を入れまし た。 くどいようですが、このプログラム自体は、特に何をするというものでもなく、単に命令を並べただえで すので、「どんな結果になるのか、何をしようとしているのか」などを考えないでください。 SAMPLE START ;① LD GR1,SUCHI1 ;② ADDA GR1,SUCHI2 ;③ AND GR1,=HF0F0 ;④ ST GR1,KOTAE ;⑤ RET ;⑥ SUCHI1 DC 200 ;⑦ SUCHI2 DC 300 ;⑧ KOTAE DS 1 ;⑨ END ;⑩ 1 IBM メインフレームのアセンブラも同様です。 2 くどいようですが、「アセンブラ」が「アセンブラ言語で書かれたソースプログラム」を機械語に変換すること(アセン ブルすること)を「アセンブリ」と言います。

(6)

以下、順に説明します。 説明 ① プログラム名を「SAMPLE」としています。 ② SUCHI1 の内容を GR1 へロードします。 SUCHI1 は⑥で「200」と定義されていますので、汎用レジスタ 1 には(命令実行前の無いよう に関係なく)200 が格納されます。 SUCHI1 の内容は変わりません。 ③ GR1 に SUCHI2 の内容を加算します。 SUCHI2 は⑦で「300」と定義されていますので、汎用レジスタ 1 には、200+300=500 が設定さ れます。 ④ 結果を 16 進の X’F0F0’で論理積をとります。 ⑤ 加算結果を KOTAE へ格納します。 命令実行前の KOTAE の内容が何であれ、無視されて加算結果が格納されます。 ⑥ プログラムを終了して制御を OS へ返します。 ⑦ SUCHI1 という領域を 1 語確保し、初期値を 200 とします。 ⑧ SUCHI2 という領域を 1 語確保し、初期値を 300 とします。 ⑨ 加算結果を格納する領域を 1 語確保し、その領域に「KOTAE」という名前をつけています。 初期値は未定です(何がはいっているかわかりません)。 ⑩ プログラムの終わりを示します 4.2.2 4.2.2 4.2.2 4.2.2 アセンブルアセンブルアセンブルアセンブル それでは、上記プログラムをアセンブルしてみましょう。 アセンブルは、2つのフェーズに分けて行います。 まず、第 1 フェーズです。 上記①は機械語の命令ではありませんから、変換しません。 前に設計した、機械語一覧によれば、②は次のようになります。 1 語目の 15~8 ビット目 0001 0010 これが、「機械語で LD 命令になります 1 語目の 7~4 ビット目 汎用レジスタは 1 を使用しますので、0001 1 語目の 3~0 ビット目 インデックスは使用していませんので、0000 2 語目は、まだ分かりませんので、仮に「?」としておきましょう。 ここまでで、1 語目は、0000 0010 0001 0000 となります。2 進数では見にくいので、16 進表示にする と X’1210’になります。 これで命令ひとつが機械語になったわけですが(まだ、2 語目は?のままですが)、プログラムは 0 番 地から始まるとしてで、 0 番地 X’0000’ 1 番地 X’????’ となります。 以下、同様に⑥までアセンブルします。 ただし、⑥のように 1 語だけで構成される命令もあります。 では、⑦はどうなるでしょうか。 これは、単に「200」という数字です。200 は 10 進数ですので、これを 16 進数に変換して、X’00C8’ になります。

(7)

同様に、⑧は X’012C’ですね。 では、⑨はどうでしょうか。これは、単に領域を確保するだけで、初期値は定義されていないのですが、 機械語に変換するとき困りますので、X’0000’とでもしておきましょう。 ここまでの変換結果をまとめてみます。 1 語目 ビット表現 ラベル オペレーション オペランド アドレス 15~8 7~4 3~0 16 進 2 語目 ① SAMPLE START 100 ② LD GR1,SUCHI1 0 0001 0010 0001 0000 1210 ?1 ③ ADDA GR1,SUCHI2 2 0010 0000 0001 0000 2010 ?2 ④ AND GR1,=HF0F0 4 0011 0000 0001 0000 3010 ?4 ⑤ ST GR1,KOTAE 6 0001 0001 0001 0000 1110 ?3 ⑥ RET 8 1000 0001 0000 0000 8100 (なし) ⑦ SUCHI1 DC 200 9 0000000011001000 00C8 (なし) ⑧ SUCHI2 DC 300 10 0000000100101100 012C (なし) ⑨ KOTAE DS 1 11 0000000000000000 0000 (なし) 表 表 表 表 4444----3333 アセンブルアセンブルアセンブルアセンブル結果結果(結果結果(((フェーズフェーズフェーズフェーズ1111)))) 次に、フェーズ 2 です。 フェーズ 2 では、フェーズ 1 で「とりあえず?」にしておいたところを解決します。 上の表では 3 箇所(?1、?2、?3および?4)の未解決部分があります。 まず、?1ですが、これは「SUCHI1 のアドレスが分からないので、とりあえず?にした」というものです。 ところがフェーズ 1 が終わった段階で、上表を見ると SUCHI1 のアドレスは「9 番地」に決定しています ので、これを 16 進に変換して、X‘0009’がアドレスになります。 同様に、?2と?3はそれぞれ X‘000A‘と X’000B’になります。 最後に、?4が残りました。 これはリテラルですので、プログラムに存在しませんから自動で作り出してあげる必要があります。 作り出す場所は「END 命令の直前」と定義されていますから、直前に DC #F0F0 という命令を作り出します。 このアドレスは、最後(⑨)のアドレスの次になります。

(8)

これらの値を上表に埋め込むと、次のようになります。 1 語目 ビット表現 ラベル オ ヘ ゚ レ ー ション オペランド アドレ ス 15~8 7~4 3~0 16 進 2 語目 ① SAMPLE START 100 ② LD GR1,SUCHI1 0 0001 0010 0001 0000 1210 0009 ③ ADDA GR1,SUCHI2 2 0010 0000 0001 0000 2010 000A ④ AND GR1,=HF0F0 4 0011 0000 0001 0000 3010 000C ⑤ ST GR1,KOTAE 6 0001 0001 0001 0000 1110 000B ⑥ RET 8 1000 0001 0000 0000 8100 (なし) ⑦ SUCHI1 DC 200 9 0000000011001000 00C8 (なし) ⑧ SUCHI2 DC 300 10 0000000100101100 012C (なし) ⑨ KOTAE DS 1 11 0000000000000000 0000 (なし) 12 1111000011110000 F0F0 表 表 表 表 4444----4444 アセンブルアセンブルアセンブルアセンブル結果結果(結果結果(((フェーズフェーズフェーズフェーズ2222)))) これでアセンブルが全て終了しました。 完成した表から、機械語部分のみをとりだすと、16 進で 1210 0009 2010 000A 3010 000C 1110 000B 8100 00C8 012C 0000 F0F0 となります。 これが、このプログラムを機械語に変換した結果なのです。

■ 4.3

4.3

4.3

4.3

機械語

機械語での

機械語

機械語

での

での

でのコーディング

コーディング

コーディング

コーディング

それでは、このプログラムを次のようにコーディングしたらどうなるでしょうか。 SAMPLE START 100 ;① DC #0310,#0009 ;② DC #0B10,#000A ;③ DC #1910,#000C ;④ DC #0410,#000B ;⑤ DC #6600 ;⑥ DC 200 ;⑦ DC 300 ;⑧ DS 1 ;⑨ DC #F0F0 ; END ;⑩ なんだかまったく分からないプログラムなのですが、機械語部分は変わりませんから立派に動作しそう ですが、実は動かないのです。理由は後で。

(9)

ところで、このプログラムに「RET」命令が無かったらどうなるでしょうか。 コンピュータは「ST」命令の次にも命令があると思って、次の命令の実行にかかります。 次の命令(と判断したもの)は、16 進で X'00C8'ですから、命令のオペレーション部分は、ビット で'00000000'となります。 ところがこんな命令はありませんから、エラーとなり、実行が止まってしまいます。 しかし、もし偶然に「先頭へ戻る(ジャンプする)」というような命令になっていたらどうなるでしょう か。 このプログラムは先頭へ戻って、また同じ事を繰り返しますから、永久に止まりません。

■ 4.4

4.4

4.4

4.4

アブソリュートターム

アブソリュートタームと

アブソリュートターム

アブソリュートターム

とリロケータブルターム

リロケータブルターム

リロケータブルターム

リロケータブルターム

今、次のようなプログラムを作成し、実行することを考えてみます。 SAMPLE START LAD GR1,1000 ST GR1,KINGAKU RET KINGAKU DS 1 END これをアセンブルして機械語に変換すると次のようになります。 アドレス 命令 1 命令 2 コーディング ① SAMPLE START ② 0000 1210 03E8 LAD GR1,1000 ③ 0002 1110 0005 ST GR1,KINGAKU ④ 0004 8100 RET ⑤ 0005 0000 KINGAKU DS 1 表 表 表 表 4444----5555 アセンブルアセンブル直後アセンブルアセンブル直後直後の直後のの機械語の機械語機械語機械語 CASLⅡの説明書によれば、 プログラムは OS によって起動される。プログラムがロードされる主記憶の領域は不定であるが、 プログラムのラベルに対するアドレス値は、OS によって実アドレスに補正されるものとする。 とあります。 つまり、プログラムをアセンブルしたときは、そのプログラムは「0 番地」から始まるようにアセンブルさ れるが、実行時には 0 番地から始まるわけではないということです。 このとき、OS が「ラベルに対するアドレス値」を補正します。 上記プログラムでは、③の「命令 2」が「ラベルに対するアドレス値」ですので、この値が補正されるこ とになります。 なお、②の「命令 2」は「ラベルに対するアドレス値」ではないので、補正対象にはなりません。 例えば、このプログラムが 100 番地(16 進で X’0064’)からロードされたとします。 すると「ラベルに対するアドレス値」を補正(100 を加える)されると、次のようになります。

(10)

アドレス 命令 1 命令 2 コーディング ① SAMPLE START ② 0064 1210 03E8 LAD GR1,1000 ③ 0066 1110 0069 ST GR1,KINGAKU ④ 0068 8100 RET ⑤ 0069 0000 KINGAKU DS 1 表 表 表 表 44-44---6666 補正補正された補正補正されたされた機械語された機械語機械語 機械語 では、仮に「補正されない」とするとどうなるでしょうか。 アドレス 命令 1 命令 2 コーディング ① SAMPLE START ② 0064 1210 03E8 LAD GR1,1000 ③ 0066 1110 0005 ST GR1,KINGAKU ④ 0068 8100 RET ⑤ 0069 0000 KINGAKU DS 1 表 表 表 表 44-44---7777 補正補正されない補正補正されないされない機械語されない機械語機械語機械語 本来は X’0069’番地へストアーしなければならないのに、X’0005’番地へストアーすることに なってしまいます。 X’0005’番地はこのプログラムの「外」ですので、正しく動作しないのみならず、途中で異常終了 する可能性があります。 ところで、②はなぜ「補正」されないのでしょうか。②も③も実効アドレスのはずです。 仮に「補正した」とした場合、次のようになります。 アドレス 命令 1 命令 2 コーディング ① SAMPLE START ② 0064 1210 044C LAD GR1,1000 ③ 0066 1110 0069 ST GR1,KINGAKU ④ 0068 8100 RET ⑤ 0069 0000 KINGAKU DS 1 表 表 表 表 4444----8888 不必要不必要不必要に不必要に補正にに補正補正補正されたされたされたされた機械語機械語機械語機械語 補正された結果、X’044C’(=1100)となり、KINGAKU には 1000 ではなく、1100 がストアーされてしま います。 このように、プログラムがロードされる時点で、アドレスが補正されるものとされないものがあります。 「補正される」アドレス(項)を「リロケータブル・ターム」といい、「補正されない」項を「アブソリュート・ ターム」といいます。 一般に、ラベルはリロケータブルタームで、数値そのものはアブソリュートタームになります。

(11)

ここで「4.3」の宿題の答えを出しておきます。 宿題は、 「なんだかまったく分からないプログラムなのですが、機械語部分は変わりませんから立派に 動作しそうですが、実は動かないのです。理由は後で。」 でした。 もうお分かりでしょうか。 このプログラムは、すべてのアドレス部がアブソリュートタームとして定義されます。したがっ て、このプログラムが「0 番地」からロードされれば正しく動作しますが、0 番地以外からロード された場合、リロケータブルタームの再配置が行われません(アブソリュートタームばかりです から)ので、正しく動作しないということになります。

参照

関連したドキュメント

1-1 睡眠習慣データの基礎集計 ……… p.4-p.9 1-2 学習習慣データの基礎集計 ……… p.10-p.12 1-3 デジタル機器の活用習慣データの基礎集計………

本手順書は複数拠点をアグレッシブモードの IPsec-VPN を用いて FortiGate を VPN

工場設備の計測装置(燃料ガス発熱量計)と表示装置(新たに設置した燃料ガス 発熱量計)における燃料ガス発熱量を比較した結果を図 4-2-1-5 に示す。図

○前回会議において、北区のコミュニティバス導入地域の優先順位の設定方

現状では、3次元CAD等を利用して機器配置設計・配 管設計を行い、床面のコンクリート打設時期までにファ

「JSME S NC-1 発電用原子力設備規格 設計・建設規格」 (以下, 「設計・建設規格」とい う。

○池本委員 事業計画について教えていただきたいのですが、12 ページの表 4-3 を見ます と、破砕処理施設は既存施設が 1 時間当たり 60t に対して、新施設は

この設備によって、常時監視を 1~3 号機の全てに対して実施する計画である。連続監