アセンブリ言語プログラムの BNF 風表現

KUECHIP-3F アセンブラが入力として扱うことができるアセンブリ言語プログラムの BNF 風表現を以下に示す.

<program>                  ::= <instruction>+
<instruction> ::= [<label>{<space> | <newline>}+] <0op inst> [<comment>] <newline>+
| [<label>{<space> | <newline>}+] <1op inst> [<comment>] <newline>+
| [<label>{<space> | <newline>}+] <2op inst> [<comment>] <newline>+
<label> ::= <alphanumeric character>+ ':'
<alphanumeric character> ::= 'A' | 'B' | ... | 'Z' | 'a' | ... | 'z' | '0' | ... | '9'
<0op inst> ::= <0op inst mnemonic>
<0op inst mnemonic> ::= 'NOP' | 'RET' | 'HLT' | 'OUT' | 'IN' | 'RCF' | 'SCF'
<1op inst> ::= <1op inst mnemonic> <space> <operand>
<1op inst mnemonic> ::= 'INC' | 'DEC' | 'CAL' | PSH' | 'POP'
| 'BA' | 'BNZ' | 'BZP' | 'BP' | 'BNI' | 'BNC' | 'BGE' | 'BGT'
| 'BVF' | 'BZ' | 'BN' | 'BZN' | 'BNO' | 'BC' | 'BLT' | 'BLE'
| 'SRA' | 'SLA' | 'SRL' | 'SLL' | 'RRA' | 'RLA' | 'RRL' | 'RLL'
<2op inst> ::= <2op inst mnemonic> <space> <operand> [','] <space> <operand>
<2op inst mnemonic> ::= 'INC' | 'DEC' | 'LD' | 'ST' | 'SBC' | 'ADC' | 'SUB' | 'ADD'
| 'EOR' | 'OR' | 'AND' | 'CMP'
<comment> ::= '#' (任意の文字列)
<newline> ::= (LF) | (CR) (LF)
<operand> ::= <register>
| <immediate value>
| '[' <immediate value> ']'
| '[' <offsetted register value> ']'
<register> ::= 'ACC' | 'IX' | 'SP'
<immediate value> ::= <expression>
<offsetted register value> ::= 'IX' <space>* '+' <space>* <immediate value>
| 'IX' <space>* '-' <space>* <immediate value>
| 'SP' <space>* '+' <space>* <immediate value>
| 'SP' <space>* '-' <space>* <immediate value>
<expression> ::= <term>
| <expression> <space>* '+' <space>* <term>
| <expression> <space>* '-' <space>* <term>
<term> ::= <factor>
| <term> <space>* '*' <space>* <factor>
| <term> <space>* '/' <space>* <factor>
<factor> ::= <number> | <label>
<number> ::= <decimal number>+
| {<decimal character> | <alphabet in hex>}+ {'H' | 'h'}
<numerical character> ::= '0' | '1' | ... | '9'
<alphabet in hex> ::= 'A' | 'B' | ... | 'F' | 'a' | 'b' | ... | 'f'
<space> ::= ' ' | ' '

ここで用いている BNF 派生表現は下記の通りである. ただし, オペランドの制約は正確に示すと表現が複雑になりすぎるため上記の表現では考慮していない.
例えば, ST の第 2 オペランドにレジスタを指定することはできない.
各ニーモニックに対してどのようなオペランドを用いるかは, 別途ドキュメントを参照のこと.

各要素について

ニーモニックとオペランド

KUECHIP-3F アセンブリ言語プログラムは, 1 行に 1 命令を記述する.
命令はニーモニック (命令の種類の指定) と 0〜2 個のオペランド (命令の引数) からなる.
各命令は, 定められた数のオペランドを持つ必要がある.
オペランドが 例えば加算を行う ADD 命令は "ADD ACC, 1" のように 2 つのオペランドを必要とする.

ラベル

各行には定数を定義するための "ラベル" を用いることができる.
ラベルは, 同一行に命令があればその命令, 同一行に命令が存在しない場合は次の命令の配置アドレスを参照するための機能である.
また, 疑似命令 EQU を用いることで, ラベルに特定の値 (定数) を設定することができる.
ラベルの同一行に EQU 疑似命令がある場合, そのラベルの値は命令の配置アドレスではなく EQU のオペランドの値となる.
ラベルの値は命令のオペランドとして用いることができる.

具体例を以下に示す.
左側が入力となるアセンブリ言語プログラム, 右側が出力となる機械語プログラムである.
1 行目では EQU 疑似命令を用いて, ラベル N に 80H (16 進数の値 0x80) を紐付けている.
同様に SUM の値は 82H (0x82) となる.
7 行目の LOOP は "LOOP:" 直後の命令, つまり ADD が配置されるアドレスを示す.
ここでは, この ADD 命令が 0x0008 に配置されるため LOOP の値は 0x08 となる.

ラベル N は 5 行目で用いられているが, この場合 "LD IX, [80H]" と記述した場合と同様の結果が得られる.
同様に 9, 10 行目についてもラベルの値が評価され, それぞれ "BP 08H", "ST ACC, [82H]" としてアセンブルされる.

N:    EQU      80H      |
SUM:  EQU      82H      |
      LOC      80H      |
      DAT      AH       |    0080: 000A
      LD  IX,  [N]      |    0000: 006C 0080
      LD  ACC, 0        |    0004: 0062 0000
LOOP: ADD ACC, IX       |    0008: 00B1
      SUB IX,  1        |    000A: 00AA 0001
      BP       LOOP     |    000E: 0033 0008
      ST  ACC, [SUM]    |    0012: 0074 0082
      HLT               |    0016: 000F
    

コメント

各行の # 以降はコメントとして扱われる. アセンブルする際に読み飛ばされるため, 自由に記述することができる.