久しぶりに記事を書きます。
このところ数学とか電気回路の勉強ばかりで、仕事以外でコードを書いていないので気分転換にコードを書きたい欲が強くなっていたのですが、@rui314さんがCコンパイラ作成入門という面白そうな本を書かれているそうなので自分もC言語でのコンパイラ開発試してみたいと思います。
raspberrypiに移植してみる
このコンパイラ作成入門の本は、任意のexitコードを返すアセンブラを出力するところから始めるようですが、環境としてx86_64/linuxもしくはx86/linuxを想定されています。
私は普段windowsを使っていて、*nix系のコードはcygwin上で書いているのでそのままではコンパイルが出来ません。
どうしたものかと思ったのですが、手元でいつでも気軽に動かせるlinuxというとraspberrypiになるのでarmの勉強も兼ねてこの本のコードをraspberrypiに移植するような形で遊んでみたいと思います。
任意のコードでのreturn
コンパイラ本体の作成は、コマンドライン引数で受け取った数値でreturn(exit)するアセンブラを出力するコードから始まるのですが、とりあえずそれっぽいコードを書いてみました。
main.c
#include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { FILE *fp = stdout; if (argc < 2) { fprintf(stderr, "input code\n"); return -1; } fprintf(fp, ".text\n"); fprintf(fp, ".global main\n"); fprintf(fp, "main:\n"); fprintf(fp, " mov r0, #%d\n", atoi(argv[1])); fprintf(fp, " bx lr\n"); return 0; }
$ ./a.out 39 > tmp.s
$ gcc -o tmp tmp.s
$ ./tmp
$ echo $?
39
うむ。受け取った引数でexitできてそう。