| low_program | ::= | PROGRAM_START_TO label (改行) flags |
| flags | ::= | flag (改行) flags | units |
| flag | ::= | FLAG [n/m] FLAG_name; (改行) |
| units | ::= | unit (改行) units | routines |
| unit | ::= | UNIT {(改行) low_statements} |
| routines | ::= | routine (改行) routines | ε |
| routine | ::= | ROUTINE label {(改行) low_statements} |
| low_statements | ::= | low_statement(改行) low_statements | ε |
| low_statement | ::= | label:num | ROT label | REV ROT | OPR label | REV OPR | SKIP label | JMP label | REV JMP | OUTPUT | REV OUTPUT | INPUT | REV INPUT | DUP | IF FLAG_name (改行) BRANCH label | NEXT FLAG_name |
入力となる低級アセンブリプログラムの全体像は以下の通り.
------------------------------コメントアウトには「#」を使う.「#」以降は改行されるまでコメントとなり,無視される.
プログラムの実行開始場所となるエントリーラベルを宣言する.
宣言は,“PROGRAM_START_TO ラベル名@ルーチン名”の一行で行われる.
プログラム中で使用するフラグを宣言する.
宣言は,“FLAG [初期状態/周期] ラベル名” の一行で行われる. 周期は (2,4,5,6,9) の中から選択し,初期状態は0~指定された周期-1から選択. ここで,状態0はフラグがONの状態,それ以外はフラグがOFFの状態に対応しており, 実行中にフラグが呼び出されると,そのフラグの状態がインクリメントされる.
ユニットでは自由なデータ列を記述できる.必要ない場合は省略可能.
データは配置する下位アドレスを先頭に付加して記述する.またデータにはラベルを任意個付加可能で,ラベルを付加する場合はアドレスより前に記述する.
ユニット記述例
各ルーチンは以下のように構成される.
ROUTINE ルーチン名 {各データは,ラベル,定数,または命令で構成される.
ラベルは英数字とアンダーバーで構成される文字列で,初めの文字は英字でなければならない. ラベルの後にはコロンを記述し,その後ろには続けてデータを記述する.
例) Label_1 : データ
定数は10進数(0から3486784400)と3進数(00000000000000000000tから22222222222222222222t)の値が使用できる. 3進数値の場合は末尾にtを記述する.
以下に命令の記述法とその詳細を記す. ただし,nはある特定の自然数とし,[label]はlabelでラベル付されたデータを表す.Dはプログラムカウンタに相当する.
| 命令 | 動作 | 制約 |
| ROT label | A,[label] := rotr( [label] ), D := label+1 | D < label ≤ D+n |
| REV ROT | ROTの復元命令 D := D+1 | |
| OPR label | A,[label] := op(A,[label] ), D := label+1 | D < label ≤ D+n |
| REV OPR | OPRの復元命令 D := D+1 | |
| SKIP label | D := label | D < label ≤ D+n |
| JMP label | D := [label] | |
| REV JMP | JMPの復元命令 D := D+1 | |
| OUTPUT | putchr(A); D := D+1 | 直後にDUPを書く必要がある |
| REV OUTPUT | OUTPUTの復元命令 D := D+1 | |
| INPUT | A := getchr(); D := D+1 | 直後にDUPを書く必要がある |
| REV INPUT | INPUTの復元命令 D := D+1 | |
| IF FLAG_name BRANCH label |
フラグがONの時: D := [label] フラグがOFFのの時: D := D+2 実行後,flagのサイクル値がインクリメントされる |
|
| NEXT FLAG_name | flagのサイクル値をインクリメントする D := D+1 |
※ROT,OPR,OUTPUT,INPUT,JMP命令の後にはそれぞれに対応した復元命令を実行する必要がある.
※命令の引数として用いられるデータラベルの記述は,必ずその命令よりも後で定義されている必要がある.
※この表以外に,任意のデータを現すデータとして,"DUP"というデータが使用可能.
※OUTPUT,INPUTの直後にはDUPを配置する必要がある.
良い例)※各データの記述において,他のルーチン内のラベルを指定する場合には,“ルーチン名@ラベル名”と記述する.
低級アセンブラが(特定のアドレスに)必ず出力するコード
| アドレス | データ |
| 22222222222222222220t | 74 ( =SNop ) |
| 22222222222222222221t | 74 ( =SNop ) |
| 22222222222222222222t | 74 ( =SNop ) |
| 0 | 98 ( =JMP ) |