Ignore:
Timestamp:
Jul 25, 2007, 11:54:20 AM (17 years ago)
Author:
dai_9181
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler32/Compile_Object.cpp

    r225 r235  
    8484
    8585        //add eax,TypeSize
    86         OpBuffer[obp++]=(char)0x05;
    87         *((long *)(OpBuffer+obp))=ObjectSize;
    88         obp+=sizeof(long);
     86        compiler.codeGenerator.op_add_RV( REG_EAX, ObjectSize );
    8987
    9088        //sub ebx,1
     
    119117
    120118        //※添え字上限値であることを考慮
    121         //add eax,1
    122         OpBuffer[obp++]=(char)0x83;
    123         OpBuffer[obp++]=(char)0xC0;
    124         OpBuffer[obp++]=(char)0x01;
     119        //inc eax
     120        compiler.codeGenerator.op_inc( REG_EAX );
    125121
    126122        //オブジェクトの個数をebxに一時保持
    127123        //※ebxは関数が呼ばれても不変
    128124        //mov ebx,eax
    129         OpBuffer[obp++]=(char)0x8B;
    130         OpBuffer[obp++]=(char)0xD8;
     125        compiler.codeGenerator.op_mov_RR( REG_EBX, REG_EAX );
    131126
    132127        //imul eax,size
    133         OpBuffer[obp++]=(char)0x69;
    134         OpBuffer[obp++]=(char)0xC0;
    135         *((long *)(OpBuffer+obp))=typeSize;
    136         obp+=sizeof(long);
     128        compiler.codeGenerator.op_imul_RV( REG_EAX, typeSize );
    137129
    138130        //add eax,OBJECT_HEAD_SIZE
    139         OpBuffer[obp++]=(char)0x05;
    140         *((long *)(OpBuffer+obp))=OBJECT_HEAD_SIZE;
    141         obp+=sizeof(long);
     131        compiler.codeGenerator.op_add_RV8( REG_EAX, (char)OBJECT_HEAD_SIZE );
    142132
    143133        //push eax
     
    148138        //※ebxは関数が呼ばれても不変
    149139        //mov ebx,1
    150         OpBuffer[obp++]=(char)0xBB;
    151         *((long *)(OpBuffer+obp))=1;
    152         obp+=sizeof(long);
     140        compiler.codeGenerator.op_mov_RV( REG_EBX, 1 );
    153141
    154142        //push size + OBJECT_HEAD_SIZE
    155         OpBuffer[obp++]=(char)0x68;
    156         *((long *)(OpBuffer+obp))=typeSize + OBJECT_HEAD_SIZE;
    157         obp+=sizeof(long);
     143        compiler.codeGenerator.op_push_V( typeSize + OBJECT_HEAD_SIZE );
    158144    }
    159145
     
    188174    compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EBX, REG_EAX, 0, MOD_BASE );
    189175
    190     //add eax,sizeof(DWORD)
    191     OpBuffer[obp++]=(char)0x05;
    192     *((long *)(OpBuffer+obp))=sizeof(DWORD);
    193     obp+=sizeof(long);
    194 
     176    //add eax,sizeof(long)
     177    compiler.codeGenerator.op_add_RV8( REG_EAX, sizeof(long) );
    195178
    196179    //mov ecx,TypeSize
    197     OpBuffer[obp++]=(char)0xB9;
    198     *((long *)(OpBuffer+obp))=typeSize;
    199     obp+=sizeof(long);
     180    compiler.codeGenerator.op_mov_RV( REG_ECX, typeSize );
    200181
    201182    //mov dword ptr[eax],ecx(オブジェクトのサイズ)
    202183    compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_EAX, 0, MOD_BASE );
    203184
    204     //add eax,sizeof(DWORD)
    205     OpBuffer[obp++]=(char)0x05;
    206     *((long *)(OpBuffer+obp))=sizeof(DWORD);
    207     obp+=sizeof(long);
     185    //add eax,sizeof(long)
     186    compiler.codeGenerator.op_add_RV8( REG_EAX, sizeof(long) );
    208187
    209188
     
    220199    compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_EAX, 0, MOD_BASE );
    221200
    222     //add eax,sizeof(DWORD)
    223     OpBuffer[obp++]=(char)0x05;
    224     *((long *)(OpBuffer+obp))=sizeof(DWORD);
    225     obp+=sizeof(long);
     201    //add eax,sizeof(long)
     202    compiler.codeGenerator.op_add_RV8( REG_EAX, sizeof(long) );
    226203
    227204
    228205    // リザーブ領域
    229     //add eax,sizeof(DWORD)
    230     OpBuffer[obp++]=(char)0x05;
    231     *((long *)(OpBuffer+obp))=sizeof(DWORD);
    232     obp+=sizeof(long);
     206    //add eax,sizeof(long)
     207    compiler.codeGenerator.op_add_RV8( REG_EAX, sizeof(long) );
    233208
    234209
     
    264239
    265240    //mov ebx,dword ptr[eax](オブジェクトの個数)
    266     OpBuffer[obp++]=(char)0x8B;
    267     OpBuffer[obp++]=(char)0x18;
    268 
    269     //add eax,sizeof(DWORD)
    270     OpBuffer[obp++]=(char)0x05;
    271     *((long *)(OpBuffer+obp))=sizeof(DWORD);
    272     obp+=sizeof(long);
     241    compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EBX, REG_EAX, 0, MOD_BASE );
     242
     243    //add eax,sizeof(long)
     244    compiler.codeGenerator.op_add_RV8( REG_EAX, sizeof(long) );
    273245
    274246
    275247    //mov esi,dword ptr[eax](オブジェクトのサイズ)
    276     OpBuffer[obp++]=(char)0x8B;
    277     OpBuffer[obp++]=(char)0x30;
    278 
    279     //add eax,sizeof(DWORD)
    280     OpBuffer[obp++]=(char)0x05;
    281     *((long *)(OpBuffer+obp))=sizeof(DWORD);
    282     obp+=sizeof(long);
     248    compiler.codeGenerator.op_mov_RM( sizeof(long), REG_ESI, REG_EAX, 0, MOD_BASE );
     249
     250    //add eax,sizeof(long)
     251    compiler.codeGenerator.op_add_RV8( REG_EAX, sizeof(long) );
    283252
    284253
    285254    //mov edx,dword ptr[eax](デストラクタの関数ポインタ)
    286     OpBuffer[obp++]=(char)0x8B;
    287     OpBuffer[obp++]=(char)0x10;
    288 
    289     //add eax,sizeof(DWORD)
    290     OpBuffer[obp++]=(char)0x05;
    291     *((long *)(OpBuffer+obp))=sizeof(DWORD);
    292     obp+=sizeof(long);
     255    compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_EAX, 0, MOD_BASE );
     256
     257    //add eax,sizeof(long)
     258    compiler.codeGenerator.op_add_RV8( REG_EAX, sizeof(long) );
    293259
    294260
    295261    // リザーブ領域
    296     //add eax,sizeof(DWORD)
    297     OpBuffer[obp++]=(char)0x05;
    298     *((long *)(OpBuffer+obp))=sizeof(DWORD);
    299     obp+=sizeof(long);
     262    //add eax,sizeof(long)
     263    compiler.codeGenerator.op_add_RV8( REG_EAX, sizeof(long) );
    300264
    301265
    302266    //mov ecx,eax
    303     OpBuffer[obp++]=(char)0x8B;
    304     OpBuffer[obp++]=(char)0xC8;
     267    compiler.codeGenerator.op_mov_RR( REG_ECX, REG_EAX );
    305268
    306269
     
    319282
    320283    //call edx
    321     OpBuffer[obp++]=(char)0xFF;
    322     OpBuffer[obp++]=(char)0xD2;
     284    compiler.codeGenerator.op_call_R( REG_EDX );
    323285
    324286    //pop edx
Note: See TracChangeset for help on using the changeset viewer.