コンパイラ作成(5) コンパイル結果の確認
.intel_syntax noprefix .global main main: mov rax, 42 ret ret
前回はコンパイルできて、ちゃんと実行できることまでは確認できた。で、これがコンパイル結果。1行目の.intel_syntax noprefixは表記をIntel形式にするおまじない。x86系のアセンブリにはIntel形式とAT&T形式があるんだけど、AT&T形式には馴染みがないんだよね。
コンパイル結果見るとretが重複してる。最初のはreturn文のretで、2番目はmain関数の終わりのret。2番目のretが無いとmainにreturn文がないとき困ったちゃんになるんで入れてる。もうちょっと賢くやれば重複しないようにできるんだと思うけど面倒だから良いか。
プログラムがちゃんとしてる場合に正常にコンパイルできるのは確認できたので、プログラムに間違いがある場合のチェックしてみるよ。
main() { return 42 }
return文のセミコロンが抜けてる場合。これで試してみるよ。
~/myc$ ./myc.rb err1.myc>err1.s ~/myc$
あれ、何も表示されない。
~/myc$ ./myc.rb err1.myc .intel_syntax noprefix .global main main: mov rax, 42 ret Syntax error ~/myc$
あ、標準出力にまとめて出力されてる。だめじゃん。手抜きしてアセンブリ出力を標準出力にしちゃったのがまずかったか。うーむ、失敗失敗。