戻る

仮想アセンブリ言語「CASL」

・「CASL」とは?

コンピュータ技術者の国家資格として「情報処理技術者」というのがある。
その中でかつては「第二種〜」、現在は「基本〜」といわれる一番難易度が低いとされるカテゴリがある。
(低難易度といいつつ、第二種の合格率は常に20%未満だったらしい。ただ、がっつりプログラミングを趣味としていたものにとっては難しいものではない。実際、管理人も特に対策しないで一発合格した)

試験問題の中にプログラミング能力試験というものがあり、いくつかのプログラミング言語が用意されている。
(2021年現在ではC,Java,Python,アセンブリ言語,表計算から選択する。かつてはCOBOLやFORTRANもあった)

アセンブリ言語は特定のプロセッサに依存するため、それ以外のプロセッサを習得してきた者に対して不利となる。
そのため、架空の処理系である「COMET」というものを策定し、そのアセンブリ言語を「CASL」とした。
現在は「COMET II/CASL II」に仕様改定されている。
(初めに策定されたのは「COMP-X/CAP-X」である)

・「COMET」の仕様 (COMET IIで改定されたものはそちらを優先する)

1word長が固定16bitで、全てword単位で処理される。
bit配列は最上位bitを15、最下位bitを0とする。
(COMETでは逆である)

命令長は2word。
OP(8bit),GR(4bit),XR(4bit),ADR(16bit)で構成される。
GRは汎用レジスタ、XRは指標レジスタである。

データは算術、論理、文字の3種類が利用可能。
算術データは1wordの2の補数表現、論理データは符号なし整数として扱う。
文字データは「JIS X 0201」(俗にいうANKコード、Shift-JISの一部)で表現される。

汎用レジスタはGR0〜GR7で、演算に用いられる。
このうち、GR1〜GR4は「指標(インデックス)」レジスタとしても使用される。
スタックポインタは「SP」である。
(COMETではGR4までで、GR4はスタックポインタとされていた)

プログラムカウンタは「PC」で命令長が2wordであるため、自動で2が加算される。
フラグレジスタ「FR」は3bitである。
演算命令の結果が以下のように格納される。

結果bit 1bit 0
00
10
01

「FR」の2bit目は算術オーバーフローが発生した場合に「1」となる。
(COMETにはない)

・「COMET/CASL」の命令 (COMET II/CASL IIで改定されたものはそちらを優先する)

命令の数は28。
「[〜]」は「〜」が省略可能であることを意味する。
I」はCOMETのみ、「II」はCOMET IIのみ、付加なしは共通のものである。

繰返などの制御命令はないので、演算と条件分岐で対応する。
レジスタ関係は68系よりで、制御が80系っぽい仕様である。
※管理人個人の感想です(笑)

[戻る]

COMET命令
命令対象意味FR説明
LDGR,adr[,XR]LoaDO IIアドレスの内容をレジスタにロード(読込)する
LD IIGR1,GR2LoaDOレジスタ1の内容をレジスタ2にロードする
STGR,adr[,XR]SToreXレジスタの内容をアドレスにストア(格納)する
LEA IGR,adr[,XR]Load Effective AddressOアドレスの番地をレジスタにロードする
LAD IIGR,adr[,XR]Load ADressXアドレスの番地をレジスタにロードする
ADD IGR,adr[,XR]ADD arithmeticOレジスタの内容とアドレスの内容を加算し、レジスタに結果をストアする
ADDA IIGR,adr[,XR]ADD ArithmeticOレジスタの内容とアドレスの内容を加算し、レジスタに結果をストアする
ADDA IIGR1,GR2ADD ArithmeticOレジスタ1の内容とレジスタ2の内容を加算し、レジスタ1に結果をストアする
ADDL IIGR,adr[,XR]ADD LogicOレジスタの内容とアドレスの内容を加算し、レジスタに結果をストアする
演算は論理データ(符号なし整数)で扱う
ADDL IIGR1,GR2ADD LogicOレジスタ1の内容とレジスタ2の内容を加算し、レジスタ1に結果をストアする
演算は論理データ(符号なし整数)で扱う
SUB IGR,adr[,XR]SUBtract arithmeticOレジスタの内容をアドレスの内容で減算し、レジスタに結果をストアする
SUBA IIGR,adr[,XR]SUBtract ArithmeticOレジスタの内容をアドレスの内容で減算し、レジスタに結果をストアする
SUBA IIGR1,GR2SUBtract ArithmeticOレジスタ1の内容をレジスタ2の内容で減算し、レジスタ1に結果をストアする
SUBL IIGR,adr[,XR]SUBtract LogicOレジスタの内容をアドレスの内容で減算し、レジスタに結果をストアする
演算は論理データ(符号なし整数)で扱う
SUBL IIGR1,GR2SUBtract LogicOレジスタ1の内容をレジスタ2の内容で減算し、レジスタ1に結果をストアする
演算は論理データ(符号なし整数)で扱う
ANDGR,adr[,XR]ANDOレジスタの内容とアドレスの内容との論理積をレジスタにストアする
AND IIGR1,GR2ANDOレジスタ1の内容とレジスタ2の内容との論理和をレジスタ1にストアする
ORGR,adr[,XR]OROレジスタの内容とアドレスの内容との論理積をレジスタにストアする
OR IIGR1,GR2OROレジスタ1の内容とレジスタ2の内容との論理和をレジスタ1にストアする
EORGR,adr[,XR]Exclusive OROレジスタの内容とアドレスの内容との論理和をレジスタにストアする
XOR IIGR,adr[,XR]eXclusive OROレジスタの内容とアドレスの内容との論理和をレジスタにストアする
XOR IIGR1,GR2eXclusive OROレジスタ1の内容とレジスタ2の内容との論理和をレジスタ1にストアする
CPAGR,adr[,XR]ComPare ArithmeticOレジスタの内容とアドレスの内容を比較(算術減算)し、結果をFRに反映する
CPA IIGR1,GR2ComPare ArithmeticOレジスタの内容とレジスタ2の内容を比較(算術減算)し、結果をFRに反映する
CPLGR,adr[,XR]ComPare LogicOレジスタの内容とアドレスの内容を比較(論理減算)し、結果をFRに反映する
CPL IIGR1,GR2ComPare LogicOレジスタの内容とレジスタ2の内容を比較(論理減算)し、結果をFRに反映する
SLLGR,adr[,XR]Shift Left LogicO左にアドレスの内容分、論理シフトする
欠落部分には「0」が入る
SRLGR,adr[,XR]Shift Right ArithmeticO右にアドレスの内容分、算術シフト(最上位bitは変化しない)する
欠落部分には「0」が入る
SLLGR,adr[,XR]Shift Left LogicO左にアドレスの内容分、論理シフトする
欠落部分には「0」が入る
SRAGR,adr[,XR]Shift Right ArithmeticO右にアドレスの内容分、算術シフト(最上位bitは変化しない)する
欠落部分には「0」が入る
JPZ Iadr[,XR]Jump on Plus or ZeroXFRが「00」「01」のとき、アドレス分岐する
JPL IIadr[,XR]Jump on PLusXFRが「*00」のとき、アドレス分岐する
JMIadr[,XR]Jump on MInusXFRが「*10」のとき、アドレス分岐する
JNZadr[,XR]Jump on Non ZeroXFRが「*10」「*01」のとき、アドレス分岐する
JZEadr[,XR]Jump on ZEroXFRが「*00」のとき、アドレス分岐する
JOV IIadr[,XR]Jump on OVerflowXFRが「1**」のとき、アドレス分岐する
JMP Iadr[,XR]unconditional JuMPX無条件でアドレス分岐する
JUMP IIadr[,XR]unconditional JUMPX無条件でアドレス分岐する
PUSHadr[,XR]PUSH effective addressXアドレスをスタックにストアする
SP(COMETではGR4)にスタック先頭アドレスが設定される
POPGRPOP upXスタックの先頭に格納されているアドレスをレジスタにストアする
SP(COMETではGR4)にスタック先頭アドレスが設定される
CALLadr[,XR]CALL subroutineXサブルーチンを呼び出す
RETRETurn form subroutineXサブルーチンから復帰する
COMET IIではメインルーチンで用いた場合、プログラム終了を意味する
SVC IIadr[,XR]SuperVisor Call-システムコールする
実行後、GR,FRの内容は不定
NOP IINo OPeration-何もしない
[戻る]

CASL構文
疑似命令対象意味FR説明
START[adr]STARTプログラム先頭に必須で、アドレスを省略した場合は先頭から、指定された場合は指定アドレスから実行する
ENDENDプログラム末尾に必須で、プログラム終了(実行の終了ではなく、記述全体の終了)を意味する
DCnDefine Constantnは10進数の数値で1wordの2進数として扱われる
nが算術データの範囲(-32768〜32767)外である場合は下位16bitを有効にする
DSnDefine Storagenは10進数の数値で指定分のword長を領域として確保する
;(remark)以降をコメントとする
[戻る]

CASLマクロ
疑似命令対象意味FR説明
IN入力領域,文字長IN入力待ちが発生し、入力データを文字型として領域にストアする
COMETのデータは16bitであり入力は8bitであるため、8bit目以降にストアされ、0〜7bitは「0」で埋められる
文字長には入力されたデータ長がストアされる
指定はともにラベル名で行う
OUT出力領域,文字長INラベルで指定した領域のデータをラベルで指定した文字長分出力する
1文字は1wordで指定される(INでストアされた形式となる)
EXIT IEXITプログラムの実行を終了する
COMET IIではメインルーチンの「RET」で示される
RPUSH IIRegister PUSHGR1からGR7の順で内容をスタックに順次ストアする
RPOP IIRegister POP upスタックから順次値を取り出し、GR7からGR1の順にストアする
[戻る]


・サンプルコード


; CASLでこんにちは世界

MAIN    START
        LD      GR1,ZERO        ; インデックス
LOOP    LD      GR2,DAT,GR1     ; DATから1文字コピー
        ST      GR2,MSG,GR1     ; MSGに1文字コピー
        ADDL    GR1,=1          ; インデックス+1
        CPL     GR1,STRL        ; 文字長と比較
        JMI     LOOP            ; データ末でなければ繰り返す
        CALL    DISP
EXIT    RET

DISP    OUT     MSG,STRL
        RET

ZERO    DC      0
STRL    DC      12

DAT     DC      'Hello,world!'

MSG     DS      12
        END


[TOPに戻る]