大熱血!アセンブラ入門のアセンブラ出力環境のバージョンアップ版と,NLUXのバージョンアップ版を一気にリリースしました.
https://kozos.jp/books/asm/ →アセンブラ出力環境(gcc-11)
https://kozos.jp/nlux/download.html →2025/06/13版
これらは今まで別々のツールだったのですが,今回,これらが協調動作するようになりました.
まず,大熱血アセンブラのアセンブラ出力環境はgccベースになっていて,各種CPUアーキテクチャ向けのクロスコンパイラ(gcc)をビルドし,サンプルプログラムをクロスコンパイルすることで実行ファイルを生成したり,その実行ファイルをシミュレータ上で動作させたりすることができます.
またNLUXには,独自のCコンパイラ(NLCC)と独自の標準Cライブラリ(のサブセット)(nllibc)が含まれています.
で,今回のリリースでは,以下のようなことができるようになりました.(やりかたはNLUXのトップのREADME.txtの「クロスコンパイル」の章を参照)
- 大熱血アセンブラの環境にNLCCを使ってアセンブリを生成できる.さらに実行ファイルを生成し,シミュレータで実行ができる.
- 大熱血アセンブラの環境とNLCCを使って,nllibcをクロスビルドできる.(コンパイラにはNLCCを使うが、アセンブラやリンカには大熱血アセンブラの環境を使う)
- そのクロスビルドしたnllibcとNLCCを大熱血アセンブラの環境に使って,実行ファイルを生成できる.
- さらにその実行ファイルをシミュレータで実行できる.(MIPS16/RX以外)
- これらのことが,11種類のCPUアーキテクチャでできる.(AArch64/ARM/MIPS/MIPS16/PowerPC/RISC-V/RX/Thumb/Thumb2/x86/x86-64)
MIPS16とRXはnllibcを用いての実行確認ができていませんがそれを差し引いても,NLCCは9種類のアーキテクチャで,標準Cライブラリのサブセット(printf()含む)をビルドして動作確認できる程度には動いたということなので,そこそこ動作確認がとれたということにはなるかなと思います.
これはNLCCが新たなCPUアーキテクチャに対応しやすいという特徴があるためです.
詳しくはNLUXのREADMEに書いてあるのですが,具体的には以下のような方針で設計することで実現しています.
- 利用するレジスタを限定(演算は2種類のレジスタのみで行う)
- 出力するアセンブリのパターンを限定(最低限のアセンブリパターンのみ登録し,それらの組み合わせで処理を実現する)
- ビルトインの活用(他の命令で代用可能な処理は,未登録でも代用され動作する)
2つのレジスタ(NLCC内では「R0」と「R1」と呼んでいる)に何を使うかを決めて,R0に定数値を代入する命令,R1をR0に代入する命令,R0とR1を加算しR0に格納する命令,などを登録しておけば,それらを組み合わせて処理をするようなアセンブリのコードを生成してくれます.
x86-64の例だと,R0にRAX,R1にRDXを指定して,上の例なら以下のような関数を登録しておくことになります.(asm_code_amd64.c参照)
static void get_value(FILE *out, long value)
{
ASM_CODE_OUT(out, "\tmov\t$0x%lx, %%rax\n", value);
}
static void get_r1(FILE *out)
{
ASM_CODE_OUT(out, "\tmov\t%%rdx, %%rax\n");
}
static void calc_add(FILE *out, model_t model, model_t model_arg0, model_t model_arg1)
{
ASM_CODE_OUT(out, "\tadd\t%%rdx, %%rax\n");
}
現状では最適化を一切しないため,生成されるアセンブリは非効率極まり無いものとなっています.
が,10アーキでとりあえず動きますし,新たなアーキに対応させるコストも極小です.