Amsterdam Compiler Kit を6800向けに改造する (3) 関数呼び出し
Amsterdam Compiler Kit を改造してMC6800用のコードを出力する試みの3回目。今回は関数呼び出しについて。
引数の受け渡し
スタックフレームの構造については、Amsterdam Compiler Kit を6800向けに改造する (1) スタック構造 で説明した。
ACKの実装では、C言語の関数呼び出しでは右側の引数からスタックに積んでいく。積んだ引数は呼び出し側で消去する。chibicc-6800と同じ手法だ。
(他の言語について、まだ調査していない)
以下のコードをコンパイルしてみる。em codeを逆アセンブルできれば良いのだが、そのようなツールはなさそうなので、6800に落としたコードを見てみよう。
$ cat main.c int sub(int x, int y) { return x+y; } int main(int argc, char **argv) { int a; a = sub(10,20); return 0; }
$ ack -memu6800 -v -v -c.e main.c /opt/pkg/ack/lib/ack/cpp.ansi -D__emu6800 -D__mc6800 -D__emu6800 -D__ACK -I/opt/pkg/ack/share/ack/emu6800/include -I/opt/pkg/ack/share/ack/include/ansi -Dmc6800 -DEM_WSIZE=2 -DEM_PSIZE=2 -DEM_SSIZE=2 -DEM_LSIZE=4 -DEM_FSIZE=4 -DEM_DSIZE=8 -D_EM_WSIZE=2 -D_EM_PSIZE=2 -D_EM_SSIZE=2 -D_EM_LSIZE=4 -D_EM_FSIZE=4 -D_EM_DSIZE=8 main.c /opt/pkg/ack/lib/ack/em_cemcom.ansi -Vw2.2i2.2p2.2f4.2s2.2l4.2d8.2x8.2 -L /tmp/ack.ack-5304e8eb.i /tmp/ack.ack-257b18c9.k /opt/pkg/ack/lib/ack/em_decode /tmp/ack.ack-257b18c9.k shin@ack:~/ack-6800/examples$ ack -memu6800 -v -v -c.s main.c /opt/pkg/ack/lib/ack/cpp.ansi -D__emu6800 -D__mc6800 -D__emu6800 -D__ACK -I/opt/pkg/ack/share/ack/emu6800/include -I/opt/pkg/ack/share/ack/include/ansi -Dmc6800 -DEM_WSIZE=2 -DEM_PSIZE=2 -DEM_SSIZE=2 -DEM_LSIZE=4 -DEM_FSIZE=4 -DEM_DSIZE=8 -D_EM_WSIZE=2 -D_EM_PSIZE=2 -D_EM_SSIZE=2 -D_EM_LSIZE=4 -D_EM_FSIZE=4 -D_EM_DSIZE=8 main.c /opt/pkg/ack/lib/ack/em_cemcom.ansi -Vw2.2i2.2p2.2f4.2s2.2l4.2d8.2x8.2 -L /tmp/ack.ack-1fb6a2ac.i /tmp/ack.ack-69c384ab.k /opt/pkg/ack/lib/ack/em_opt -m8 /tmp/ack.ack-69c384ab.k /opt/pkg/ack/lib/ack/emu6800/cg /tmp/ack.ack-67f4b3fb.m
下記が6800に落ちたコード。関数の戻り値は、ゼロページ上のRETURNという領域に保存される。レジスタ渡しではない。
関数プロローグはPro, エピローグはRetというサブルーチンが処理を行う。LBlはローカル変数と引数を参照するためのポインタ。
LBlは1回目に説明したようにスタックトップ-240(LB-240)を保持している。そのため、実際のアクセスでは、オフセットに+240(+BASE)を行っている。
$ cat main.s .sect .zero .sect .text .sect .rom .sect .data .sect .bss .extern _sub .sect .zero .sect .text _sub: !newilb jsr Pro ldx <LBl ldab BASE+2+1,x ldaa BASE+2+0,x addb BASE+4+1,x adca BASE+4+0,x jmp Ret2 .extern _main .sect .text _main: !newilb jsr Pro ldab #[2].l ldaa #[2].h jsr Lcs pshb psha ! loc ldab #[20].l ldaa #[20].h pshb psha ! loc ldab #[10].l ldaa #[10].h pshb psha jsr _sub ins ins ins ins ldab <RETURN+1 ldaa <RETURN ldx <LBl stab -2+BASE+1,x staa -2+BASE,x clrb clra jmp Ret2
続く
ディスカッション
コメント一覧
まだ、コメントがありません