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

CASL入門

N/A
N/A
Protected

Academic year: 2021

シェア "CASL入門"

Copied!
9
0
0

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

全文

(1)

3

33

3章

アセンブラ

アセンブラ

アセンブラ

アセンブラ言語

言語

言語 CASL

言語

CASL

CASL

CASLⅡ

Ⅱの

の仕様

仕様

仕様

仕様

ここでは、アセンブラ言語の説明をします。 「ちょっと待て、第 2 章の話は、アセンブラ言語の話ではなかったのか」と思われた 人はいませんでしょうか。 一般に、「プログラム」という場合、その構成要素は次の 3 つに分かれます。 ① 動作のための命令・・・加算、減算、比較などの命令 ② 領域確保や定数定義など、動作しない部分 ③ プログラム名の定義など このうち、①が第 3 章で説明した部分にあたります。この章では②と③について説 明します。

(2)

■ 3.1

3.1

3.1

3.1

言語

言語の

言語

言語

の仕様

仕様

仕様

仕様

コーディングの仕方についての説明です。 (1) CASLⅡは COMETⅡのためのアセンブラ言語である。 これは「あたりまえ」の話のようですが・・・ COBOL や C、Java といった、いわゆる「高級言語」は、特に「どのコンピュータのため」ということが決 まっていません。それぞれのコンピュータ用のコンパイラがありますので、多くのコンピュータで使 用できます。 ただし、アセンブラ言語はコンピュータに対応したアセンブラ言語があり、一般的に他のコン ピュータでは使用できない1「特有の」言語ですので、このような表現になっています。 (2) プログラムは、命令行および注釈行からなる。 コーディングにあたっては、命令の行と注釈(コメント)の行があるということです。これについては、 (4)でも述べます。 (3) 1 命令は 1 命令行で記述し、次の行へ継続できない。 高級言語では、あまり「行」という概念がありません。1 行に複数の命令を書いたり、ひとつの命令 を複数行にわたって書いたりできます。 CASLⅡでは、このようなことは認められておらず、1 行にひとつの命令しか書けないということで す。 多くの他のアセンブラ言語も、このような仕様になっているようです。 (4) 命令行および注釈行は、次に示す記述の形式で、行の 1 文字目から記述する。 ここでは、「オペランド」という言葉が出てきますので、これらの用語について説明します。 プログラム 1 行は、次の 4 つの部分からなっています。 名称 必須 説明 1 ラベル 変数名やジャンプ命令のとび先など 2 オペレーション 必須 命令そのもの 3 オペランド 命令を補助する部分 4 コメント 注釈 表 表 表 表 33-33---1111 命令命令の命令命令のの構成の構成構成構成 以下、順に説明します。 ラベル ラベル ラベル ラベル 1 カラム目から記述します。 オペレーション オペレーション オペレーション オペレーション ラベルがある場合は、ラベルの後に 1 桁以上の空白をおいて記述します。 ラベルが無い場合は、2 カラム目以降から記述します。

(3)

オペランド オペランド オペランド オペランド オペレーションに続いて、1 桁以上の空白をおいて記述します。 通常の命令ではオペランドがありますが、RET 命令など、無いものもあります。 オペランド部はさらに最大3つの部分から構成されています。 たとえば、 LD GR1,KINGAKU,GR2 という命令の場合、オペランド部は「GR1,KINGAKU,GR2」ですが、この中の「KINGAKU」部分を「ディ スプレースメント」といいます。 コメント コメント コメント コメント オペランドがある場合はオペランドの後に 1 桁以上の空白をおいて、オペランドが無い場合はオ ペレーションの後に 1 桁以上の空白をおいて、さらに「;」を書いてから、そのあとに記述します。 整理しましょう。今、次のような命令があった場合、各部は下の表のようになります。

LABEL1 LD GR1,KINGAKU,GR2 ;COMMENT OF LD

ラベル LABEL1 オペレーション LD レジスタ GR1 ディスプレースメント KINGAKU オペランド インデックス GR2 コメント COMMENT OF LD 表 表 表 表 33-33---2222 命令命令命令命令のの詳細のの詳細詳細な詳細なな構成な構成構成構成

■ 3.2

3.2

3.2

3.2

アセンブラ

アセンブラ命令

アセンブラ

アセンブラ

命令

命令

命令

アセンブラ命令は「実行する」命令ではなく、プログラムの「骨格」のための命令で、CASLⅡでは4つの アセンブラ命令が用意されています。 3.2.1 3.2.1 3.2.1

3.2.1 STARTSTARTSTARTSTART 命令命令命令 命令

プログラムの先頭に必ず書く命令で、ラベル部がプログラム名になります。 オペランドにラベルを書くこともできますが、通常は「省略」でかまわないでしょう。 オペランドを省略すると、プログラムの先頭から実行が開始されますが、ラベルを書くと、そのラベルの ところから開始されます。しかし、わざわざこんなことをする必要もないので、普通は省略します。 3.2.2 3.2.2 3.2.2

3.2.2 ENDENDENDEND 命令命令命令 命令

(4)

3.2.3 3.2.3 3.2.3 3.2.3 DCDCDCDC 命令命令命令命令 Define Constant の略で、名前の通り定数を確保します。 プログラムとして「実行」される命令ではありません。 DC は定数を定義する命令で、定数には次の4種類があります。 種類 説明 コーディング例 10 進定数 10 進数の数値を定義します DC 200 16 進定数 16 進の定数を定義します DC #00C8 文字定数 文字列を定義します DC 'ABCDEFGH' ラベル定数 アドレス LABEL1 表 表 表 表 33-33---3333 DC DC DC DC 命令命令の命令命令ののの種類種類種類 種類 COMETⅡでは、1 文字は 8 ビットで表現されるため、上記の文字定数例は(8 文字ですから)4 語の領域 を占めることになりますが、CASLⅡでは、1 文字を 1 語に格納するとなっていますので、8 語の領域が確 保されます。 文字は各語の下位 8 ビットに定義され、上位 8 ビットはビットで'00000000'となります。 ここで、10 進とか 16 進とかを区別したのは、あくまでもプログラムを分かりやすくするために区別したも ので、10 進定数を 16 進で表現しても、プログラムの動作はまったく代わりません。 たとえば、 DC 200 と DC #00C3 はまったく同じことになります。 同様に、 DC 'A' は、 DC #0041 と書いても、 DC 65 と書いても、まったく同じ結果になります(ただし、プログラムはたいへん分かりにくいものになります が)。 後で詳しく述べますが、CASLⅡでは変数そのものは属性を持ちません。

(5)

CASLⅡでは、変数や定数の定義はいろいろな定義の仕方があるもんお、これは単にプログラムを見や すくするためだけのもので、変数に属性を持っているわけではありません。 したがって文字として定義した変数を固定小数点演算で使用してもまったく問題はありませんし、そん 逆も大丈夫です。 CASLⅡでは、「属性は命令が決める」のです。 DC 命令は、カンマでつないで、複数のオペランドを書くことができます。 DC 10 DC ‘A’ DC #0041 は、次のように書いても、まったく同じです。 DC 10,‘A’,#0041 3.2.4 3.2.4 3.2.4 3.2.4 DSDSDSDS 命令命令命令命令 Define Storage の略で、領域を確保します。 DC 命令と違って、確保した領域に初期値は設定されず、単に領域を確保するだけです。 3.2.5 3.2.5 3.2.5 3.2.5 リテラルリテラルリテラルリテラルについてについてについてについて 「リテラル」という言葉について説明します。 いま、プログラム中に「汎用レジスタ 1 を 16 進の X'F0F0'で論理積をとる」という命令を記述するとしま す。 普通は、 AND 1,HF0F0 ・・・ HF0F0 DC #F0F0 というように記述します。 これは、面倒なので、CASLⅡでは次のような書き方を認めています。 AND 1,=#F0F0 このように書くと、アセンブラが「=」以降を、あたかも DC 命令で確保したかのように自動的に用意してく れます。 このような、「=」以下を「リテラル」と言います。 リテラルには DC 命令で記述できるのと同じ種類があります。 種類 コーディング 説明 10 進リテラル =n nは 10 進数値 16 進リテラル =#xxxx xxxxは 16 進値 文字リテラル =’cccc・・・’ cccは文字 ラベルリテラル =LABEL1 表 表 表 表 33-33---4444 リテラルリテラルのリテラルリテラルののの種類種類種類種類

(6)

■ 3.3

3.3

3.3

3.3

マクロ

マクロ命

マクロ

マクロ

命令

マクロ命令とは、複数の命令(ニーモニック)をまとめてひとつの名前を付け、あたかもひとつのニーモ ニックのようにしたもので、C 言語の「#include」や COBOL の「COPY 句」に似ています。

単に複数のニーモニックの集合1ですから、アセンブル時には普通のニーモニックと同じように処理され ます。従って、アセンブルの結果を見ますと、元のマクロ命令は無くなって(通常はコメントアウトされて) 展開されたニーモニックがアセンブルされていることになります。 ニーモニックへの展開は、アセンブル時の第 1 フェーズ2で行われます。 CASLⅡでは4つのマクロ命令が定義3されています。 IN OUT RPUSH RPOP 順に説明します。 3.3.1 3.3.1 3.3.1 3.3.1 IIIINNNN 命令命令命令命令 入力装置から文字を読み込む命令と定義されています。 IN IN IN IN 入力領域入力領域入力領域入力領域,,,,入力文字長領域入力文字長領域入力文字長領域入力文字長領域 こんなコーディングになります。 IN INAREA,INLEN ・・・ INAREA DS 256 INLEN DS 1 読み込んだ文字は、INAREA へ先頭から格納されます。 文字は、1 語に 1 文字づつ格納されます。 CASLⅡでは 1 文字は 8 ビットで定義されていますから、1 文字を 1 語に格納すると、8 ビット余ってしまい ます。 文字は 1 語の右半分に格納され、左半分は全ビットが「0」に設定されます。 読み込む文字数は最大で 256 文字になりますから、この領域は 256 語以上確保しておいたほうが良い でしょう。 「確実に 100 文字以下しか読まないから、100 語しか確保しない」でもかまいませんが、安全を見込んで 256 語用意したほうが良いでしょう。 読み込んだ文字数が 256 以下のとき、余った領域は何も変化せず、元のままとなっています。 1 マクロ命令にパラメータを与えて、さまざまに展開する機能をもつアセンブラ言語もありますが、CASLⅡでは定義

(7)

また、C 言語のように、文字の最後に NULL がセットされるということもありません。

INLEN には読み込んだ文字数が格納されます。

ここに、10 が格納されていれば、INAREA から 10 語に文字が格納され、11 語目からは元のままになって います。

INLEN が-1 のときは EOF(End Of File)を意味します。つまり、「読み込むデータが無くなったので、何も 読んでいない」という意味です。 EOF になったときの INAREA の内容については定義されていませんが、おそらく「その前に読み込んだ内 容」が残っていると思われます。 3.3.2 3.3.2 3.3.2

3.3.2 OUTOUTOUTOUT 命令命令命令 命令

OUT 命令は、IN 命令とは逆に、文字を書き出すマクロ命令です。 OUT OUT OUT OUT 出力領域出力領域出力領域出力領域,,,,出力文字長領域出力文字長領域出力文字長領域出力文字長領域 こんなコーディングになります。 OUT OUTAREA,OUTLEN ・・・ OUTAREA DC 'ABCDEFGH' OUTLEN DC 6

OUTAREA の内容が先頭から順に(OUTAREA から順に)OUTLEN に格納されている文字数分、書き出されま す。

この場合、OUTAREA には 8 文字定義されていますが、OUTLEN が 6 なので、'ABCDEF'の 6 文字が書き出 されます。 OUT 命令の場合も、IN 命令と同様に、1 文字 1 語で書き出されます。 書き出す文字は、語の右 8 ビットに格納しておきます。語の左半分は無視されますので、特に全ビットを 「0」にしておく必要はありません。 3.3.3 3.3.3 3.3.3

3.3.3 RPUSH/RPOPRPUSH/RPOPRPUSH/RPOPRPUSH/RPOP 命令命令命令 命令

このマクロ命令は、汎用レジスタ 1~7 までの 6 個を順にスタックへ格納(RPUSH)、取り出す(RPOP)命令で す。 RPUSH マクロ命令は、次のように展開されます。 PUSH 0,GR1 PUSH 0,GR2 ・・・ PUSH 0,GR7 また、RPOP マクロ命令は次のように展開されます。 POP GR7 POP GR6 ・・・ POP GR1 汎用レジスタの順番が RPUSH と RPOP で逆になっていることに注意してください(マクロ命令なので気にす る必要はないかもしれませんが)。

(8)

スタックは、「最後に入れたものが最初に」取り出されます。

(9)

■ 3.4

3.4

3.4

3.4

言語比較

言語比較

言語比較

言語比較

ここで CASLⅡと C 言語、COBOL について、主な機能を比較してみましょう。 C 言語 COBOL CASLⅡ 変数定義 int、char 他 PIC DC 10 進数 なし ゾーン付き 10 進 パック 10 進 なし 変数の種類 固定小数点(2 進) 浮動小数点 文字、文字列 アドレス 固定小数点(2 進、10 進) 浮動小数点 文字、文字列 変数は属性を持たないが、 初期値として以下の定義が 可能 固定小数点 文字、文字列 16 進の値 アドレス 変数の大きさ 各種 各種 1 語のみ 領域定義 変数定義で代用 変数定義で代用 DS 配列 [ ]で記述 OCCURS 指標レジスタを使用して自 分で管理 変数の再定義 UNION REDEFINES なし 転送 a=b の形式 MOVE レジスタ経由 判断 if IF CPA、CPL 計算 数式を記述 COMPUTE レジスタを使用 加減算のみ 繰り返し for、while PERFORM 条件、分岐を使用して自分 で管理 分岐 goto GO TO JUMP 複数分岐 case、switch GO TO ・・・ DEPENDING なし 関数、サブルーチ ン呼び出し ルーチン名を記述 CALL CALL 擬似変数 関数名 決められた幾つかのみ なし スタック なし なし PUSH、POP で操作 マクロ機能 ソースのコピー include、デバッグ 文 COPY IN、OUT、RPUSH、RPOP 作成方法は未定義 表 表表 表 3333----5555 言語比較言語比較言語比較言語比較

参照

関連したドキュメント

朝,はじめて顔を合わせた人同志は「おはようございます」,帰宅時には「さようなら」な

の点を 明 らか にす るに は処 理 後の 細菌 内DNA合... に存 在す る

前章 / 節からの流れで、計算可能な関数のもつ性質を抽象的に捉えることから始めよう。話を 単純にするために、以下では次のような型のプログラム を考える。 は部分関数 (

LLVM から Haskell への変換は、各 LLVM 命令をそれと 同等な処理を行う Haskell のプログラムに変換することに より、実現される。

解約することができるものとします。 6

このように雪形の名称には特徴がありますが、その形や大きさは同じ名前で

・カメラには、日付 / 時刻などの設定を保持するためのリチ ウム充電池が内蔵されています。カメラにバッテリーを入

その限りで同時に︑安全配慮義務の履行としては単に使