source: dev/BasicCompiler32/Compile_Set_Var.cpp@ 64

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

すべてのオブジェクトを参照型に切り替えた。

File size: 29.6 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 SetStructVariable(LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,BOOL bUseHeap){
10/*
11 TODO: 消す
12 ///////////////////////////////////////////////////////////////////
13 // オペレータ '=' のオーバーロード関数を呼ぶ
14 ///////////////////////////////////////////////////////////////////
15
16 int type[10];
17 LONG_PTR index_stack[10];
18 BOOL array_bUseHeap[10];
19 int sp=2;
20
21 //左辺
22 type[0]=DEF_OBJECT;
23 index_stack[0]=lpVarIndex;
24 array_bUseHeap[0]=0;
25
26 //右辺
27 type[1]=CalcType;
28 index_stack[1]=lpCalcIndex;
29 array_bUseHeap[1]=bUseHeap;
30
31 int iRet;
32 iRet=CallOperatorProc(CALC_SUBSITUATION,NULL,type,index_stack,array_bUseHeap,sp);
33 if(iRet==-1||iRet==1){
34 //成功したとき、またはエラーが発行されたとき
35 return;
36 }*/
37
38
39 if( CalcType == DEF_STRUCT ){
40 CClass *pVarClass = (CClass *)lpVarIndex;
41 CClass *pCalcClass = (CClass *)lpCalcIndex;
42
43
44 if( pVarClass->IsEquals( pCalcClass ) ){ //等しい
45
46 //双方のオブジェクト型が一致、または派生・継承関係にあるとき
47 //※コピーを行う
48
49 int object_size = pVarClass->GetSize();
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
84
85void SetRealVariable(int VarType,int CalcType,RELATIVE_VAR *pRelativeVar){
86 if( !IsRealNumberType( CalcType ) ){
87 // 実数へ変換
88 // 64bit edx:eax -> st(0)
89 // 32bit eax -> st(0)
90
91 if( Is64Type( CalcType ) ){
92 //64ビット整数型
93
94 //push edx
95 op_push( REG_EDX );
96
97 //push eax
98 op_push( REG_EAX );
99
100 //fild qword ptr[esp]
101 op_fld_ptr_esp(DEF_INT64);
102
103 //pop
104 op_pop( REG_NON );
105
106 //pop
107 op_pop( REG_NON );
108 }
109 else{
110 //push eax
111 op_push( REG_EAX );
112
113 //fild qword ptr[esp]
114 op_fld_ptr_esp(DEF_LONG);
115
116 //pop
117 op_pop( REG_NON );
118 }
119 }
120
121 if(pRelativeVar->dwKind==VAR_GLOBAL){
122 if(pRelativeVar->bOffsetOffset){
123 //fstp ptr[ecx+offset]
124 op_fstp_base_offset(VarType,REG_ECX,(int)pRelativeVar->offset);
125 obp-=sizeof(long);
126 pobj_GlobalVarSchedule->add();
127 obp+=sizeof(long);
128 }
129 else{
130 //mov ecx,offset
131 op_mov_RV(REG_ECX,(int)pRelativeVar->offset);
132 obp-=sizeof(long);
133 pobj_GlobalVarSchedule->add();
134 obp+=sizeof(long);
135
136 //fstp ptr[ecx]
137 op_fstp_basereg(VarType,REG_ECX);
138 }
139 }
140 else if(pRelativeVar->dwKind==VAR_REFGLOBAL){
141 if(pRelativeVar->bOffsetOffset){
142 //add ecx,qword ptr[offset]
143 op_add_RM(sizeof(long),REG_ECX,REG_NON,(int)pRelativeVar->offset,MOD_DISP32);
144 }
145 else{
146 //mov ecx,qword ptr[offset]
147 op_mov_RM(sizeof(long),REG_ECX,REG_NON,(int)pRelativeVar->offset,MOD_DISP32);
148 }
149 obp-=sizeof(long);
150 pobj_GlobalVarSchedule->add();
151 obp+=sizeof(long);
152
153 goto directmem;
154 }
155 else if(pRelativeVar->dwKind==VAR_LOCAL){
156 if(pRelativeVar->bOffsetOffset){
157 //fstp ptr[ebp+ecx+offset]
158 op_fstp_base_offset_ex(VarType,REG_EBP,REG_ECX,(int)pRelativeVar->offset,USE_OFFSET);
159 }
160 else{
161 //fstp ptr[ebp+offset]
162 op_fstp_base_offset(VarType,REG_EBP,(int)pRelativeVar->offset);
163 }
164 obp-=sizeof(long);
165 AddLocalVarAddrSchedule();
166 obp+=sizeof(long);
167 }
168 else if(pRelativeVar->dwKind==VAR_REFLOCAL){
169 if(pRelativeVar->bOffsetOffset){
170 //add ecx,qword ptr[ebp+offset]
171 op_add_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
172 }
173 else{
174 //mov ecx,qword ptr[ebp+offset]
175 op_mov_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
176 }
177 obp-=sizeof(long);
178 AddLocalVarAddrSchedule();
179 obp+=sizeof(long);
180
181 goto directmem;
182 }
183 else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
184directmem:
185 //fstp ptr[ecx]
186 op_fstp_basereg(VarType,REG_ECX);
187 }
188}
189
190void SetBooleanVariable(int type,RELATIVE_VAR *pRelative){
191 if(type==DEF_DOUBLE){
192 // TODO: 実装
193 SetError();
194 }
195 else if(type==DEF_SINGLE){
196 // TODO: 実装
197 SetError();
198 }
199 else if(type==DEF_INT64||type==DEF_QWORD){
200 //cmp eax,0
201 op_cmp_value(GetTypeSize(type,-1),REG_EAX,0);
202
203 //setne al
204 op_setne( REG_EAX );
205
206 //cmp edx,0
207 op_cmp_value(GetTypeSize(type,-1),REG_EDX,0);
208
209 //setne cl
210 op_setne( REG_ECX );
211
212 //or al,cl
213 op_or_RR( sizeof( _int8 ), REG_EAX, REG_ECX );
214 }
215 else{
216 if(!IsWholeNumberType(type)){
217 //不正な型の場合
218 SetError(9,NULL,cp);
219 return;
220 }
221 }
222
223 //cmp eax,0
224 op_cmp_value(GetTypeSize(type,-1),REG_EAX,0);
225
226 //setne al
227 op_setne( REG_EAX );
228
229 SetWholeVariable( sizeof(char), DEF_BYTE, pRelative );
230}
231
232void ExtendTypeTo32(int type,int reg);
233void ExtendTypeTo64(int type){
234 if(Is64Type(type)) return;
235
236 ExtendTypeTo32(type,REG_EAX);
237
238 if(IsSignedType(type)){
239 //cdq
240 op_cdq();
241 }
242 else{
243 //xor edx,edx
244 op_zero_reg(REG_EDX);
245 }
246}
247void ExtendTypeTo32(int type,int reg){
248 if(type==DEF_INTEGER || (isUnicode&&type==DEF_CHAR)){
249 //movsx reg32,reg16
250 op_movsx_R32R16(reg,reg);
251 }
252 else if(type==DEF_WORD){
253 //and reg,0000FFFFh
254 op_and_RV(reg,(int)0x0000FFFF);
255 }
256 else if(type==DEF_SBYTE || (isUnicode==false&&type==DEF_CHAR)){
257 //movsx reg32,reg8
258 op_movsx_R32R8(reg,reg);
259 }
260 else if(type==DEF_BYTE||type==DEF_BOOLEAN){
261 //and reg,000000FFh
262 op_and_RV(reg,(int)0xFF);
263 }
264}
265void ExtendTypeTo16(int type,int reg){
266 if(type==DEF_SBYTE || (isUnicode==false&&type==DEF_CHAR)){
267 //movsx reg16,reg8
268 op_movsx_R16R8(reg,reg);
269 }
270 else if(type==DEF_BYTE||type==DEF_BOOLEAN){
271 //and reg,000000FFh
272 op_and_RV(reg,(int)0xFF);
273 }
274}
275
276void SetWholeVariable(int var_size,int type,RELATIVE_VAR *pRelative){
277 if(type==DEF_DOUBLE){
278 //Double型
279 // st(0)の内容をedx:eaxに変換
280
281 //TODO: 実装
282 SetError();
283 }
284 else if(type==DEF_SINGLE){
285 //Single型
286 // st(0)の内容をeaxに変換
287
288 //TODO: 実装
289 SetError();
290 }
291 else{
292 //その他の整数
293
294 if(var_size==sizeof(_int64)){
295 //eaxの値を64ビット(edx:eax)に拡張する
296 ExtendTypeTo64(type);
297 }
298 else if(var_size==sizeof(long)){
299 //レジスタの値を32ビット(eax)に拡張する
300 ExtendTypeTo32(type,REG_EAX);
301 }
302 else if(var_size==sizeof(short)){
303 //レジスタの値を16ビット(ax)に拡張する
304 ExtendTypeTo16(type,REG_EAX);
305 }
306 //8ビットは拡張なし
307 }
308
309 if(var_size==sizeof(_int64)){
310 //下位32ビット
311 SetWholeVariable(sizeof(long),DEF_LONG,pRelative);
312
313 //mov eax,edx
314 op_mov_RR( REG_EAX, REG_EDX );
315
316 //上位32ビット
317 if( pRelative->dwKind == VAR_DIRECTMEM ){
318 //add ecx,sizeof(long)
319 op_add_RV8( REG_ECX, sizeof(long) );
320 }
321 pRelative->offset+=sizeof(long);
322 SetWholeVariable(sizeof(long),DEF_LONG,pRelative);
323 pRelative->offset-=sizeof(long);
324
325 return;
326 }
327
328 if(pRelative->dwKind==VAR_GLOBAL){
329 if(pRelative->bOffsetOffset){
330 //mov ptr[ecx+offset],eax/ax/al
331 op_mov_MR(var_size,REG_EAX,REG_ECX,(int)pRelative->offset,MOD_BASE_DISP32);
332 }
333 else{
334 //mov ptr[offset],eax/ax/al
335 op_mov_MR(var_size,REG_EAX,0,(int)pRelative->offset,MOD_DISP32);
336 }
337 obp-=sizeof(long);
338 pobj_GlobalVarSchedule->add();
339 obp+=sizeof(long);
340 }
341 else if(pRelative->dwKind==VAR_REFGLOBAL){
342 if(pRelative->bOffsetOffset){
343 //add ecx,qword ptr[offset]
344 op_add_RM(var_size,REG_ECX,REG_NON,(int)pRelative->offset,MOD_DISP32);
345 }
346 else{
347 //mov ecx,qword ptr[offset]
348 op_mov_RM(var_size,REG_ECX,REG_NON,(int)pRelative->offset,MOD_DISP32);
349 }
350 obp-=sizeof(long);
351 pobj_GlobalVarSchedule->add();
352 obp+=sizeof(long);
353
354 goto directmem;
355 }
356 else if(pRelative->dwKind==VAR_LOCAL){
357 if(pRelative->bOffsetOffset){
358 //mov ptr[ebp+ecx+offset],eax/ax/al
359 op_mov_MR_ex(var_size,REG_EAX,REG_EBP,REG_ECX,(int)pRelative->offset,USE_OFFSET);
360 }
361 else{
362 //mov ptr[ebp+offset],eax/ax/al
363 op_mov_MR(var_size,REG_EAX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);
364 }
365 obp-=sizeof(long);
366 AddLocalVarAddrSchedule();
367 obp+=sizeof(long);
368 }
369 else if(pRelative->dwKind==VAR_REFLOCAL){
370 if(pRelative->bOffsetOffset){
371 //add ecx,qword ptr[ebp+offset]
372 op_add_RM(var_size,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);
373 }
374 else{
375 //mov ecx,qword ptr[ebp+offset]
376 op_mov_RM(var_size,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);
377 }
378 obp-=sizeof(long);
379 AddLocalVarAddrSchedule();
380 obp+=sizeof(long);
381
382 goto directmem;
383 }
384 else if(pRelative->dwKind==VAR_DIRECTMEM){
385directmem:
386
387 //mov ptr[ecx],eax/ax/al
388 op_mov_MR(var_size,REG_EAX,REG_ECX,0,MOD_BASE);
389 }
390}
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416/*
417TODO: 消す
418void SetDoubleVariable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset){
419 ChangeTypeToDouble(type);
420
421 //pop ebx
422 op_pop(REG_EBX);
423
424 //pop eax
425 op_pop(REG_EAX);
426
427 if(VarKind==VAR_GLOBAL){
428 if(bOffsetOffset){
429 //mov dword ptr[ecx+offset],ebx
430 OpBuffer[obp++]=(char)0x89;
431 OpBuffer[obp++]=(char)0x99;
432 *((long *)(OpBuffer+obp))=offset;
433 pobj_GlobalVarSchedule->add();
434 obp+=sizeof(long);
435
436 //mov dword ptr[ecx+offset+sizeof(long)],eax
437 OpBuffer[obp++]=(char)0x89;
438 OpBuffer[obp++]=(char)0x81;
439 *((long *)(OpBuffer+obp))=offset+sizeof(long);
440 pobj_GlobalVarSchedule->add();
441 obp+=sizeof(long);
442 }
443 else{
444 //mov dword ptr[offset],ebx
445 OpBuffer[obp++]=(char)0x89;
446 OpBuffer[obp++]=(char)0x1D;
447 *((long *)(OpBuffer+obp))=offset;
448 pobj_GlobalVarSchedule->add();
449 obp+=sizeof(long);
450
451 //mov dword ptr[offset+sizeof(long)],eax
452 OpBuffer[obp++]=(char)0xA3;
453 *((long *)(OpBuffer+obp))=offset+sizeof(long);
454 pobj_GlobalVarSchedule->add();
455 obp+=sizeof(long);
456 }
457 }
458 else if( VarKind==VAR_REFGLOBAL ){
459 SetError(300,NULL,cp);
460 }
461 else if(VarKind==VAR_LOCAL){
462 if(bOffsetOffset){
463 //add ecx,offset
464 OpBuffer[obp++]=(char)0x81;
465 OpBuffer[obp++]=(char)0xC1;
466 *((long *)(OpBuffer+obp))=offset;
467 AddLocalVarAddrSchedule();
468 obp+=sizeof(long);
469
470 //mov dword ptr[ebp+ecx],ebx
471 OpBuffer[obp++]=(char)0x89;
472 OpBuffer[obp++]=(char)0x5C;
473 OpBuffer[obp++]=(char)0x0D;
474 OpBuffer[obp++]=(char)0x00;
475
476 //add ecx,sizeof(long)
477 OpBuffer[obp++]=(char)0x83;
478 OpBuffer[obp++]=(char)0xC1;
479 OpBuffer[obp++]=(char)0x04;
480
481 //mov dword ptr[ebp+ecx],eax
482 OpBuffer[obp++]=(char)0x89;
483 OpBuffer[obp++]=(char)0x44;
484 OpBuffer[obp++]=(char)0x0D;
485 OpBuffer[obp++]=(char)0x00;
486 }
487 else{
488 //mov dword ptr[ebp+offset],ebx
489 OpBuffer[obp++]=(char)0x89;
490 OpBuffer[obp++]=(char)0x9D;
491 *((long *)(OpBuffer+obp))=offset;
492 AddLocalVarAddrSchedule();
493 obp+=sizeof(long);
494
495 //mov dword ptr[ebp+offset+sizeof(long)],eax
496 OpBuffer[obp++]=(char)0x89;
497 OpBuffer[obp++]=(char)0x85;
498 *((long *)(OpBuffer+obp))=offset+sizeof(long);
499 AddLocalVarAddrSchedule();
500 obp+=sizeof(long);
501 }
502 }
503 else if(VarKind==VAR_REFLOCAL){
504 if(bOffsetOffset){
505 //add ecx,dword ptr[ebp+offset]
506 OpBuffer[obp++]=(char)0x03;
507 OpBuffer[obp++]=(char)0x8D;
508 *((long *)(OpBuffer+obp))=offset;
509 AddLocalVarAddrSchedule();
510 obp+=sizeof(long);
511 }
512 else{
513 //mov ecx,dword ptr[ebp+offset]
514 OpBuffer[obp++]=(char)0x8B;
515 OpBuffer[obp++]=(char)0x8D;
516 *((long *)(OpBuffer+obp))=offset;
517 AddLocalVarAddrSchedule();
518 obp+=sizeof(long);
519 }
520
521 //mov dword ptr[ecx],ebx
522 OpBuffer[obp++]=(char)0x89;
523 OpBuffer[obp++]=(char)0x19;
524
525 //mov dword ptr[ecx+sizeof(long)],eax
526 OpBuffer[obp++]=(char)0x89;
527 OpBuffer[obp++]=(char)0x41;
528 OpBuffer[obp++]=(char)0x04;
529 }
530 else if(VarKind==VAR_DIRECTMEM){
531 //mov dword ptr[ecx],ebx
532 OpBuffer[obp++]=(char)0x89;
533 OpBuffer[obp++]=(char)0x19;
534
535 //mov dword ptr[ecx+sizeof(long)],eax
536 OpBuffer[obp++]=(char)0x89;
537 OpBuffer[obp++]=(char)0x41;
538 OpBuffer[obp++]=(char)0x04;
539 }
540}
541void SetSingleVariable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset){
542 if(type==DEF_SINGLE){
543 //32ビット変数としてそのままコピーする
544 SetDWordVariable(DEF_DWORD,VarKind,offset,bOffsetOffset);
545 return;
546 }
547
548 if(type==DEF_DOUBLE){
549 //fld qword ptr[esp]
550 op_fld_ptr_esp(DEF_DOUBLE);
551
552 //add esp,8
553 op_add_esp(8);
554 }
555 else if(type==DEF_INT64||type==DEF_QWORD){
556 //64ビット整数
557
558 //fild qword ptr[esp]
559 op_fld_ptr_esp(DEF_INT64);
560
561 //add esp,8
562 op_add_esp(8);
563 }
564 else if(IsSignedType(type)){
565 //符号あり整数
566
567 //fild dword ptr[esp]
568 op_fld_ptr_esp(DEF_LONG);
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 //符号なし整数
581
582 //pop eax
583 op_pop(REG_EAX);
584
585 //push 0
586 op_push_value(0);
587
588 //push eax
589 op_push(REG_EAX);
590
591 //fild qword ptr[esp]
592 OpBuffer[obp++]=(char)0xDF;
593 OpBuffer[obp++]=(char)0x2C;
594 OpBuffer[obp++]=(char)0x24;
595
596 //add esp,8
597 op_add_esp(8);
598 }
599
600 if(VarKind==VAR_GLOBAL){
601 if(bOffsetOffset){
602 //fstp dword ptr[ecx+offset]
603 OpBuffer[obp++]=(char)0xD9;
604 OpBuffer[obp++]=(char)0x99;
605 *((long *)(OpBuffer+obp))=offset;
606 pobj_GlobalVarSchedule->add();
607 obp+=sizeof(long);
608 }
609 else{
610 //fstp dword ptr[offset]
611 OpBuffer[obp++]=(char)0xD9;
612 OpBuffer[obp++]=(char)0x1D;
613 *((long *)(OpBuffer+obp))=offset;
614 pobj_GlobalVarSchedule->add();
615 obp+=sizeof(long);
616 }
617 }
618 else if( VarKind==VAR_REFGLOBAL ){
619 SetError(300,NULL,cp);
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 //fstp dword ptr[ebp+ecx]
631 OpBuffer[obp++]=(char)0xD9;
632 OpBuffer[obp++]=(char)0x5C;
633 OpBuffer[obp++]=(char)0x0D;
634 OpBuffer[obp++]=(char)0x00;
635 }
636 else{
637 //fstp dword ptr[ebp+offset]
638 OpBuffer[obp++]=(char)0xD9;
639 OpBuffer[obp++]=(char)0x9D;
640 *((long *)(OpBuffer+obp))=offset;
641 AddLocalVarAddrSchedule();
642 obp+=sizeof(long);
643 }
644 }
645 else if(VarKind==VAR_REFLOCAL){
646 //mov eax,dword ptr[ebp+offset]
647 OpBuffer[obp++]=(char)0x8B;
648 OpBuffer[obp++]=(char)0x85;
649 *((long *)(OpBuffer+obp))=offset;
650 AddLocalVarAddrSchedule();
651 obp+=sizeof(long);
652
653 if(bOffsetOffset){
654 //add eax,ecx
655 OpBuffer[obp++]=(char)0x03;
656 OpBuffer[obp++]=(char)0xC1;
657 }
658
659 //fstp dword ptr[eax]
660 OpBuffer[obp++]=(char)0xD9;
661 OpBuffer[obp++]=(char)0x18;
662 }
663 else if(VarKind==VAR_DIRECTMEM){
664 //fstp dword ptr[ecx]
665 OpBuffer[obp++]=(char)0xD9;
666 OpBuffer[obp++]=(char)0x19;
667 }
668}
669void SetInt64Variable(int type,RELATIVE_VAR *pRelative){
670 if(type==DEF_DOUBLE){
671 //fld qword ptr[esp]
672 op_fld_ptr_esp(DEF_DOUBLE);
673
674 //fistp qword ptr[esp]
675 fpu_cast();
676 OpBuffer[obp++]=(char)0xDF;
677 OpBuffer[obp++]=(char)0x3C;
678 OpBuffer[obp++]=(char)0x24;
679 fpu_cast_end();
680
681 //pop eax
682 op_pop(REG_EAX);
683
684 //pop edx
685 op_pop(REG_EDX);
686 }
687 else if(type==DEF_SINGLE){
688 //fld dword ptr[esp]
689 op_fld_ptr_esp(DEF_SINGLE);
690
691 //sub esp,4
692 op_sub_esp(4);
693
694 //fistp qword ptr[esp]
695 fpu_cast();
696 OpBuffer[obp++]=(char)0xDF;
697 OpBuffer[obp++]=(char)0x3C;
698 OpBuffer[obp++]=(char)0x24;
699 fpu_cast_end();
700
701 //pop eax
702 op_pop(REG_EAX);
703
704 //pop edx
705 op_pop(REG_EDX);
706 }
707 else if(type==DEF_INT64||type==DEF_QWORD){
708 //pop eax
709 op_pop(REG_EAX);
710
711 //pop edx
712 op_pop(REG_EDX);
713 }
714 else if(IsSignedType(type)){
715 //符号拡張
716 //edx:eax ← eax
717
718 //pop eax
719 op_pop(REG_EAX);
720
721 //cdq
722 op_cdq();
723 }
724 else{
725 if(!IsWholeNumberType(type)){
726 //不正な型の場合
727 SetError(9,NULL,cp);
728 return;
729 }
730
731 //符号拡張
732 //edx=0:eax
733
734 //pop eax
735 op_pop(REG_EAX);
736
737 //xor edx,edx
738 op_zero_reg(REG_EDX);
739 }
740
741 if(pRelative->dwKind==VAR_GLOBAL){
742 if(pRelative->bOffsetOffset){
743 //mov dword ptr[ecx+offset],eax
744 OpBuffer[obp++]=(char)0x89;
745 OpBuffer[obp++]=(char)0x81;
746 *((long *)(OpBuffer+obp))=pRelative->offset;
747 pobj_GlobalVarSchedule->add();
748 obp+=sizeof(long);
749
750 //mov dword ptr[ecx+offset+sizeof(long)],edx
751 OpBuffer[obp++]=(char)0x89;
752 OpBuffer[obp++]=(char)0x91;
753 *((long *)(OpBuffer+obp))=pRelative->offset+sizeof(long);
754 pobj_GlobalVarSchedule->add();
755 obp+=sizeof(long);
756 }
757 else{
758 //mov dword ptr[offset],eax
759 OpBuffer[obp++]=(char)0xA3;
760 *((long *)(OpBuffer+obp))=pRelative->offset;
761 pobj_GlobalVarSchedule->add();
762 obp+=sizeof(long);
763
764 //mov dword ptr[offset+sizeof(long)],edx
765 OpBuffer[obp++]=(char)0x89;
766 OpBuffer[obp++]=(char)0x15;
767 *((long *)(OpBuffer+obp))=pRelative->offset+sizeof(DWORD);
768 pobj_GlobalVarSchedule->add();
769 obp+=sizeof(long);
770 }
771 }
772 else if(pRelative->dwKind==VAR_REFLOCAL){
773 if(pRelative->bOffsetOffset){
774 //add ecx,dword ptr[offset]
775 op_add_RM( sizeof(long), REG_ECX, REG_NON, (int)pRelative->offset, MOD_DISP32 );
776 }
777 else{
778 //mov ecx,dword ptr[offset]
779 op_mov_RM( sizeof(long), REG_ECX, REG_NON, (int)pRelative->offset, MOD_DISP32 );
780 }
781 obp-=sizeof(long);
782 pobj_GlobalVarSchedule->add();
783 obp+=sizeof(long);
784
785 //mov dword ptr[ecx],eax
786 OpBuffer[obp++]=(char)0x89;
787 OpBuffer[obp++]=(char)0x01;
788
789 //mov dword ptr[ecx+sizeof(long)],edx
790 OpBuffer[obp++]=(char)0x89;
791 OpBuffer[obp++]=(char)0x51;
792 OpBuffer[obp++]=(char)0x04;
793 }
794 else if(pRelative->dwKind==VAR_LOCAL){
795 if(pRelative->bOffsetOffset){
796 //add ecx,offset
797 OpBuffer[obp++]=(char)0x81;
798 OpBuffer[obp++]=(char)0xC1;
799 *((long *)(OpBuffer+obp))=pRelative->offset;
800 AddLocalVarAddrSchedule();
801 obp+=sizeof(long);
802
803 //mov dword ptr[ebp+ecx],eax
804 OpBuffer[obp++]=(char)0x89;
805 OpBuffer[obp++]=(char)0x44;
806 OpBuffer[obp++]=(char)0x0D;
807 OpBuffer[obp++]=(char)0x00;
808
809 //add ecx,sizeof(long)
810 OpBuffer[obp++]=(char)0x83;
811 OpBuffer[obp++]=(char)0xC1;
812 OpBuffer[obp++]=(char)0x04;
813
814 //mov dword ptr[ebp+ecx],edx
815 OpBuffer[obp++]=(char)0x89;
816 OpBuffer[obp++]=(char)0x54;
817 OpBuffer[obp++]=(char)0x0D;
818 OpBuffer[obp++]=(char)0x00;
819 }
820 else{
821 //mov dword ptr[ebp+offset],eax
822 OpBuffer[obp++]=(char)0x89;
823 OpBuffer[obp++]=(char)0x85;
824 *((long *)(OpBuffer+obp))=pRelative->offset;
825 AddLocalVarAddrSchedule();
826 obp+=sizeof(long);
827
828 //mov dword ptr[ebp+offset+sizeof(long)],edx
829 OpBuffer[obp++]=(char)0x89;
830 OpBuffer[obp++]=(char)0x95;
831 *((long *)(OpBuffer+obp))=pRelative->offset+sizeof(long);
832 AddLocalVarAddrSchedule();
833 obp+=sizeof(long);
834 }
835 }
836 else if(pRelative->dwKind==VAR_REFLOCAL){
837 if(pRelative->bOffsetOffset){
838 //add ecx,dword ptr[ebp+offset]
839 OpBuffer[obp++]=(char)0x03;
840 OpBuffer[obp++]=(char)0x8D;
841 *((long *)(OpBuffer+obp))=pRelative->offset;
842 AddLocalVarAddrSchedule();
843 obp+=sizeof(long);
844 }
845 else{
846 //mov ecx,dword ptr[ebp+offset]
847 OpBuffer[obp++]=(char)0x8B;
848 OpBuffer[obp++]=(char)0x8D;
849 *((long *)(OpBuffer+obp))=pRelative->offset;
850 AddLocalVarAddrSchedule();
851 obp+=sizeof(long);
852 }
853
854 //mov dword ptr[ecx],eax
855 OpBuffer[obp++]=(char)0x89;
856 OpBuffer[obp++]=(char)0x01;
857
858 //mov dword ptr[ecx+sizeof(long)],edx
859 OpBuffer[obp++]=(char)0x89;
860 OpBuffer[obp++]=(char)0x51;
861 OpBuffer[obp++]=(char)0x04;
862 }
863 else if(pRelative->dwKind==VAR_DIRECTMEM){
864 //mov dword ptr[ecx],eax
865 OpBuffer[obp++]=(char)0x89;
866 OpBuffer[obp++]=(char)0x01;
867
868 //mov dword ptr[ecx+sizeof(long)],edx
869 OpBuffer[obp++]=(char)0x89;
870 OpBuffer[obp++]=(char)0x51;
871 OpBuffer[obp++]=(char)0x04;
872 }
873}
874void SetDWordVariable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset){
875 if(type==DEF_DOUBLE||type==DEF_SINGLE){
876 if(type==DEF_DOUBLE){
877 //fld qword ptr[esp]
878 op_fld_ptr_esp(DEF_DOUBLE);
879 }
880 else if(type==DEF_SINGLE){
881 //fld dword ptr[esp]
882 op_fld_ptr_esp(DEF_SINGLE);
883
884 //sub esp,4
885 op_sub_esp(4);
886 }
887
888 //fistp qword ptr[esp]
889 fpu_cast();
890 OpBuffer[obp++]=(char)0xDF;
891 OpBuffer[obp++]=(char)0x3C;
892 OpBuffer[obp++]=(char)0x24;
893 fpu_cast_end();
894
895 //pop eax
896 op_pop(REG_EAX);
897
898 //add esp,4
899 op_add_esp(4);
900 }
901 else if(type==DEF_INT64||type==DEF_QWORD){
902 //pop eax
903 op_pop(REG_EAX);
904
905 //add esp,4
906 op_add_esp(4);
907 }
908 else{
909 if(!IsWholeNumberType(type)){
910 //不正な型の場合
911 SetError(9,NULL,cp);
912 return;
913 }
914
915 ChangeTypeToWhole(type,DEF_LONG);
916
917 //pop eax
918 op_pop(REG_EAX);
919 }
920
921 if(VarKind==VAR_GLOBAL){
922 if(bOffsetOffset){
923 //mov dword ptr[ecx+offset],eax
924 OpBuffer[obp++]=(char)0x89;
925 OpBuffer[obp++]=(char)0x81;
926 *((long *)(OpBuffer+obp))=offset;
927 pobj_GlobalVarSchedule->add();
928 obp+=sizeof(long);
929 }
930 else{
931 //mov dword ptr[offset],eax
932 OpBuffer[obp++]=(char)0xA3;
933 *((long *)(OpBuffer+obp))=offset;
934 pobj_GlobalVarSchedule->add();
935 obp+=sizeof(long);
936 }
937 }
938 else if(VarKind==VAR_REFGLOBAL){
939 if(bOffsetOffset){
940 //add ecx,dword ptr[offset]
941 op_add_RM( sizeof(long), REG_ECX, REG_NON, (int)offset, MOD_DISP32 );
942 }
943 else{
944 //mov ecx,dword ptr[offset]
945 op_mov_RM( sizeof(long), REG_ECX, REG_NON, (int)offset, MOD_DISP32 );
946 }
947 obp-=sizeof(long);
948 pobj_GlobalVarSchedule->add();
949 obp+=sizeof(long);
950
951 //mov dword ptr[ecx],eax
952 OpBuffer[obp++]=(char)0x89;
953 OpBuffer[obp++]=(char)0x01;
954 }
955 else if(VarKind==VAR_LOCAL){
956 if(bOffsetOffset){
957 //add ecx,offset
958 OpBuffer[obp++]=(char)0x81;
959 OpBuffer[obp++]=(char)0xC1;
960 *((long *)(OpBuffer+obp))=offset;
961 AddLocalVarAddrSchedule();
962 obp+=sizeof(long);
963
964 //mov dword ptr[ebp+ecx],eax
965 OpBuffer[obp++]=(char)0x89;
966 OpBuffer[obp++]=(char)0x44;
967 OpBuffer[obp++]=(char)0x0D;
968 OpBuffer[obp++]=(char)0x00;
969 }
970 else{
971 //mov dword ptr[ebp+offset],eax
972 OpBuffer[obp++]=(char)0x89;
973 OpBuffer[obp++]=(char)0x85;
974 *((long *)(OpBuffer+obp))=offset;
975 AddLocalVarAddrSchedule();
976 obp+=sizeof(long);
977 }
978 }
979 else if(VarKind==VAR_REFLOCAL){
980 if(bOffsetOffset){
981 //add ecx,dword ptr[ebp+offset]
982 OpBuffer[obp++]=(char)0x03;
983 OpBuffer[obp++]=(char)0x8D;
984 *((long *)(OpBuffer+obp))=offset;
985 AddLocalVarAddrSchedule();
986 obp+=sizeof(long);
987 }
988 else{
989 //mov ecx,dword ptr[ebp+offset]
990 OpBuffer[obp++]=(char)0x8B;
991 OpBuffer[obp++]=(char)0x8D;
992 *((long *)(OpBuffer+obp))=offset;
993 AddLocalVarAddrSchedule();
994 obp+=sizeof(long);
995 }
996
997 //mov dword ptr[ecx],eax
998 OpBuffer[obp++]=(char)0x89;
999 OpBuffer[obp++]=(char)0x01;
1000 }
1001 else if(VarKind==VAR_DIRECTMEM){
1002 //mov dword ptr[ecx],eax
1003 OpBuffer[obp++]=(char)0x89;
1004 OpBuffer[obp++]=(char)0x01;
1005 }
1006}
1007void SetLongVariable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset){
1008 if(type==DEF_DOUBLE||type==DEF_SINGLE){
1009 if(type==DEF_DOUBLE){
1010 //fld qword ptr[esp]
1011 op_fld_ptr_esp(DEF_DOUBLE);
1012
1013 //add esp,8
1014 op_add_esp(8);
1015 }
1016 else if(type==DEF_SINGLE){
1017 //fld dword ptr[esp]
1018 op_fld_ptr_esp(DEF_SINGLE);
1019
1020 //add esp,4
1021 op_add_esp(4);
1022 }
1023
1024 if(VarKind==VAR_GLOBAL){
1025 if(bOffsetOffset){
1026 //fistp dword ptr[ecx+offset]
1027 fpu_cast();
1028 OpBuffer[obp++]=(char)0xDB;
1029 OpBuffer[obp++]=(char)0x99;
1030 *((long *)(OpBuffer+obp))=offset;
1031 pobj_GlobalVarSchedule->add();
1032 obp+=sizeof(long);
1033 fpu_cast_end();
1034 }
1035 else{
1036 //fistp dword ptr[offset]
1037 fpu_cast();
1038 OpBuffer[obp++]=(char)0xDB;
1039 OpBuffer[obp++]=(char)0x1D;
1040 *((long *)(OpBuffer+obp))=offset;
1041 pobj_GlobalVarSchedule->add();
1042 obp+=sizeof(long);
1043 fpu_cast_end();
1044 }
1045 }
1046 else if(VarKind==VAR_REFGLOBAL){
1047 //mov eax,dword ptr[offset]
1048 op_mov_RM( sizeof(long), REG_EAX, REG_NON, (int)offset, MOD_DISP32 );
1049 obp-=sizeof(long);
1050 pobj_GlobalVarSchedule->add();
1051 obp+=sizeof(long);
1052
1053 if(bOffsetOffset){
1054 //add eax,ecx
1055 OpBuffer[obp++]=(char)0x03;
1056 OpBuffer[obp++]=(char)0xC1;
1057 }
1058
1059 //fistp dword ptr[eax]
1060 fpu_cast();
1061 OpBuffer[obp++]=(char)0xDB;
1062 OpBuffer[obp++]=(char)0x18;
1063 fpu_cast_end();
1064 }
1065 else if(VarKind==VAR_LOCAL){
1066 if(bOffsetOffset){
1067 //add ecx,offset
1068 OpBuffer[obp++]=(char)0x81;
1069 OpBuffer[obp++]=(char)0xC1;
1070 *((long *)(OpBuffer+obp))=offset;
1071 AddLocalVarAddrSchedule();
1072 obp+=sizeof(long);
1073
1074 //fistp dword ptr[ebp+ecx]
1075 fpu_cast();
1076 OpBuffer[obp++]=(char)0xDB;
1077 OpBuffer[obp++]=(char)0x5C;
1078 OpBuffer[obp++]=(char)0x0D;
1079 OpBuffer[obp++]=(char)0x00;
1080 fpu_cast_end();
1081 }
1082 else{
1083 //fistp dword ptr[ebp+offset]
1084 fpu_cast();
1085 OpBuffer[obp++]=(char)0xDB;
1086 OpBuffer[obp++]=(char)0x9D;
1087 *((long *)(OpBuffer+obp))=offset;
1088 AddLocalVarAddrSchedule();
1089 obp+=sizeof(long);
1090 fpu_cast_end();
1091 }
1092 }
1093 else if(VarKind==VAR_REFLOCAL){
1094 //mov eax,dword ptr[ebp+offset]
1095 OpBuffer[obp++]=(char)0x8B;
1096 OpBuffer[obp++]=(char)0x85;
1097 *((long *)(OpBuffer+obp))=offset;
1098 AddLocalVarAddrSchedule();
1099 obp+=sizeof(long);
1100
1101 if(bOffsetOffset){
1102 //add eax,ecx
1103 OpBuffer[obp++]=(char)0x03;
1104 OpBuffer[obp++]=(char)0xC1;
1105 }
1106
1107 //fistp dword ptr[eax]
1108 fpu_cast();
1109 OpBuffer[obp++]=(char)0xDB;
1110 OpBuffer[obp++]=(char)0x18;
1111 fpu_cast_end();
1112 }
1113 else if(VarKind==VAR_DIRECTMEM){
1114 //fistp dword ptr[ecx]
1115 fpu_cast();
1116 OpBuffer[obp++]=(char)0xDB;
1117 OpBuffer[obp++]=(char)0x19;
1118 fpu_cast_end();
1119 }
1120 }
1121 else{
1122 //実数以外の型からの代入処理はDWordのものと同様
1123 SetDWordVariable(type,VarKind,offset,bOffsetOffset);
1124 }
1125}
1126void Set16Variable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset){
1127 ChangeTypeToWhole(type,DEF_INTEGER);
1128
1129 //pop eax
1130 op_pop(REG_EAX);
1131
1132 if(VarKind==VAR_GLOBAL){
1133 if(bOffsetOffset){
1134 //mov word ptr[ecx+offset],ax
1135 OpBuffer[obp++]=(char)0x66;
1136 OpBuffer[obp++]=(char)0x89;
1137 OpBuffer[obp++]=(char)0x81;
1138 *((long *)(OpBuffer+obp))=offset;
1139 pobj_GlobalVarSchedule->add();
1140 obp+=sizeof(long);
1141 }
1142 else{
1143 //mov word ptr[offset],ax
1144 OpBuffer[obp++]=(char)0x66;
1145 OpBuffer[obp++]=(char)0xA3;
1146 *((long *)(OpBuffer+obp))=offset;
1147 pobj_GlobalVarSchedule->add();
1148 obp+=sizeof(long);
1149 }
1150 }
1151 else if(VarKind==VAR_REFGLOBAL){
1152 //mov ebx,dword ptr[offset]
1153 op_mov_RM( sizeof(long), REG_EBX, REG_NON, (int)offset, MOD_DISP32 );
1154 obp-=sizeof(long);
1155 pobj_GlobalVarSchedule->add();
1156 obp+=sizeof(long);
1157
1158 if(bOffsetOffset){
1159 //add ebx,ecx
1160 OpBuffer[obp++]=(char)0x03;
1161 OpBuffer[obp++]=(char)0xD9;
1162 }
1163
1164 //mov word ptr[ebx],ax
1165 OpBuffer[obp++]=(char)0x66;
1166 OpBuffer[obp++]=(char)0x89;
1167 OpBuffer[obp++]=(char)0x03;
1168 }
1169 else if(VarKind==VAR_LOCAL){
1170 if(bOffsetOffset){
1171 //add ecx,offset
1172 OpBuffer[obp++]=(char)0x81;
1173 OpBuffer[obp++]=(char)0xC1;
1174 *((long *)(OpBuffer+obp))=offset;
1175 AddLocalVarAddrSchedule();
1176 obp+=sizeof(long);
1177
1178 //mov word ptr[ebp+ecx],ax
1179 OpBuffer[obp++]=(char)0x66;
1180 OpBuffer[obp++]=(char)0x89;
1181 OpBuffer[obp++]=(char)0x44;
1182 OpBuffer[obp++]=(char)0x0D;
1183 OpBuffer[obp++]=(char)0x00;
1184 }
1185 else{
1186 //mov word ptr[ebp+offset],ax
1187 OpBuffer[obp++]=(char)0x66;
1188 OpBuffer[obp++]=(char)0x89;
1189 OpBuffer[obp++]=(char)0x85;
1190 *((long *)(OpBuffer+obp))=offset;
1191 AddLocalVarAddrSchedule();
1192 obp+=sizeof(long);
1193 }
1194 }
1195 else if(VarKind==VAR_REFLOCAL){
1196 //mov ebx,dword ptr[ebp+offset]
1197 OpBuffer[obp++]=(char)0x8B;
1198 OpBuffer[obp++]=(char)0x9D;
1199 *((long *)(OpBuffer+obp))=offset;
1200 AddLocalVarAddrSchedule();
1201 obp+=sizeof(long);
1202
1203 if(bOffsetOffset){
1204 //add ebx,ecx
1205 OpBuffer[obp++]=(char)0x03;
1206 OpBuffer[obp++]=(char)0xD9;
1207 }
1208
1209 //mov word ptr[ebx],ax
1210 OpBuffer[obp++]=(char)0x66;
1211 OpBuffer[obp++]=(char)0x89;
1212 OpBuffer[obp++]=(char)0x03;
1213 }
1214 else if(VarKind==VAR_DIRECTMEM){
1215 //mov word ptr[ecx],ax
1216 OpBuffer[obp++]=(char)0x66;
1217 OpBuffer[obp++]=(char)0x89;
1218 OpBuffer[obp++]=(char)0x01;
1219 }
1220}
1221void Set8Variable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset){
1222 ChangeTypeToWhole(type,DEF_SBYTE);
1223
1224 //pop eax
1225 op_pop(REG_EAX);
1226
1227 if(VarKind==VAR_GLOBAL){
1228 if(bOffsetOffset){
1229 //mov byte ptr[ecx+offset],al
1230 OpBuffer[obp++]=(char)0x88;
1231 OpBuffer[obp++]=(char)0x81;
1232 *((long *)(OpBuffer+obp))=offset;
1233 pobj_GlobalVarSchedule->add();
1234 obp+=sizeof(long);
1235 }
1236 else{
1237 //mov byte ptr[offset],al
1238 OpBuffer[obp++]=(char)0xA2;
1239 *((long *)(OpBuffer+obp))=offset;
1240 pobj_GlobalVarSchedule->add();
1241 obp+=sizeof(long);
1242 }
1243 }
1244 else if(VarKind==VAR_REFGLOBAL){
1245 //mov ebx,dword ptr[offset]
1246 op_mov_RM( sizeof(long), REG_EBX, REG_NON, (int)offset, MOD_DISP32 );
1247 obp-=sizeof(long);
1248 pobj_GlobalVarSchedule->add();
1249 obp+=sizeof(long);
1250
1251 if(bOffsetOffset){
1252 //add ebx,ecx
1253 OpBuffer[obp++]=(char)0x03;
1254 OpBuffer[obp++]=(char)0xD9;
1255 }
1256
1257 //mov byte ptr[ebx],al
1258 OpBuffer[obp++]=(char)0x88;
1259 OpBuffer[obp++]=(char)0x03;
1260 }
1261 else if(VarKind==VAR_LOCAL){
1262 if(bOffsetOffset){
1263 //add ecx,offset
1264 OpBuffer[obp++]=(char)0x81;
1265 OpBuffer[obp++]=(char)0xC1;
1266 *((long *)(OpBuffer+obp))=offset;
1267 AddLocalVarAddrSchedule();
1268 obp+=sizeof(long);
1269
1270 //mov byte ptr[ebp+ecx],al
1271 OpBuffer[obp++]=(char)0x88;
1272 OpBuffer[obp++]=(char)0x44;
1273 OpBuffer[obp++]=(char)0x0D;
1274 OpBuffer[obp++]=(char)0x00;
1275 }
1276 else{
1277 //mov byte ptr[ebp+offset],al
1278 OpBuffer[obp++]=(char)0x88;
1279 OpBuffer[obp++]=(char)0x85;
1280 *((long *)(OpBuffer+obp))=offset;
1281 AddLocalVarAddrSchedule();
1282 obp+=sizeof(long);
1283 }
1284 }
1285 else if(VarKind==VAR_REFLOCAL){
1286 //mov ebx,dword ptr[ebp+offset]
1287 OpBuffer[obp++]=(char)0x8B;
1288 OpBuffer[obp++]=(char)0x9D;
1289 *((long *)(OpBuffer+obp))=offset;
1290 AddLocalVarAddrSchedule();
1291 obp+=sizeof(long);
1292
1293 if(bOffsetOffset){
1294 //add ebx,ecx
1295 OpBuffer[obp++]=(char)0x03;
1296 OpBuffer[obp++]=(char)0xD9;
1297 }
1298
1299 //mov byte ptr[ebx],al
1300 OpBuffer[obp++]=(char)0x88;
1301 OpBuffer[obp++]=(char)0x03;
1302 }
1303 else if(VarKind==VAR_DIRECTMEM){
1304 //mov byte ptr[ecx],al
1305 OpBuffer[obp++]=(char)0x88;
1306 OpBuffer[obp++]=(char)0x01;
1307 }
1308}
1309*/
Note: See TracBrowser for help on using the repository browser.