-
Notifications
You must be signed in to change notification settings - Fork 0
モデルコンピュータASCの命令とデータの形式について
ASC(A Simple Computer)は、
馬場敬信著: コンピュータのしくみを理解するための10章, 技術評論社, p.255(2005)
http://gihyo.jp/book/2005/4-7741-2422-2
においてモデルとなる簡単なコンピュータとして定義したものです。
今回、ASC用のシミュレータとアセンブラを公開するにあたり、併せてASCの命令セットとデータ形式についても公開することとしました。
これらの内容については、上記著書および著者である馬場敬信に著作権があることに留意してください。
命令とデータはともに16ビットの固定長とします。
命令は、先頭4ビットを操作コードとして、残りの12ビットをオペランドのアドレス指定に使用します。
命令形式、及び各命令の操作コードと操作内容の一覧を図aに示します。
図a モデルコンピュータASCの命令セット (「コンピュータのしくみを理解するための10章」図4.3を改変)
例えば、操作コードが(0000)2の場合、ロード命令であることを表し、記憶装置のa番地の内容をレジスタに持ってくることを表します。LD命令はロード命令であることを意味するニーモニック(名称)表現です。
演算によって変化するフラグとして、演算結果がゼロであることを表すZフラグと、負であることを表すNフラグとがあります。Zフラグは、加算、減算、論理積、論理和のすべてで変化しますが、Nフラグは、加算と減算により変化します。さらに加算と減算にはオーバフローの可能性があり、オーバフローを起こすとコンピュータは停止します。
データは、16ビットの2進数として表現します。符号を考慮した固定小数点数として扱うときには、2の補数表示を使用します。
図bにASCの命令とデータの形式を用いて、1+2→3を計算するプログラム例を示します。
アドレス(10進数) | 命令とデータの2進表現 | |
---|---|---|
0000(0) | 0000 000000000100 | 4番地の内容(1)を持ってくる |
0001(1) | 0010 000000000101 | 5番地の内容(2)を加える |
0010(2) | 0001 000000000110 | 結果(3)を6番地に格納する |
0011(3) | 1111 000000000000 | 停止する |
0100(4) | 0000000000000001 | 1 |
0101(5) | 0000000000000010 | 2 |
0110(6) | 0000000000000000 |
図b ASCの命令セット定義に基づく機械命令プログラム (「コンピュータのしくみを理解するための10章」図4.4を改変)
図cに図aの命令セット定義に基づくASCのハードウェア構成を示します。これはそのままシミュレータの画面に反映されます。
図c ASCのハードウェア (「コンピュータの仕組みを理解するための10章」図4.5を改変)
ASC Simulator&Assemblerは、 ASC(A Simple Computer) のアセンブラとシミュレータから成ります。 この章では、ASC AssemblerとASC Simulatorの使い方と、アセンブリ言語の仕様について説明します。
ASC Assemblerは、"asc-assembler.exe"というファイル名で配布しています。 このexeファイルは、.ascs形式で記述されたソースコードを読み込み、アセンブル時のログと共にシミュレータの読む込むことのできる.ascoファイルを書き出すことができます。
まず、テキストエディタを用いてascs形式のソースコードを用意します。文法については後述します。
用意した.ascs形式のソースコードファイルを、asc-assembler
というリンクにドラッグアンドドロップすることにより、アセンブルを実行することができます。
[警告][エラー]などの表示が出なければアセンブル成功です。
成功時には、アセンブルのログが表示され、ソースコードと同じディレクトリに.ascoファイルを出力します。 .ascoファイルのファイル名は、ソースコード中のTITLE文(後述)によって指定することに注意してください。 この.ascoファイルが、オブジェクトファイルになり、シミュレータによって実行することができます。
[警告][エラー]などの表示が出た場合には、その内容に応じてソースコードを訂正してください。
ASC Assemblerで作成したオブジェクトファイル(.asco)を実行するシミュレータです。 シミュレータにオブジェクトファイルを読み込ませて実行するには、以下のような方法があります。
- シミュレータのアイコンをダブルクリックして立ち上げた後、.ascoファイルをシミュレータの画面にドラッグアンドドロップする
- シミュレータのアイコンをダブルクリックして立ち上げた後、シミュレータのメニュー中のファイルを選択して、.ascoファイルを読み込む
- シミュレータのアイコンに.ascoファイルをドラッグアンドドロップする
アセンブルした結果をシミュレータで実行したい場合、もっとも簡単なのは3.の方法です。
ドラッグアンドドロップによって、シミュレータの立ち上げと、.ascoファイルの読込みを同時に行うことができます。
シミュレータを立ち上げた状態で.ascoファイルの読込みを繰り返し行う場合は、1.または2.の方法が便利です。
シミュレータを立ち上げた後の使い方については、シミュレータのメニューバーの[ヘルプ]より、[使い方]を参照してください。
アセンブラ、シミュレータの使い方を説明しましたが、ここでアセンブリ言語プログラムの作成からアセンブル、シミュレーションまでを通しての簡単なASCシステムの使い方を図dに示します。先に注意したように、.ascoファイルのファイル名は、アセンブリ言語プログラム中のTITLE文で指定します。 ダウンロード後に、sampleフォルダ内のプログラムを用いて、この手順を確認することから始めるのも一つの方法です。例えば、ADD.ascsプログラムをアセンブルすると、機械語コードADDITION.ascoが出力されます。これをasc-simulator.exe上にドラッグ&ドロップするとシミュレータが立ち上がります。
図d ASCシステムの使い方
.ascsファイルは、ASC用のアセンブリ言語を用いて記述したプログラムファイルです。ASCアセンブリ言語の書式を以下に示します。
命令は、ASCに実行させたい動作を指定するものです。 命令を記述する際、命令の前に空白(半角空白, 全角空白, タブ文字)が無い場合、ラベル名として扱われますので気をつけてください。 また、全ての命令は大文字のみで記述してください。小文字を混ぜて使用すると、エラーとなります。 使用できる命令は以下の10個です。
<オペランド>
により指定したアドレスからレジスタRへ値をロードする命令です。
<オペランド>
により指定したアドレスへレジスタRから値をストアする命令です。
<オペランド>
により指定したアドレスの値をレジスタRの値に加算する命令です。
もし、演算の結果レジスタRの値が負になった場合、フラグNが立ちます。
もし、演算の結果レジスタRの値が0になった場合、フラグZが立ちます。
もし、正の値+正の値の演算により、レジスタRの値が負の値になった場合、オーバフローとなります。
もし、負の値+負の値の演算により、レジスタRの値が正の値になった場合、オーバフローとなります。
レジスタRの値から<オペランド>
により指定したアドレスの値を減算する命令です。
もし、演算の結果レジスタRの値が負になった場合、フラグNが立ちます。
もし、演算の結果レジスタRの値が0になった場合、フラグZが立ちます。
もし、正の値-負の値の演算により、レジスタRの値が負の値になった場合、オーバフローとなります。
もし、負の値-正の値の演算により、レジスタRの値が正の値になった場合、オーバフローとなります。
レジスタRの値と<オペランド>
により指定したアドレスの値の論理積を取ります。
もし、演算の結果レジスタRの値が0になった場合、フラグZが立ちます。
レジスタRの値と<オペランド>
により指定したアドレスの値の論理和を取ります。
もし、演算の結果レジスタRの値が0になった場合、フラグZが立ちます。
<オペランド>
により指定したアドレスへ処理を移します。
Zフラグが立っていた場合、<オペランド>
により指定したアドレスへ分岐します。
Nフラグが立っていた場合、<オペランド>
により指定したアドレスへ分岐します。
ASCを停止します。この命令にはオペランドは必要ありません。
命令の記述に使用する<オペランド>
は、アドレスによって命令の操作対象を指定します。
ASCアセンブリ言語では、アドレスに付された<ラベル>
を用いるか、<16進数>
で表したアドレスを直接用いることによって、指定することができます。
前述の命令はASCに対する命令であったのに対し、擬似命令はアセンブラに対する動作を指定するものです。 擬似命令には以下の5つがあります。
プログラムのタイトルを指定します。 ここで指定された名前に.ascoを付加したものが、オブジェクトファイル名となります。
プログラムの先頭アドレスを指定します。 シミュレーション開始時には、ORGで宣言したアドレスをPCにセットします。 また、ORGが省略された場合には、0x0000番地を使用します。
符号付きの定数を定義します。
指定したサイズのメモリ領域を確保します。
プログラムの終了を表します。これ以降に記述されたプログラムは無視します。
ここまでの説明に用いた<ラベル>
や<名前>
は、アルファベットで始め、字数は10文字未満でなければなりません。
メモリ容量が4Kであることから、16進数によってオペランドのアドレスや、ORGを用いたプログラムの先頭アドレスを指定する場合、3桁以内でなければなりません。
ASCアセンブリ言語は、";"(セミコロン)の後の文字を全て無視します。よって、セミコロンの後にプログラムの説明を書くことができます。これをコメントと呼びます。 コメントは主に、セミコロンが行頭にくる一行コメントと、セミコロンが行末にくる行末コメントに分けられます。 行頭コメントの場合、アセンブルのログでは一行全てをコメントとして表示します。
; 一行コメントの例
Test LD 0x10 ;行末コメントの例
以下に、BNFでこの言語の仕様を記述します。
BNFとはプログラミング言語の文法を定義するもので、次のように簡単な規則からなっています。
<A> ::= <B><C> ・・・ <A> は、<B>と<C>を並べたもので置き換えられる
<A> ::= <B>|<C> ・・・ <A> は、<B>か<C>によって置き換えられる
< > で包まれていないものは、それ以上置き換えることはできない
{ } で包まれたものは、あっても、なくてもよい
<プログラム> ::=
<プログラム頭部>
<プログラム本体>
<プログラム後部>
<プログラム頭部> ::= TITLE <名前> { ORG <16進数> }
<プログラム本体> ::= <命令>{ <命令> }
<プログラム後部> ::= END
<命令> ::= <ラベル> <命令本体> { <コメント> } | <命令本体> { <コメント> } | <コメント>
<ラベル> ::= <名前>
<名前> ::= <アルファベット> {<アルファベットまたは数字>}
<アルファベットまたは数字> ::= <数字> | <アルファベット>
<コメント> ::= ;任意の<文字>と<数字>を並べたもの
<命令本体> ::= <命令グループ1> | <命令グループ2> | <命令グループ3>
<命令グループ1> ::= <OP1> <オペランド>
<OP1> ::= LD | ST | ADD | SUB | AND | OR | B | BZ | BN
<オペランド> ::= <ラベル> | <16進数>
<命令グループ2> ::= HLT
<命令グループ3> ::= DC <定数> | DS <数値>
<定数> ::= <符号付き10進数> | <16進数>
<符号付き10進数> ::= {+}<10進数> | -<10進数>
<数値> ::= <10進数>
<16進数> ::= 0x<数字>|A|B|C|D|E|F{<数字>|A|B|C|D|E|F}
<10進数> ::= <数字>{<数字>}
<数字> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<文字> ::= ! | “ | # | $ | % | & | ’ | ( | ) | - | = | ^ | \ | | |
@ | ` | [ | { | ; | + | : | * | ] | } | , | < | . | > | / | ? | _ |
<アルファベット>
<アルファベット> ::= A | B | C | D | E | F | … | X | Y | Z |
a | b | c | d | e | f | … | x | y | z