source: dev/BasicCompiler32/Compile_Set_Var.cpp@ 62

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

グローバル変数に対してByRefを指定できるようにした

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