進みましたが、バグがいっぱいです

ytlのアセンブラRubyにアロケートしたメモリにバイナリを生成してJITで実行できるようになりました。でも、いろいろ試していたらバグがいっぱい出てきて直さないといけないです。特に、間接アドレッシングの当りは全然だめです。こんな感じでプログラムが動きます。いずれにしてもあまりオーバヘッドなくコードが生成できるのでいろいろおもしろそうなことができそうです。

Hello World

def hello
  asm = Assembler.new(cs = CodeSpace.new)
  
  # registor definition
  eax = OpEAX.instance
  esp = OpESP.instance
  hello = OpImmidiate32.new("Hello World".address)
  asm.mov(eax, hello)
  asm.push(eax)
  rbp = address_of("rb_p")
  asm.call(rbp)
  asm.add(esp, OpImmidiate8.new(4))
  asm.ret
  asm.flush
  cs.call(cs.base_address)
end
hello

Fib

def fib(n)
  cs0 = CodeSpace.new
  cs1 = CodeSpace.new
  cs2 = CodeSpace.new
  
  # registor definition
  eax = OpEAX.instance
  ebx = OpEBX.instance
  esp = OpESP.instance

  asm = Assembler.new(cs0)
  ent = cs1.base_address

  asm.mov(eax, OpImmidiate32.new(n))
  asm.call(ent)
  asm.add(eax, eax)
  asm.add(eax, OpImmidiate8.new(1))
  asm.ret
  asm.flush
  
  asm = Assembler.new(cs1)
  asm.cmp(eax, OpImmidiate32.new(2))
  asm.jl(cs2.base_address)
  asm.sub(eax, OpImmidiate32.new(1))
  asm.push(eax)
  asm.call(ent)
  asm.pop(ebx)
  asm.sub(ebx, OpImmidiate32.new(1))
  asm.push(eax)
  asm.mov(eax, ebx)
  asm.call(ent)
  asm.pop(ebx)
  asm.add(eax, ebx)
  asm.ret
  asm.flush
  
  asm = Assembler.new(cs2)
  asm.mov(eax, OpImmidiate32.new(1))
  asm.ret
  asm.flush

  cs0.call(cs0.base_address)
end

(1..39).each do |i|
  p fib(i)
end