Amsterdam Compiler Kit を6800向けに改造する (3) 関数呼び出し

BASICMASTER, 昔のパソコン

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

続く


リンク