comparison Idea @ 16:ca0bce3b4810

struct copy
author kono
date Mon, 17 Jan 2000 16:08:16 +0900
parents 595a24e0b90e
children df7fa8cee67b
comparison
equal deleted inserted replaced
15:6667dbd4f718 16:ca0bce3b4810
1084 new-environment() みたいなlibrary があれば、thread にできる。 1084 new-environment() みたいなlibrary があれば、thread にできる。
1085 1085
1086 join は? 1086 join は?
1087 1087
1088 funcall を用意すると良いね。 1088 funcall を用意すると良いね。
1089
1090 Mon Jan 17 15:23:34 JST 2000
1091
1092 struct aa f1() {
1093 return bb;
1094 }
1095
1096 みたいなのは? 関数の型か代入の型を見て、crn にpointerを渡して、
1097 あとでcopyしてから stack を畳む。
1098
1099 # bb=f1(aaa);
1100 movl $bb,%eax
1101 pushl %eax
1102 movl $aaa,%eax
1103 pushl %eax
1104 call main2
1105 popl %edx
1106 copy %eax,%edx,$400
1107 addl $400,%esp
1108 # return a1;
1109
1110 あ、でも、それだと、local変数を返したときに困るね。leave; ret;
1111 してはいけなくて...
1112
1113 あ、やっぱり、こういう場合はコピー先をmain2に引き渡しているみたいね。
1114 void f1(struct aa *ret) {
1115 *ret = bb ;
1116 return;
1117 }
1118 と同じか。これは簡単。
1119 f1().a[55]
1120 みたいな場合は、局所変数に強制的に取ってしまうみたいね。それはそうだ...
1121 が、うちの実装だとちょっと厳しいか。
1122 leal $-sizeof(struct),%esp
1123 pushl %esp
1124 なんだけど、関数呼び出しの途中ではできないから....
1125
1126 # main(ac,av)
1127 # int ac;
1128 .align 2
1129 .globl main
1130 main:
1131 .type main,@function
1132 pushl %ebp
1133 movl %esp,%ebp
1134 pushl %ebx
1135 pushl %ecx
1136 pushl %edx
1137 # char *av[];
1138 # {
1139 # register int i;
1140 # register char *p;
1141 # int j = 3;
1142 # struct { int b; void (*c)(struct aa); } q = {3,main1},r;
1143 #
1144 # j = 3;
1145 subl $20,%esp
1146
1147 このsublを後から指定してやればOk。
1148
1149 でも、それだと jump の時にずれない? ずれるか? ずれるね。うーん。
1150 実行時にチェックしてやるのも変だし。
1151
1152 まぁ、それほど必要な機能ではないんだけど。
1153
1154 これもcontinuationを渡してやると言う手法が使えないことはないんだが...
1155
1156 関数呼び出しの最初にやってやればいいか。それでできるかな?