ちぇりーたくあんさんの NLP-16 プロジェクト 用のアセンブラです。NLP は NANA Logic Processor の略で、NAND 素子(74HC00)だけ で 16 ビット CPU を作る壮大なプロジェクトです。
ビルドは make
を実行するだけです。nlpasm
が出力されます。
$ cd cherry-nlp16-asm
$ make
C コンパイラが必要です。GCC 9 での動作確認をしています。
標準入力にアセンブリプログラムを入力すると、機械語列が標準出力に表示されます。
$ echo "add sp, 0x10, sp" | ./nlpasm
121E
1E10
機械語のアドレスを分かりやすく表示するには -d
オプションを付与します。
$ echo "add a, 0x432, b
> add sp, 0x10, sp" | ./nlpasm -d
00000000: 1215 2600 0432
00000003: 121E 1E10
出力を見ると、1 個目の add
命令が 3 ワード命令で 2 個目が 2 ワード命令であるこ
とが分かります。1 個目の add
は 8 ビットで表せないリテラルが含まれるため、自動
的に 3 ワード命令になります。2 個目の add
は 8 ビットで表せるリテラルが 1 つだ
けしかないため、自動的に 2 ワード命令となります。あえて 3 ワード命令にしたければ
リテラルにサイズプレフィクス word
(後述)を付与してください。
nlpasm
はラベルを含んだプログラムに対応します。ラベルを使用する場合はサイズプ
レフィクス(byte
か word
)を指定する必要があります。サイズプレフィクスはラベ
ル以外の数値リテラルにも指定できます。
add a, byte label1, b
add addr, 0x400, 0xd3
label1:
add sp, sp, 2
この例ではラベルは後方参照となっています。最初に label1
が使用された時点ではま
だ定義されておらず、後になって label1:
で定義されます。これでもちゃんとアセン
ブル可能です。label1
の値は 5
となります。
byte
を指定したにも関わらずラベルの値が 255 を超えた場合はエラーとなります。
word
に変更して再度アセンブルしてください。word
に変更すると 3 ワード命令と
なりますので、機械語のサイズが増加します。