コツコツ作成しているCコンパイラですが、return文が無いと色々不便なのでreturn文を追加しました。
return文はそこに来たら関数の最後にジャンプすれば良いので、jmp命令でプロローグの直前にジャンプすればOKです。
jmpする前にraxに値を入れておきます。
実行結果はこんな感じです。
```
`gutter:false;
$ ./9cc "main(){return 10;}"
.intel_syntax noprefix
.global main
main:
push rbp
mov rbp, rsp
sub rsp, 0
push 10
pop rax
jmp .Lreturn000
pop rax
.Lreturn000:
mov rsp, rbp
pop rbp
ret
```
無駄に毎回ジャンプしていますが、その辺りは今後の課題という事で...
ここまでくると、コンパイラの方が賢くてテストコードのミスを実行結果に教えられる事が多くなってきました。
if, while, forは既に足したので、簡単なプログラムなら書く事ができそうです。
## 参考URL
* [低レイヤを知りたい人のためのCコンパイラ作成入門](https://www.sigbus.info/compilerbook)
* 進捗は[ここ](https://github.com/k28/9cc)
0 件のコメント :
コメントを投稿