Mercurial > hg > CbC > old > device
diff Idea @ 16:ca0bce3b4810
struct copy
author | kono |
---|---|
date | Mon, 17 Jan 2000 16:08:16 +0900 |
parents | 595a24e0b90e |
children | df7fa8cee67b |
line wrap: on
line diff
--- a/Idea Mon Jan 17 02:04:48 2000 +0900 +++ b/Idea Mon Jan 17 16:08:16 2000 +0900 @@ -1086,3 +1086,71 @@ join は? funcall を用意すると良いね。 + +Mon Jan 17 15:23:34 JST 2000 + + struct aa f1() { + return bb; + } + +みたいなのは? 関数の型か代入の型を見て、crn にpointerを渡して、 +あとでcopyしてから stack を畳む。 + + # bb=f1(aaa); + movl $bb,%eax + pushl %eax + movl $aaa,%eax + pushl %eax + call main2 + popl %edx + copy %eax,%edx,$400 + addl $400,%esp + # return a1; + +あ、でも、それだと、local変数を返したときに困るね。leave; ret; +してはいけなくて... + +あ、やっぱり、こういう場合はコピー先をmain2に引き渡しているみたいね。 + void f1(struct aa *ret) { + *ret = bb ; + return; + } +と同じか。これは簡単。 + f1().a[55] +みたいな場合は、局所変数に強制的に取ってしまうみたいね。それはそうだ... +が、うちの実装だとちょっと厳しいか。 + leal $-sizeof(struct),%esp + pushl %esp +なんだけど、関数呼び出しの途中ではできないから.... + + # main(ac,av) + # int ac; + .align 2 + .globl main + main: + .type main,@function + pushl %ebp + movl %esp,%ebp + pushl %ebx + pushl %ecx + pushl %edx + # char *av[]; + # { + # register int i; + # register char *p; + # int j = 3; + # struct { int b; void (*c)(struct aa); } q = {3,main1},r; + # + # j = 3; + subl $20,%esp + +このsublを後から指定してやればOk。 + +でも、それだと jump の時にずれない? ずれるか? ずれるね。うーん。 +実行時にチェックしてやるのも変だし。 + +まぁ、それほど必要な機能ではないんだけど。 + +これもcontinuationを渡してやると言う手法が使えないことはないんだが... + +関数呼び出しの最初にやってやればいいか。それでできるかな?