集成体の返却実装
タプルを関数の戻り値にすることができるようにした。パターンマッチで値が取り出せる為、下のように多値返却として利用することもできる。
return_tuple: () { return (1, 2) }; export main: () { (a, b) : return_tuple(); syscall(a, b); }
下のようなコードになる。
.text _return_tuple.LT0T2ii: pushl %ebp movl %esp, %ebp movl 8(%ebp), %eax // 戻り値を書き込む場所のアドレス movl $1, (%eax) movl $2, 4(%eax) leave ret .global main main: pushl %ebp movl %esp, %ebp subl $12, %esp // スタック上に戻り値の為の領域確保 leal 4(%esp), %eax // アドレス取得 movl %eax, (%esp) // アドレスを引数として渡す call _return_tuple.LT0T2ii movl 4(%esp), %eax movl 8(%esp), %ebx int $128 leave ret
呼び出し側が返却値の為の領域を用意するという意味で、C言語と同じ方法。本当は一気に領域確保しないで、細かく管理すべきなんだろうけどとりあえず動いたのでOK。