minrubyコンパイラ / 入力した整数を画面へプリントする
#MinRuby
from MinRubyコンパイラ
「RubyでつくるRuby」の minruby のパーサを利用してApple M1 のアセンブリコードを出力するコンパイラを作成してみる。
まずは、入力した整数を画面へプリントするだけのコンパイラ。
code:minrubyc.rb
require "minruby"
tree = minruby_parse(ARGF.read)
puts "\t.text"
puts "\t.align 2"
puts "\t.globl _main"
puts "_main:"
puts "\tsub sp, sp, #16"
puts "\tstp fp, lr, sp, #0"
if tree0 == "lit"
puts "\tmov x0, ##{tree1}"
else
raise "invalid AST: #{tree}"
end
# 入力した整数をプリントする
puts "\tbl _p"
puts "\tmov w0, #0"
puts "\tldp fp, lr, sp, #0"
puts "\tadd sp, sp, #16"
puts "\tret"
整数を画面へ出力するためのライブラリ関数も必要なので用意する。
code:libminruby.c
#include <stdio.h>
long p(long x) {
printf("%ld\n", x);
return x;
}
コンパイルしてみる。4649 が画面に出力されればOK
https://gyazo.com/4a2cb6746f42a1360291cf24334206d2