source: dev/BasicCompiler32/Compile_Set_Var.cpp@ 63

Last change on this file since 63 was 63, checked in by dai_9181, 17 years ago

CClass::GetSize、CClass::GetMemberOffsetを追加

File size: 23.5 KB
Line 
1#include "../BasicCompiler_Common/common.h"
2#include "Opcode.h"
3
4BOOL IsUse_ecx(RELATIVE_VAR *pRelativeVar){
5 if(pRelativeVar->bOffsetOffset||pRelativeVar->dwKind==VAR_DIRECTMEM) return 1;
6 return 0;
7}
8
9void SetObjectVariable(LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,BOOL bUseHeap){
10 ///////////////////////////////////////////////////////////////////
11 // オペレータ '=' のオーバーロード関数を呼ぶ
12 ///////////////////////////////////////////////////////////////////
13
14 int type[10];
15 LONG_PTR index_stack[10];
16 BOOL array_bUseHeap[10];
17 int sp=2;
18
19 //左辺
20 type[0]=DEF_OBJECT;
21 index_stack[0]=lpVarIndex;
22 array_bUseHeap[0]=0;
23
24 //右辺
25 type[1]=CalcType;
26 index_stack[1]=lpCalcIndex;
27 array_bUseHeap[1]=bUseHeap;
28
29 int iRet;
30 iRet=CallOperatorProc(CALC_SUBSITUATION,NULL,type,index_stack,array_bUseHeap,sp);
31 if(iRet==-1||iRet==1){
32 //成功したとき、またはエラーが発行されたとき
33 return;
34 }
35
36
37 if( CalcType == DEF_OBJECT ){
38 CClass *pVarClass = (CClass *)lpVarIndex;
39 CClass *pCalcClass = (CClass *)lpCalcIndex;
40
41
42 if( pVarClass->IsEquals( pCalcClass ) //等しい
43 || pVarClass->IsSubClass( pCalcClass ) ){ //派生・継承関係
44
45 //双方のオブジェクト型が一致、または派生・継承関係にあるとき
46 //※コピーを行う
47
48 int object_size = pVarClass->GetSize();
49
50 //mov ecx,object_size
51 op_mov_RV(REG_ECX,object_size);
52
53 //pop esi
54 op_pop(REG_ESI);
55
56 //pop edi
57 op_pop(REG_EDI);
58
59 if(bUseHeap){
60 //mov eax,esi
61 op_mov_RR(REG_EAX,REG_ESI);
62 }
63
64 //rep movs byte ptr[edi],byte ptr[esi]
65 op_rep_movs(sizeof(BYTE));
66
67 if(bUseHeap){
68 //push eax
69 op_push(REG_EAX);
70
71 //call free
72 extern SUBINFO *pSub_free;
73 op_call(pSub_free);
74 }
75
76 return;
77 }
78 }
79
80 SetError(1,NULL,cp);
81}
82
83void SetDoubleVariable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset){
84 ChangeTypeToDouble(type);
85
86 //pop ebx
87 op_pop(REG_EBX);
88
89 //pop eax
90 op_pop(REG_EAX);
91
92 if(VarKind==VAR_GLOBAL){
93 if(bOffsetOffset){
94 //mov dword ptr[ecx+offset],ebx
95 OpBuffer[obp++]=(char)0x89;
96 OpBuffer[obp++]=(char)0x99;
97 *((long *)(OpBuffer+obp))=offset;
98 pobj_GlobalVarSchedule->add();
99 obp+=sizeof(long);
100
101 //mov dword ptr[ecx+offset+sizeof(long)],eax
102 OpBuffer[obp++]=(char)0x89;
103 OpBuffer[obp++]=(char)0x81;
104 *((long *)(OpBuffer+obp))=offset+sizeof(long);
105 pobj_GlobalVarSchedule->add();
106 obp+=sizeof(long);
107 }
108 else{
109 //mov dword ptr[offset],ebx
110 OpBuffer[obp++]=(char)0x89;
111 OpBuffer[obp++]=(char)0x1D;
112 *((long *)(OpBuffer+obp))=offset;
113 pobj_GlobalVarSchedule->add();
114 obp+=sizeof(long);
115
116 //mov dword ptr[offset+sizeof(long)],eax
117 OpBuffer[obp++]=(char)0xA3;
118 *((long *)(OpBuffer+obp))=offset+sizeof(long);
119 pobj_GlobalVarSchedule->add();
120 obp+=sizeof(long);
121 }
122 }
123 else if( VarKind==VAR_REFGLOBAL ){
124 SetError(300,NULL,cp);
125 }
126 else if(VarKind==VAR_LOCAL){
127 if(bOffsetOffset){
128 //add ecx,offset
129 OpBuffer[obp++]=(char)0x81;
130 OpBuffer[obp++]=(char)0xC1;
131 *((long *)(OpBuffer+obp))=offset;
132 AddLocalVarAddrSchedule();
133 obp+=sizeof(long);
134
135 //mov dword ptr[ebp+ecx],ebx
136 OpBuffer[obp++]=(char)0x89;
137 OpBuffer[obp++]=(char)0x5C;
138 OpBuffer[obp++]=(char)0x0D;
139 OpBuffer[obp++]=(char)0x00;
140
141 //add ecx,sizeof(long)
142 OpBuffer[obp++]=(char)0x83;
143 OpBuffer[obp++]=(char)0xC1;
144 OpBuffer[obp++]=(char)0x04;
145
146 //mov dword ptr[ebp+ecx],eax
147 OpBuffer[obp++]=(char)0x89;
148 OpBuffer[obp++]=(char)0x44;
149 OpBuffer[obp++]=(char)0x0D;
150 OpBuffer[obp++]=(char)0x00;
151 }
152 else{
153 //mov dword ptr[ebp+offset],ebx
154 OpBuffer[obp++]=(char)0x89;
155 OpBuffer[obp++]=(char)0x9D;
156 *((long *)(OpBuffer+obp))=offset;
157 AddLocalVarAddrSchedule();
158 obp+=sizeof(long);
159
160 //mov dword ptr[ebp+offset+sizeof(long)],eax
161 OpBuffer[obp++]=(char)0x89;
162 OpBuffer[obp++]=(char)0x85;
163 *((long *)(OpBuffer+obp))=offset+sizeof(long);
164 AddLocalVarAddrSchedule();
165 obp+=sizeof(long);
166 }
167 }
168 else if(VarKind==VAR_REFLOCAL){
169 if(bOffsetOffset){
170 //add ecx,dword ptr[ebp+offset]
171 OpBuffer[obp++]=(char)0x03;
172 OpBuffer[obp++]=(char)0x8D;
173 *((long *)(OpBuffer+obp))=offset;
174 AddLocalVarAddrSchedule();
175 obp+=sizeof(long);
176 }
177 else{
178 //mov ecx,dword ptr[ebp+offset]
179 OpBuffer[obp++]=(char)0x8B;
180 OpBuffer[obp++]=(char)0x8D;
181 *((long *)(OpBuffer+obp))=offset;
182 AddLocalVarAddrSchedule();
183 obp+=sizeof(long);
184 }
185
186 //mov dword ptr[ecx],ebx
187 OpBuffer[obp++]=(char)0x89;
188 OpBuffer[obp++]=(char)0x19;
189
190 //mov dword ptr[ecx+sizeof(long)],eax
191 OpBuffer[obp++]=(char)0x89;
192 OpBuffer[obp++]=(char)0x41;
193 OpBuffer[obp++]=(char)0x04;
194 }
195 else if(VarKind==VAR_DIRECTMEM){
196 //mov dword ptr[ecx],ebx
197 OpBuffer[obp++]=(char)0x89;
198 OpBuffer[obp++]=(char)0x19;
199
200 //mov dword ptr[ecx+sizeof(long)],eax
201 OpBuffer[obp++]=(char)0x89;
202 OpBuffer[obp++]=(char)0x41;
203 OpBuffer[obp++]=(char)0x04;
204 }
205}
206void SetSingleVariable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset){
207 if(type==DEF_SINGLE){
208 //32ビット変数としてそのままコピーする
209 SetDWordVariable(DEF_DWORD,VarKind,offset,bOffsetOffset);
210 return;
211 }
212
213 if(type==DEF_DOUBLE){
214 //fld qword ptr[esp]
215 op_fld_ptr_esp(DEF_DOUBLE);
216
217 //add esp,8
218 op_add_esp(8);
219 }
220 else if(type==DEF_INT64||type==DEF_QWORD){
221 //64ビット整数
222
223 //fild qword ptr[esp]
224 op_fld_ptr_esp(DEF_INT64);
225
226 //add esp,8
227 op_add_esp(8);
228 }
229 else if(IsSignedType(type)){
230 //符号あり整数
231
232 //fild dword ptr[esp]
233 op_fld_ptr_esp(DEF_LONG);
234
235 //add esp,4
236 op_add_esp(4);
237 }
238 else{
239 if(!IsWholeNumberType(type)){
240 //不正な型の場合
241 SetError(9,NULL,cp);
242 return;
243 }
244
245 //符号なし整数
246
247 //pop eax
248 op_pop(REG_EAX);
249
250 //push 0
251 op_push_value(0);
252
253 //push eax
254 op_push(REG_EAX);
255
256 //fild qword ptr[esp]
257 OpBuffer[obp++]=(char)0xDF;
258 OpBuffer[obp++]=(char)0x2C;
259 OpBuffer[obp++]=(char)0x24;
260
261 //add esp,8
262 op_add_esp(8);
263 }
264
265 if(VarKind==VAR_GLOBAL){
266 if(bOffsetOffset){
267 //fstp dword ptr[ecx+offset]
268 OpBuffer[obp++]=(char)0xD9;
269 OpBuffer[obp++]=(char)0x99;
270 *((long *)(OpBuffer+obp))=offset;
271 pobj_GlobalVarSchedule->add();
272 obp+=sizeof(long);
273 }
274 else{
275 //fstp dword ptr[offset]
276 OpBuffer[obp++]=(char)0xD9;
277 OpBuffer[obp++]=(char)0x1D;
278 *((long *)(OpBuffer+obp))=offset;
279 pobj_GlobalVarSchedule->add();
280 obp+=sizeof(long);
281 }
282 }
283 else if( VarKind==VAR_REFGLOBAL ){
284 SetError(300,NULL,cp);
285 }
286 else if(VarKind==VAR_LOCAL){
287 if(bOffsetOffset){
288 //add ecx,offset
289 OpBuffer[obp++]=(char)0x81;
290 OpBuffer[obp++]=(char)0xC1;
291 *((long *)(OpBuffer+obp))=offset;
292 AddLocalVarAddrSchedule();
293 obp+=sizeof(long);
294
295 //fstp dword ptr[ebp+ecx]
296 OpBuffer[obp++]=(char)0xD9;
297 OpBuffer[obp++]=(char)0x5C;
298 OpBuffer[obp++]=(char)0x0D;
299 OpBuffer[obp++]=(char)0x00;
300 }
301 else{
302 //fstp dword ptr[ebp+offset]
303 OpBuffer[obp++]=(char)0xD9;
304 OpBuffer[obp++]=(char)0x9D;
305 *((long *)(OpBuffer+obp))=offset;
306 AddLocalVarAddrSchedule();
307 obp+=sizeof(long);
308 }
309 }
310 else if(VarKind==VAR_REFLOCAL){
311 //mov eax,dword ptr[ebp+offset]
312 OpBuffer[obp++]=(char)0x8B;
313 OpBuffer[obp++]=(char)0x85;
314 *((long *)(OpBuffer+obp))=offset;
315 AddLocalVarAddrSchedule();
316 obp+=sizeof(long);
317
318 if(bOffsetOffset){
319 //add eax,ecx
320 OpBuffer[obp++]=(char)0x03;
321 OpBuffer[obp++]=(char)0xC1;
322 }
323
324 //fstp dword ptr[eax]
325 OpBuffer[obp++]=(char)0xD9;
326 OpBuffer[obp++]=(char)0x18;
327 }
328 else if(VarKind==VAR_DIRECTMEM){
329 //fstp dword ptr[ecx]
330 OpBuffer[obp++]=(char)0xD9;
331 OpBuffer[obp++]=(char)0x19;
332 }
333}
334void SetInt64Variable(int type,RELATIVE_VAR *pRelative){
335 if(type==DEF_DOUBLE){
336 //fld qword ptr[esp]
337 op_fld_ptr_esp(DEF_DOUBLE);
338
339 //fistp qword ptr[esp]
340 fpu_cast();
341 OpBuffer[obp++]=(char)0xDF;
342 OpBuffer[obp++]=(char)0x3C;
343 OpBuffer[obp++]=(char)0x24;
344 fpu_cast_end();
345
346 //pop eax
347 op_pop(REG_EAX);
348
349 //pop edx
350 op_pop(REG_EDX);
351 }
352 else if(type==DEF_SINGLE){
353 //fld dword ptr[esp]
354 op_fld_ptr_esp(DEF_SINGLE);
355
356 //sub esp,4
357 op_sub_esp(4);
358
359 //fistp qword ptr[esp]
360 fpu_cast();
361 OpBuffer[obp++]=(char)0xDF;
362 OpBuffer[obp++]=(char)0x3C;
363 OpBuffer[obp++]=(char)0x24;
364 fpu_cast_end();
365
366 //pop eax
367 op_pop(REG_EAX);
368
369 //pop edx
370 op_pop(REG_EDX);
371 }
372 else if(type==DEF_INT64||type==DEF_QWORD){
373 //pop eax
374 op_pop(REG_EAX);
375
376 //pop edx
377 op_pop(REG_EDX);
378 }
379 else if(IsSignedType(type)){
380 //符号拡張
381 //edx:eax ← eax
382
383 //pop eax
384 op_pop(REG_EAX);
385
386 //cdq
387 op_cdq();
388 }
389 else{
390 if(!IsWholeNumberType(type)){
391 //不正な型の場合
392 SetError(9,NULL,cp);
393 return;
394 }
395
396 //符号拡張
397 //edx=0:eax
398
399 //pop eax
400 op_pop(REG_EAX);
401
402 //xor edx,edx
403 op_zero_reg(REG_EDX);
404 }
405
406 if(pRelative->dwKind==VAR_GLOBAL){
407 if(pRelative->bOffsetOffset){
408 //mov dword ptr[ecx+offset],eax
409 OpBuffer[obp++]=(char)0x89;
410 OpBuffer[obp++]=(char)0x81;
411 *((long *)(OpBuffer+obp))=pRelative->offset;
412 pobj_GlobalVarSchedule->add();
413 obp+=sizeof(long);
414
415 //mov dword ptr[ecx+offset+sizeof(long)],edx
416 OpBuffer[obp++]=(char)0x89;
417 OpBuffer[obp++]=(char)0x91;
418 *((long *)(OpBuffer+obp))=pRelative->offset+sizeof(long);
419 pobj_GlobalVarSchedule->add();
420 obp+=sizeof(long);
421 }
422 else{
423 //mov dword ptr[offset],eax
424 OpBuffer[obp++]=(char)0xA3;
425 *((long *)(OpBuffer+obp))=pRelative->offset;
426 pobj_GlobalVarSchedule->add();
427 obp+=sizeof(long);
428
429 //mov dword ptr[offset+sizeof(long)],edx
430 OpBuffer[obp++]=(char)0x89;
431 OpBuffer[obp++]=(char)0x15;
432 *((long *)(OpBuffer+obp))=pRelative->offset+sizeof(DWORD);
433 pobj_GlobalVarSchedule->add();
434 obp+=sizeof(long);
435 }
436 }
437 else if(pRelative->dwKind==VAR_REFLOCAL){
438 if(pRelative->bOffsetOffset){
439 //add ecx,dword ptr[offset]
440 op_add_RM( sizeof(long), REG_ECX, REG_NON, (int)pRelative->offset, MOD_DISP32 );
441 }
442 else{
443 //mov ecx,dword ptr[offset]
444 op_mov_RM( sizeof(long), REG_ECX, REG_NON, (int)pRelative->offset, MOD_DISP32 );
445 }
446 obp-=sizeof(long);
447 pobj_GlobalVarSchedule->add();
448 obp+=sizeof(long);
449
450 //mov dword ptr[ecx],eax
451 OpBuffer[obp++]=(char)0x89;
452 OpBuffer[obp++]=(char)0x01;
453
454 //mov dword ptr[ecx+sizeof(long)],edx
455 OpBuffer[obp++]=(char)0x89;
456 OpBuffer[obp++]=(char)0x51;
457 OpBuffer[obp++]=(char)0x04;
458 }
459 else if(pRelative->dwKind==VAR_LOCAL){
460 if(pRelative->bOffsetOffset){
461 //add ecx,offset
462 OpBuffer[obp++]=(char)0x81;
463 OpBuffer[obp++]=(char)0xC1;
464 *((long *)(OpBuffer+obp))=pRelative->offset;
465 AddLocalVarAddrSchedule();
466 obp+=sizeof(long);
467
468 //mov dword ptr[ebp+ecx],eax
469 OpBuffer[obp++]=(char)0x89;
470 OpBuffer[obp++]=(char)0x44;
471 OpBuffer[obp++]=(char)0x0D;
472 OpBuffer[obp++]=(char)0x00;
473
474 //add ecx,sizeof(long)
475 OpBuffer[obp++]=(char)0x83;
476 OpBuffer[obp++]=(char)0xC1;
477 OpBuffer[obp++]=(char)0x04;
478
479 //mov dword ptr[ebp+ecx],edx
480 OpBuffer[obp++]=(char)0x89;
481 OpBuffer[obp++]=(char)0x54;
482 OpBuffer[obp++]=(char)0x0D;
483 OpBuffer[obp++]=(char)0x00;
484 }
485 else{
486 //mov dword ptr[ebp+offset],eax
487 OpBuffer[obp++]=(char)0x89;
488 OpBuffer[obp++]=(char)0x85;
489 *((long *)(OpBuffer+obp))=pRelative->offset;
490 AddLocalVarAddrSchedule();
491 obp+=sizeof(long);
492
493 //mov dword ptr[ebp+offset+sizeof(long)],edx
494 OpBuffer[obp++]=(char)0x89;
495 OpBuffer[obp++]=(char)0x95;
496 *((long *)(OpBuffer+obp))=pRelative->offset+sizeof(long);
497 AddLocalVarAddrSchedule();
498 obp+=sizeof(long);
499 }
500 }
501 else if(pRelative->dwKind==VAR_REFLOCAL){
502 if(pRelative->bOffsetOffset){
503 //add ecx,dword ptr[ebp+offset]
504 OpBuffer[obp++]=(char)0x03;
505 OpBuffer[obp++]=(char)0x8D;
506 *((long *)(OpBuffer+obp))=pRelative->offset;
507 AddLocalVarAddrSchedule();
508 obp+=sizeof(long);
509 }
510 else{
511 //mov ecx,dword ptr[ebp+offset]
512 OpBuffer[obp++]=(char)0x8B;
513 OpBuffer[obp++]=(char)0x8D;
514 *((long *)(OpBuffer+obp))=pRelative->offset;
515 AddLocalVarAddrSchedule();
516 obp+=sizeof(long);
517 }
518
519 //mov dword ptr[ecx],eax
520 OpBuffer[obp++]=(char)0x89;
521 OpBuffer[obp++]=(char)0x01;
522
523 //mov dword ptr[ecx+sizeof(long)],edx
524 OpBuffer[obp++]=(char)0x89;
525 OpBuffer[obp++]=(char)0x51;
526 OpBuffer[obp++]=(char)0x04;
527 }
528 else if(pRelative->dwKind==VAR_DIRECTMEM){
529 //mov dword ptr[ecx],eax
530 OpBuffer[obp++]=(char)0x89;
531 OpBuffer[obp++]=(char)0x01;
532
533 //mov dword ptr[ecx+sizeof(long)],edx
534 OpBuffer[obp++]=(char)0x89;
535 OpBuffer[obp++]=(char)0x51;
536 OpBuffer[obp++]=(char)0x04;
537 }
538}
539void SetDWordVariable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset){
540 if(type==DEF_DOUBLE||type==DEF_SINGLE){
541 if(type==DEF_DOUBLE){
542 //fld qword ptr[esp]
543 op_fld_ptr_esp(DEF_DOUBLE);
544 }
545 else if(type==DEF_SINGLE){
546 //fld dword ptr[esp]
547 op_fld_ptr_esp(DEF_SINGLE);
548
549 //sub esp,4
550 op_sub_esp(4);
551 }
552
553 //fistp qword ptr[esp]
554 fpu_cast();
555 OpBuffer[obp++]=(char)0xDF;
556 OpBuffer[obp++]=(char)0x3C;
557 OpBuffer[obp++]=(char)0x24;
558 fpu_cast_end();
559
560 //pop eax
561 op_pop(REG_EAX);
562
563 //add esp,4
564 op_add_esp(4);
565 }
566 else if(type==DEF_INT64||type==DEF_QWORD){
567 //pop eax
568 op_pop(REG_EAX);
569
570 //add esp,4
571 op_add_esp(4);
572 }
573 else{
574 if(!IsWholeNumberType(type)){
575 //不正な型の場合
576 SetError(9,NULL,cp);
577 return;
578 }
579
580 ChangeTypeToWhole(type,DEF_LONG);
581
582 //pop eax
583 op_pop(REG_EAX);
584 }
585
586 if(VarKind==VAR_GLOBAL){
587 if(bOffsetOffset){
588 //mov dword ptr[ecx+offset],eax
589 OpBuffer[obp++]=(char)0x89;
590 OpBuffer[obp++]=(char)0x81;
591 *((long *)(OpBuffer+obp))=offset;
592 pobj_GlobalVarSchedule->add();
593 obp+=sizeof(long);
594 }
595 else{
596 //mov dword ptr[offset],eax
597 OpBuffer[obp++]=(char)0xA3;
598 *((long *)(OpBuffer+obp))=offset;
599 pobj_GlobalVarSchedule->add();
600 obp+=sizeof(long);
601 }
602 }
603 else if(VarKind==VAR_REFGLOBAL){
604 if(bOffsetOffset){
605 //add ecx,dword ptr[offset]
606 op_add_RM( sizeof(long), REG_ECX, REG_NON, (int)offset, MOD_DISP32 );
607 }
608 else{
609 //mov ecx,dword ptr[offset]
610 op_mov_RM( sizeof(long), REG_ECX, REG_NON, (int)offset, MOD_DISP32 );
611 }
612 obp-=sizeof(long);
613 pobj_GlobalVarSchedule->add();
614 obp+=sizeof(long);
615
616 //mov dword ptr[ecx],eax
617 OpBuffer[obp++]=(char)0x89;
618 OpBuffer[obp++]=(char)0x01;
619 }
620 else if(VarKind==VAR_LOCAL){
621 if(bOffsetOffset){
622 //add ecx,offset
623 OpBuffer[obp++]=(char)0x81;
624 OpBuffer[obp++]=(char)0xC1;
625 *((long *)(OpBuffer+obp))=offset;
626 AddLocalVarAddrSchedule();
627 obp+=sizeof(long);
628
629 //mov dword ptr[ebp+ecx],eax
630 OpBuffer[obp++]=(char)0x89;
631 OpBuffer[obp++]=(char)0x44;
632 OpBuffer[obp++]=(char)0x0D;
633 OpBuffer[obp++]=(char)0x00;
634 }
635 else{
636 //mov dword ptr[ebp+offset],eax
637 OpBuffer[obp++]=(char)0x89;
638 OpBuffer[obp++]=(char)0x85;
639 *((long *)(OpBuffer+obp))=offset;
640 AddLocalVarAddrSchedule();
641 obp+=sizeof(long);
642 }
643 }
644 else if(VarKind==VAR_REFLOCAL){
645 if(bOffsetOffset){
646 //add ecx,dword ptr[ebp+offset]
647 OpBuffer[obp++]=(char)0x03;
648 OpBuffer[obp++]=(char)0x8D;
649 *((long *)(OpBuffer+obp))=offset;
650 AddLocalVarAddrSchedule();
651 obp+=sizeof(long);
652 }
653 else{
654 //mov ecx,dword ptr[ebp+offset]
655 OpBuffer[obp++]=(char)0x8B;
656 OpBuffer[obp++]=(char)0x8D;
657 *((long *)(OpBuffer+obp))=offset;
658 AddLocalVarAddrSchedule();
659 obp+=sizeof(long);
660 }
661
662 //mov dword ptr[ecx],eax
663 OpBuffer[obp++]=(char)0x89;
664 OpBuffer[obp++]=(char)0x01;
665 }
666 else if(VarKind==VAR_DIRECTMEM){
667 //mov dword ptr[ecx],eax
668 OpBuffer[obp++]=(char)0x89;
669 OpBuffer[obp++]=(char)0x01;
670 }
671}
672void SetLongVariable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset){
673 if(type==DEF_DOUBLE||type==DEF_SINGLE){
674 if(type==DEF_DOUBLE){
675 //fld qword ptr[esp]
676 op_fld_ptr_esp(DEF_DOUBLE);
677
678 //add esp,8
679 op_add_esp(8);
680 }
681 else if(type==DEF_SINGLE){
682 //fld dword ptr[esp]
683 op_fld_ptr_esp(DEF_SINGLE);
684
685 //add esp,4
686 op_add_esp(4);
687 }
688
689 if(VarKind==VAR_GLOBAL){
690 if(bOffsetOffset){
691 //fistp dword ptr[ecx+offset]
692 fpu_cast();
693 OpBuffer[obp++]=(char)0xDB;
694 OpBuffer[obp++]=(char)0x99;
695 *((long *)(OpBuffer+obp))=offset;
696 pobj_GlobalVarSchedule->add();
697 obp+=sizeof(long);
698 fpu_cast_end();
699 }
700 else{
701 //fistp dword ptr[offset]
702 fpu_cast();
703 OpBuffer[obp++]=(char)0xDB;
704 OpBuffer[obp++]=(char)0x1D;
705 *((long *)(OpBuffer+obp))=offset;
706 pobj_GlobalVarSchedule->add();
707 obp+=sizeof(long);
708 fpu_cast_end();
709 }
710 }
711 else if(VarKind==VAR_REFGLOBAL){
712 //mov eax,dword ptr[offset]
713 op_mov_RM( sizeof(long), REG_EAX, REG_NON, (int)offset, MOD_DISP32 );
714 obp-=sizeof(long);
715 pobj_GlobalVarSchedule->add();
716 obp+=sizeof(long);
717
718 if(bOffsetOffset){
719 //add eax,ecx
720 OpBuffer[obp++]=(char)0x03;
721 OpBuffer[obp++]=(char)0xC1;
722 }
723
724 //fistp dword ptr[eax]
725 fpu_cast();
726 OpBuffer[obp++]=(char)0xDB;
727 OpBuffer[obp++]=(char)0x18;
728 fpu_cast_end();
729 }
730 else if(VarKind==VAR_LOCAL){
731 if(bOffsetOffset){
732 //add ecx,offset
733 OpBuffer[obp++]=(char)0x81;
734 OpBuffer[obp++]=(char)0xC1;
735 *((long *)(OpBuffer+obp))=offset;
736 AddLocalVarAddrSchedule();
737 obp+=sizeof(long);
738
739 //fistp dword ptr[ebp+ecx]
740 fpu_cast();
741 OpBuffer[obp++]=(char)0xDB;
742 OpBuffer[obp++]=(char)0x5C;
743 OpBuffer[obp++]=(char)0x0D;
744 OpBuffer[obp++]=(char)0x00;
745 fpu_cast_end();
746 }
747 else{
748 //fistp dword ptr[ebp+offset]
749 fpu_cast();
750 OpBuffer[obp++]=(char)0xDB;
751 OpBuffer[obp++]=(char)0x9D;
752 *((long *)(OpBuffer+obp))=offset;
753 AddLocalVarAddrSchedule();
754 obp+=sizeof(long);
755 fpu_cast_end();
756 }
757 }
758 else if(VarKind==VAR_REFLOCAL){
759 //mov eax,dword ptr[ebp+offset]
760 OpBuffer[obp++]=(char)0x8B;
761 OpBuffer[obp++]=(char)0x85;
762 *((long *)(OpBuffer+obp))=offset;
763 AddLocalVarAddrSchedule();
764 obp+=sizeof(long);
765
766 if(bOffsetOffset){
767 //add eax,ecx
768 OpBuffer[obp++]=(char)0x03;
769 OpBuffer[obp++]=(char)0xC1;
770 }
771
772 //fistp dword ptr[eax]
773 fpu_cast();
774 OpBuffer[obp++]=(char)0xDB;
775 OpBuffer[obp++]=(char)0x18;
776 fpu_cast_end();
777 }
778 else if(VarKind==VAR_DIRECTMEM){
779 //fistp dword ptr[ecx]
780 fpu_cast();
781 OpBuffer[obp++]=(char)0xDB;
782 OpBuffer[obp++]=(char)0x19;
783 fpu_cast_end();
784 }
785 }
786 else{
787 //実数以外の型からの代入処理はDWordのものと同様
788 SetDWordVariable(type,VarKind,offset,bOffsetOffset);
789 }
790}
791void Set16Variable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset){
792 ChangeTypeToWhole(type,DEF_INTEGER);
793
794 //pop eax
795 op_pop(REG_EAX);
796
797 if(VarKind==VAR_GLOBAL){
798 if(bOffsetOffset){
799 //mov word ptr[ecx+offset],ax
800 OpBuffer[obp++]=(char)0x66;
801 OpBuffer[obp++]=(char)0x89;
802 OpBuffer[obp++]=(char)0x81;
803 *((long *)(OpBuffer+obp))=offset;
804 pobj_GlobalVarSchedule->add();
805 obp+=sizeof(long);
806 }
807 else{
808 //mov word ptr[offset],ax
809 OpBuffer[obp++]=(char)0x66;
810 OpBuffer[obp++]=(char)0xA3;
811 *((long *)(OpBuffer+obp))=offset;
812 pobj_GlobalVarSchedule->add();
813 obp+=sizeof(long);
814 }
815 }
816 else if(VarKind==VAR_REFGLOBAL){
817 //mov ebx,dword ptr[offset]
818 op_mov_RM( sizeof(long), REG_EBX, REG_NON, (int)offset, MOD_DISP32 );
819 obp-=sizeof(long);
820 pobj_GlobalVarSchedule->add();
821 obp+=sizeof(long);
822
823 if(bOffsetOffset){
824 //add ebx,ecx
825 OpBuffer[obp++]=(char)0x03;
826 OpBuffer[obp++]=(char)0xD9;
827 }
828
829 //mov word ptr[ebx],ax
830 OpBuffer[obp++]=(char)0x66;
831 OpBuffer[obp++]=(char)0x89;
832 OpBuffer[obp++]=(char)0x03;
833 }
834 else if(VarKind==VAR_LOCAL){
835 if(bOffsetOffset){
836 //add ecx,offset
837 OpBuffer[obp++]=(char)0x81;
838 OpBuffer[obp++]=(char)0xC1;
839 *((long *)(OpBuffer+obp))=offset;
840 AddLocalVarAddrSchedule();
841 obp+=sizeof(long);
842
843 //mov word ptr[ebp+ecx],ax
844 OpBuffer[obp++]=(char)0x66;
845 OpBuffer[obp++]=(char)0x89;
846 OpBuffer[obp++]=(char)0x44;
847 OpBuffer[obp++]=(char)0x0D;
848 OpBuffer[obp++]=(char)0x00;
849 }
850 else{
851 //mov word ptr[ebp+offset],ax
852 OpBuffer[obp++]=(char)0x66;
853 OpBuffer[obp++]=(char)0x89;
854 OpBuffer[obp++]=(char)0x85;
855 *((long *)(OpBuffer+obp))=offset;
856 AddLocalVarAddrSchedule();
857 obp+=sizeof(long);
858 }
859 }
860 else if(VarKind==VAR_REFLOCAL){
861 //mov ebx,dword ptr[ebp+offset]
862 OpBuffer[obp++]=(char)0x8B;
863 OpBuffer[obp++]=(char)0x9D;
864 *((long *)(OpBuffer+obp))=offset;
865 AddLocalVarAddrSchedule();
866 obp+=sizeof(long);
867
868 if(bOffsetOffset){
869 //add ebx,ecx
870 OpBuffer[obp++]=(char)0x03;
871 OpBuffer[obp++]=(char)0xD9;
872 }
873
874 //mov word ptr[ebx],ax
875 OpBuffer[obp++]=(char)0x66;
876 OpBuffer[obp++]=(char)0x89;
877 OpBuffer[obp++]=(char)0x03;
878 }
879 else if(VarKind==VAR_DIRECTMEM){
880 //mov word ptr[ecx],ax
881 OpBuffer[obp++]=(char)0x66;
882 OpBuffer[obp++]=(char)0x89;
883 OpBuffer[obp++]=(char)0x01;
884 }
885}
886void Set8Variable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset){
887 ChangeTypeToWhole(type,DEF_SBYTE);
888
889 //pop eax
890 op_pop(REG_EAX);
891
892 if(VarKind==VAR_GLOBAL){
893 if(bOffsetOffset){
894 //mov byte ptr[ecx+offset],al
895 OpBuffer[obp++]=(char)0x88;
896 OpBuffer[obp++]=(char)0x81;
897 *((long *)(OpBuffer+obp))=offset;
898 pobj_GlobalVarSchedule->add();
899 obp+=sizeof(long);
900 }
901 else{
902 //mov byte ptr[offset],al
903 OpBuffer[obp++]=(char)0xA2;
904 *((long *)(OpBuffer+obp))=offset;
905 pobj_GlobalVarSchedule->add();
906 obp+=sizeof(long);
907 }
908 }
909 else if(VarKind==VAR_REFGLOBAL){
910 //mov ebx,dword ptr[offset]
911 op_mov_RM( sizeof(long), REG_EBX, REG_NON, (int)offset, MOD_DISP32 );
912 obp-=sizeof(long);
913 pobj_GlobalVarSchedule->add();
914 obp+=sizeof(long);
915
916 if(bOffsetOffset){
917 //add ebx,ecx
918 OpBuffer[obp++]=(char)0x03;
919 OpBuffer[obp++]=(char)0xD9;
920 }
921
922 //mov byte ptr[ebx],al
923 OpBuffer[obp++]=(char)0x88;
924 OpBuffer[obp++]=(char)0x03;
925 }
926 else if(VarKind==VAR_LOCAL){
927 if(bOffsetOffset){
928 //add ecx,offset
929 OpBuffer[obp++]=(char)0x81;
930 OpBuffer[obp++]=(char)0xC1;
931 *((long *)(OpBuffer+obp))=offset;
932 AddLocalVarAddrSchedule();
933 obp+=sizeof(long);
934
935 //mov byte ptr[ebp+ecx],al
936 OpBuffer[obp++]=(char)0x88;
937 OpBuffer[obp++]=(char)0x44;
938 OpBuffer[obp++]=(char)0x0D;
939 OpBuffer[obp++]=(char)0x00;
940 }
941 else{
942 //mov byte ptr[ebp+offset],al
943 OpBuffer[obp++]=(char)0x88;
944 OpBuffer[obp++]=(char)0x85;
945 *((long *)(OpBuffer+obp))=offset;
946 AddLocalVarAddrSchedule();
947 obp+=sizeof(long);
948 }
949 }
950 else if(VarKind==VAR_REFLOCAL){
951 //mov ebx,dword ptr[ebp+offset]
952 OpBuffer[obp++]=(char)0x8B;
953 OpBuffer[obp++]=(char)0x9D;
954 *((long *)(OpBuffer+obp))=offset;
955 AddLocalVarAddrSchedule();
956 obp+=sizeof(long);
957
958 if(bOffsetOffset){
959 //add ebx,ecx
960 OpBuffer[obp++]=(char)0x03;
961 OpBuffer[obp++]=(char)0xD9;
962 }
963
964 //mov byte ptr[ebx],al
965 OpBuffer[obp++]=(char)0x88;
966 OpBuffer[obp++]=(char)0x03;
967 }
968 else if(VarKind==VAR_DIRECTMEM){
969 //mov byte ptr[ecx],al
970 OpBuffer[obp++]=(char)0x88;
971 OpBuffer[obp++]=(char)0x01;
972 }
973}
974void SetBooleanVariable(int type,RELATIVE_VAR *pRelative){
975 if(type==DEF_DOUBLE){
976 // TODO: 実装
977 }
978 else if(type==DEF_SINGLE){
979 // TODO: 実装
980 }
981 else if(type==DEF_INT64||type==DEF_QWORD){
982 // TODO: 実装
983
984 //pop eax
985 op_pop(REG_EAX);
986
987 //cmp eax,0
988 op_cmp_value(GetTypeSize(type,-1),REG_EAX,0);
989
990 //setne al
991 op_setne( REG_EAX );
992
993 //pop ecx
994 op_pop(REG_ECX);
995
996 //cmp ecx,0
997 op_cmp_value(GetTypeSize(type,-1),REG_ECX,0);
998
999 //setne cl
1000 op_setne( REG_ECX );
1001
1002 //or al,cl
1003 op_or_RR( sizeof( _int8 ), REG_EAX, REG_ECX );
1004 }
1005 else{
1006 if(!IsWholeNumberType(type)){
1007 //不正な型の場合
1008 SetError(9,NULL,cp);
1009 return;
1010 }
1011
1012 //pop eax
1013 op_pop(REG_EAX);
1014 }
1015
1016 //cmp eax,0
1017 op_cmp_value(GetTypeSize(type,-1),REG_EAX,0);
1018
1019 //setne al
1020 op_setne( REG_EAX );
1021
1022 //push eax
1023 op_push(REG_EAX);
1024
1025 Set8Variable(DEF_BYTE,pRelative->dwKind,pRelative->offset,pRelative->bOffsetOffset);
1026}
Note: See TracBrowser for help on using the repository browser.