Changeset 235 in dev


Ignore:
Timestamp:
Jul 25, 2007, 11:54:20 AM (17 years ago)
Author:
dai_9181
Message:
 
Location:
trunk/abdev
Files:
7 edited

Legend:

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

    r234 r235  
    710710void CodeGenerator::op_push_M( int base_reg )
    711711{
    712     // push dword ptr[base_reg]
    713     __op_format( (char)0xFF, (char)0x30, base_reg );
     712    if( base_reg == REG_EBP )
     713    {
     714        op_push_M( base_reg, 0 );
     715    }
     716    else
     717    {
     718        // push dword ptr[base_reg]
     719        __op_format( (char)0xFF, (char)0x30, base_reg );
     720    }
    714721}
    715722void CodeGenerator::op_push_M( int base_reg, long offset, Schedule::Type scheduleType )
     
    11581165/////////////////////////////
    11591166
     1167void CodeGenerator::op_call_R( int reg )
     1168{
     1169    // call reg
     1170    pNativeCode->Put( (char)0xFF );
     1171    pNativeCode->Put( (char)(0xD0|REGISTER_OPERAND(reg)) );
     1172}
    11601173void CodeGenerator::op_call(const UserProc *pUserProc){
    11611174    pUserProc->Using();
  • trunk/abdev/BasicCompiler32/Compile_CallProc.cpp

    r225 r235  
    7979
    8080    //mov eax,dword ptr[eax]
    81     OpBuffer[obp++]=(char)0x8B;
    82     OpBuffer[obp++]=(char)0x00;
     81    compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EAX, 0, MOD_BASE );
    8382
    8483    //call eax
    85     OpBuffer[obp++]=(char)0xFF;
    86     OpBuffer[obp++]=(char)0xD0;
     84    compiler.codeGenerator.op_call_R( REG_EAX );
    8785
    8886
     
    325323
    326324        //mov edx,dword ptr[ecx]
    327         OpBuffer[obp++]=(char)0x8B;
    328         OpBuffer[obp++]=(char)0x11;
     325        compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, 0, MOD_BASE );
    329326
    330327        i2 = pobj_c->GetFuncNumInVtbl( pUserProc );
  • trunk/abdev/BasicCompiler32/Compile_Func.cpp

    r227 r235  
    154154
    155155    //push 0
    156     OpBuffer[obp++]=(char)0x6A;
    157     OpBuffer[obp++]=(char)0x00;
     156    compiler.codeGenerator.op_push_V( 0 );
    158157
    159158    //push eax
     
    161160
    162161    //fild qword ptr[esp]
    163     OpBuffer[obp++]=(char)0xDF;
    164     OpBuffer[obp++]=(char)0x2C;
    165     OpBuffer[obp++]=(char)0x24;
     162    compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
    166163
    167164    //add esp,8
     
    213210    if(bArrayHead) typeSize*=JumpSubScripts(subscripts);
    214211
    215     //mov eax,TypeSize
    216     OpBuffer[obp++]=(char)0xB8;
    217     *((long *)(OpBuffer+obp))=typeSize;
    218     obp+=sizeof(long);
     212    //mov eax,typeSize
     213    compiler.codeGenerator.op_mov_RV( REG_EAX, typeSize );
    219214}
    220215void Opcode_Func_AddressOf( const char *name ){
     
    296291
    297292        //mov edx,dword ptr[ecx]
    298         OpBuffer[obp++]=(char)0x8B;
    299         OpBuffer[obp++]=(char)0x11;
     293        compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, 0, MOD_BASE );
    300294
    301295        int i2 = pobj_c->GetFuncNumInVtbl( pUserProc );
     
    419413
    420414        //fld qword ptr[eax]
    421         OpBuffer[obp++]=(char)0xDD;
    422         OpBuffer[obp++]=(char)0x00;
     415        compiler.codeGenerator.PutOld(
     416            (char)0xDD,
     417            (char)0x00
     418        );
    423419    }
    424420    else if(type==DEF_SINGLE||type==DEF_DWORD){
     
    427423
    428424        //mov eax,dword ptr[eax]
    429         OpBuffer[obp++]=(char)0x8B;
    430         OpBuffer[obp++]=(char)0x00;
     425        compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EAX, 0, MOD_BASE );
    431426    }
    432427    else if(type==DEF_QWORD){
     
    448443
    449444        //mov ax,word ptr[ebx]
    450         OpBuffer[obp++]=(char)0x66;
    451         OpBuffer[obp++]=(char)0x8B;
    452         OpBuffer[obp++]=(char)0x03;
     445        compiler.codeGenerator.op_mov_RM( sizeof(short), REG_EAX, REG_EBX, 0, MOD_BASE );
    453446    }
    454447    else if(type==DEF_BYTE){
     
    460453
    461454        //mov al,byte ptr[ebx]
    462         OpBuffer[obp++]=(char)0x8A;
    463         OpBuffer[obp++]=(char)0x03;
     455        compiler.codeGenerator.op_mov_RM( sizeof(char), REG_EAX, REG_EBX, 0, MOD_BASE );
    464456    }
    465457}
  • 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
  • trunk/abdev/BasicCompiler32/Compile_ProcOp.cpp

    r231 r235  
    1818    if( userProc.GetName() == "_System_GetEip" ){
    1919        //mov eax,dword ptr[esp]
    20         OpBuffer[obp++]=(char)0x8B;
    21         OpBuffer[obp++]=(char)0x04;
    22         OpBuffer[obp++]=(char)0x24;
     20        compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE );
    2321
    2422        //ret
     
    379377
    380378    //mov ebp,esp
    381     OpBuffer[obp++]=(char)0x8B;
    382     OpBuffer[obp++]=(char)0xEC;
     379    compiler.codeGenerator.op_mov_RR( REG_EBP, REG_ESP );
    383380
    384381    //push ebx
     
    386383
    387384    //push esi
    388     OpBuffer[obp++]=(char)0x56;
     385    compiler.codeGenerator.op_push( REG_ESI );
    389386
    390387    //push edi
    391     OpBuffer[obp++]=(char)0x57;
     388    compiler.codeGenerator.op_push( REG_EDI );
    392389
    393390    if( !pUserProc->ReturnType().IsNull() ){
     
    457454
    458455        //push dword ptr[ebp](以前のebp)
    459         OpBuffer[obp++]=(char)0xFF;
    460         OpBuffer[obp++]=(char)0x75;
    461         OpBuffer[obp++]=(char)0x00;
     456        compiler.codeGenerator.op_push_M( REG_EBP );
    462457
    463458        //call _DebugSys_StartProc
     
    728723
    729724    //pop edi
    730     OpBuffer[obp++]=(char)0x5F;
     725    compiler.codeGenerator.op_pop( REG_EDI );
    731726
    732727    //pop esi
    733     OpBuffer[obp++]=(char)0x5E;
     728    compiler.codeGenerator.op_pop( REG_ESI );
    734729
    735730    //pop ebx
     
    752747
    753748    //mov esp,ebp
    754     OpBuffer[obp++]=(char)0x8B;
    755     OpBuffer[obp++]=(char)0xE5;
     749    compiler.codeGenerator.op_mov_RR( REG_ESP, REG_EBP );
    756750
    757751    //pop ebp
  • trunk/abdev/BasicCompiler32/NumOpe_TypeOperation.cpp

    r225 r235  
    7272
    7373        //and eax,0000FFFFh
    74         OpBuffer[obp++]=(char)0x25;
    75         *((long *)(OpBuffer+obp))=0x0000FFFF;
    76         obp+=sizeof(long);
     74        compiler.codeGenerator.op_and_RV( REG_EAX, 0x0000FFFF );
    7775
    7876        //push eax
     
    9492
    9593        //and eax,000000FFh
    96         OpBuffer[obp++]=(char)0x25;
    97         *((long *)(OpBuffer+obp))=0x000000FF;
    98         obp+=sizeof(long);
     94        compiler.codeGenerator.op_and_RV( REG_EAX, 0x000000FF );
    9995
    10096        //push eax
     
    118114
    119115        //and eax,000000FFh
    120         OpBuffer[obp++]=(char)0x25;
    121         *((long *)(OpBuffer+obp))=0x000000FF;
    122         obp+=sizeof(long);
     116        compiler.codeGenerator.op_and_RV( REG_EAX, 0x000000FF );
    123117
    124118        //push eax
  • trunk/abdev/BasicCompiler_Common/include/CodeGenerator.h

    r234 r235  
    195195    void fpu_cast_end();
    196196
     197    void op_call_R( int reg );
    197198    void op_call(const UserProc *pUserProc);
    198199    void op_ret();
Note: See TracChangeset for help on using the changeset viewer.