集成体の返却実装

タプルを関数の戻り値にすることができるようにした。パターンマッチで値が取り出せる為、下のように多値返却として利用することもできる。

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。