現実逃避しています
いまは、非常に忙しいです。忙しいので、こんなことをしていてはいけないのですが、プログラムを作っています。これが楽しい。で、なにを作っているかというと、Rubyでアセンブラを作っているのです。
http://github.com/miura1729/ytljit
初めにアセンブラを書いておいて、これで次期yarv2llvm(ytl)のVMを書こうという魂胆です。つまり、llvmはもう使わないということです。
アセンブラはこんな感じで使えます。
require 'lib/ytljit/ytljit.rb' include YTLJit asm = Assembler.new # registor definition eax = OpEAX.instance ecx = OpEAX.instance asm.mov(eax, OpImmidiate32.new(0)) loop = asm.current_address asm.add(eax, OpImmidiate8.new(1)) asm.jo(loop) asm.ret File.open("foo.bin", "w") {|fp| asm.flush(fp) }
これで、こんなコードが出てきます。
$ objcopy -I binary -O elf32-i386 -B i386 foo.bin foo.o; objdump -D foo.o foo.o: file format elf32-i386 Disassembly of section .data: 00000000 <_binary_foo_bin_start>: 0: b8 00 00 00 00 mov $0x0,%eax 5: 83 c0 01 add $0x1,%eax 8: 70 fb jo 5 <_binary_foo_bin_start+0x5> a: c3 ret
アセンブラ作成にあたって、fujita-yさんのYpsilonとhigeponさんのMosh JITのコードを参考にさせてもらいました。ありがとうございます。
追記
こんなこともできます
arynew = address_of("rb_ary_new") asm.call(arynew)