tinycをscalaに移植する。(3)

今日は、コンパイラの移植をしました。
唯の移植作業なので、ゴリゴリ作業してコンパイル通れば、あとはちょいちょいっと Null Pointer Exception を消して完成。
とりあえず、test.cのコンパイルが通ってアセンブラのコードがなんか表示されました。
アセンブルはしてないですけど、きっと動くはず(w

http://github.com/hsk/stinyc

ということで、しばらくこのソースは見たくないので放置して、次のステップに進みたくなったらまたいじります。
あと、使い方とかドキュメントを書かないとな。

main() {
	var i, s;
	s = 0;
	i = 0;
	while (i < 10) {
		s = s + i;
		i = i + 1;
	}
	println("s = %d", s);
}

こんなコードが

>scala stinyc.Main test.c

こうしてコンパイルすると、以下のコードが出力されます。

        .section        .rodata
.LC2:
        .string "s = %d"
        .text
        .align  4
        .globl  main
        .type   main,@function
main:
        pushl   %ebp
        movl    %esp,%ebp
        subl    $32,%esp
        movl    %ebx,-4(%ebp)
        movl    $0,%eax
        movl    %eax,-28(%ebp)
        movl    $0,%eax
        movl    %eax,-24(%ebp)
.L0:
        movl    -24(%ebp),%eax
        movl    $10,%ebx
        cmpl    %ebx,%eax
        jl .L4
        movl    $0,%eax
        jmp .L5
.L4:    movl    $1,%eax
.L5:    cmpl    $0,%eax
        je      .L1
        movl    -28(%ebp),%eax
        movl    -24(%ebp),%ebx
        addl    %ebx,%eax
        movl    %eax,-28(%ebp)
        movl    -24(%ebp),%eax
        movl    $1,%ebx
        addl    %ebx,%eax
        movl    %eax,-24(%ebp)
        jmp     .L0
.L1:
        movl    -28(%ebp),%eax
        pushl   %eax
        pushl   $.LC2
        call    println
        addl    $8,%esp
.L3:    movl    -4(%ebp), %ebx
        leave
        ret