Changeset 241 in dev for trunk


Ignore:
Timestamp:
Jul 27, 2007, 12:06:11 AM (17 years ago)
Author:
dai_9181
Message:
 
Location:
trunk/abdev
Files:
8 edited

Legend:

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

    r240 r241  
    443443
    444444    //Continueアドレスを初期化
    445     extern DWORD dwContinueAddress;
    446     dwContinueAddress=-1;
     445    compiler.codeGenerator.ClearContinueArea();
    447446
    448447    if(bDebugCompile&&bDebugSupportProc==0){
  • trunk/abdev/BasicCompiler32/Compile_Statement.cpp

    r236 r241  
    126126
    127127void OpcodeIf(char *Parameter){
    128     int i,i2,i3,i4;
     128    int i,i2;
    129129    Type tempType;
    130130
     
    140140    }
    141141
     142    CodeGenerator::PertialSchedule *pIfPertialSchedule = NULL;
    142143    if( !NumOpe(Parameter,Type(),tempType) ){
    143144        //NumOpe内でエラー
    144         i3=-1;  //ダミー
    145145    }
    146146    else if( tempType.IsDouble() ){
     
    167167
    168168        //jne (endif、または else まで)
    169         OpBuffer[obp++]=(char)0x0F;
    170         OpBuffer[obp++]=(char)0x85;
    171         obp+=sizeof(long);
    172 
    173         //jneの番地
    174         i3=obp;
     169        pIfPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
    175170    }
    176171    else if( tempType.IsSingle() ){
     
    197192
    198193        //jne (endif、または else まで)
    199         OpBuffer[obp++]=(char)0x0F;
    200         OpBuffer[obp++]=(char)0x85;
    201         obp+=sizeof(long);
    202 
    203         //jneの番地
    204         i3=obp;
     194        pIfPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
    205195    }
    206196    else if( tempType.Is64() ){
     
    217207
    218208        //jne
    219         OpBuffer[obp++]=(char)0x0F;
    220         OpBuffer[obp++]=(char)0x85;
    221         obp+=sizeof(long);
    222         i3=obp;
    223 
     209        CodeGenerator::PertialSchedule *pTempPertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
    224210
    225211        //cmp ebx,0
     
    227213
    228214        //jne
    229         OpBuffer[obp++]=(char)0x0F;
    230         OpBuffer[obp++]=(char)0x85;
    231         obp+=sizeof(long);
    232         i4=obp;
    233 
    234 
     215        CodeGenerator::PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
    235216
    236217        //jmp (endif、または else までジャンプ)
    237         OpBuffer[obp++]=(char)0xE9;
    238         obp+=sizeof(long);
    239 
    240         *((long *)(OpBuffer+i3-sizeof(long)))=obp-i3;
    241         *((long *)(OpBuffer+i4-sizeof(long)))=obp-i4;
    242 
    243         //jmpの番地
    244         i3=obp;
     218        pIfPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
     219
     220        compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule1 );
     221        compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule2 );
    245222    }
    246223    else{
     
    254231
    255232        //je (endif、または else まで条件ジャンプ)
    256         OpBuffer[obp++]=(char)0x0F;
    257         OpBuffer[obp++]=(char)0x84;
    258         obp+=sizeof(long);
    259 
    260         //jeの番地
    261         i3=obp;
     233        pIfPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
    262234    }
    263235
     
    276248
    277249
    278     if(i3==-1) return;
     250    if( pIfPertialSchedule == NULL ) return;
    279251
    280252    if(i2==ESC_ELSE){
    281253        //jmp (endifまで)
    282         OpBuffer[obp++]=(char)0xE9;
    283         obp+=sizeof(long);
    284 
    285         *((long *)(OpBuffer+i3-sizeof(long)))=obp-i3;   //ifからelseへのジャンプ先のオフセット値
    286 
    287         i3=obp;
     254        CodeGenerator::PertialSchedule *pTempPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
     255
     256        compiler.codeGenerator.opfix_JmpPertialSchedule( pIfPertialSchedule );
    288257
    289258
     
    301270
    302271
    303         *((long *)(OpBuffer+i3-sizeof(long)))=obp-i3;   //jmpジャンプ先のオフセット値
     272        compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
    304273    }
    305274    else{
    306         *((long *)(OpBuffer+i3-sizeof(long)))=obp-i3;   //jeジャンプ先のオフセット値
     275        compiler.codeGenerator.opfix_JmpPertialSchedule( pIfPertialSchedule );
    307276    }
    308277}
     
    371340void OpcodeWhile(char *Parameter){
    372341    extern HANDLE hHeap;
    373     int i2,i3 = 0;
    374342
    375343    //Continueアドレスのバックアップとセット
    376     extern DWORD dwContinueAddress;
    377     DWORD dwTempContinue;
    378     dwTempContinue=dwContinueAddress;
    379     dwContinueAddress=obp;
     344    compiler.codeGenerator.ContinueAreaBegin();
    380345
    381346    if(!Parameter[0]) SetError(10,"While",cp);
    382347
    383     int je_schedule;
     348    CodeGenerator::PertialSchedule *pWhilePertialSchedule = NULL;
    384349    Type tempType;
    385350    if( !NumOpe(Parameter,Type(),tempType) ){
    386351        //ダミー
    387         i3=-1;
    388352    }
    389353    else if( tempType.IsDouble() ){
     
    410374
    411375        //jne (Wend まで)
    412         OpBuffer[obp++]=(char)0x0F;
    413         OpBuffer[obp++]=(char)0x85;
    414         obp+=sizeof(long);
    415 
    416         //jeの番地
    417         je_schedule=obp;
     376        pWhilePertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
    418377    }
    419378    else if( tempType.IsSingle() ){
     
    436395        compiler.codeGenerator.op_fnstsw_ax();
    437396
    438         //test ah,40
     397        //test ah,40h
    439398        compiler.codeGenerator.op_test_ah( (char)0x40 );
    440399
    441400        //jne (Wend まで)
    442         OpBuffer[obp++]=(char)0x0F;
    443         OpBuffer[obp++]=(char)0x85;
    444         obp+=sizeof(long);
    445 
    446         //jeの番地
    447         je_schedule=obp;
     401        pWhilePertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
    448402    }
    449403    else if( tempType.Is64() ){
     
    460414
    461415        //jne
    462         OpBuffer[obp++]=(char)0x0F;
    463         OpBuffer[obp++]=(char)0x85;
    464         obp+=sizeof(long);
    465         i2=obp;
    466 
     416        CodeGenerator::PertialSchedule *pTempPertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
    467417
    468418        //cmp ebx,0
     
    470420
    471421        //jne
    472         OpBuffer[obp++]=(char)0x0F;
    473         OpBuffer[obp++]=(char)0x85;
    474         obp+=sizeof(long);
    475         i3=obp;
    476 
    477 
    478         //jmp (endif、または else までジャンプ)
    479         OpBuffer[obp++]=(char)0xE9;
    480         obp+=sizeof(long);
    481 
    482         *((long *)(OpBuffer+i2-sizeof(long)))=obp-i2;
    483         *((long *)(OpBuffer+i3-sizeof(long)))=obp-i3;
    484 
    485         //jmpの番地
    486         je_schedule=obp;
     422        CodeGenerator::PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
     423
     424        //jmp (Wendまでジャンプ)
     425        pWhilePertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
     426
     427        compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule1 );
     428        compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule2 );
    487429    }
    488430    else{
     
    496438
    497439        //je (Wend まで)
    498         OpBuffer[obp++]=(char)0x0F;
    499         OpBuffer[obp++]=(char)0x84;
    500         obp+=sizeof(long);
    501 
    502         //実行中の番地
    503         je_schedule=obp;
     440        pWhilePertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
    504441    }
    505442
     
    512449    GetLexicalScopes().CallDestructorsOfScopeEnd();
    513450
    514     if( i3 == -1 ){
    515         return;
    516     }
    517 
    518451    //jmp ...
    519     OpBuffer[obp++]=(char)0xE9;
    520     *((long *)(OpBuffer+obp))=dwContinueAddress-(obp+sizeof(long));
    521     obp+=sizeof(long);
     452    compiler.codeGenerator.op_jmp_continue();
    522453
    523454    //レキシカルスコープをレベルダウン
    524455    GetLexicalScopes().End();
    525456
    526     *((long *)(OpBuffer+je_schedule-sizeof(long)))=obp-je_schedule; //jeジャンプ先のオフセット値
    527 
    528     //Continueアドレスを復元
    529     dwContinueAddress=dwTempContinue;
     457    if( pWhilePertialSchedule )
     458    {
     459        compiler.codeGenerator.opfix_JmpPertialSchedule( pWhilePertialSchedule );
     460    }
     461
     462    compiler.codeGenerator.ContinueAreaEnd();
    530463}
    531464
     
    533466void OpcodeFor(char *Parameter){
    534467    extern HANDLE hHeap;
    535     int i,i2,i3;
     468    int i,i2;
    536469    char temporary[VN_SIZE],variable[VN_SIZE],JudgeNum[VN_SIZE],StepNum[VN_SIZE];
    537470
     
    559492
    560493    //jmp ...
    561     OpBuffer[obp++]=(char)0xE9;
    562     i2=obp;
    563     obp+=sizeof(long);
     494    CodeGenerator::PertialSchedule *pTempPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
    564495
    565496    //Continueアドレスのバックアップとセット
    566     extern DWORD dwContinueAddress;
    567     DWORD dwTempContinue;
    568     dwTempContinue=dwContinueAddress;
    569     dwContinueAddress=obp;
     497    compiler.codeGenerator.ContinueAreaBegin();
    570498
    571499    //第2パラメータを取得(to~)
     
    583511    OpcodeCalc(temporary);
    584512
    585     *((long *)(OpBuffer+i2))=obp-(i2+sizeof(long));
     513    compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
    586514
    587515    //増加か減少かを区別する
     
    596524
    597525    //je [カウンタ減少の場合の判定]
    598     OpBuffer[obp++]=(char)0x0F;
    599     OpBuffer[obp++]=(char)0x84;
    600     i2=obp;
    601     obp+=sizeof(long);
     526    pTempPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
    602527
    603528    //判定(カウンタ増加の場合)
     
    609534
    610535    //jmp [カウンタ減少の場合の判定を飛び越す]
    611     OpBuffer[obp++]=(char)0xE9;
    612     i3=obp;
    613     obp+=sizeof(long);
    614 
    615     *((long *)(OpBuffer+i2))=obp-(i2+sizeof(long)); //jeジャンプ先のオフセット値
     536    CodeGenerator::PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
     537
     538    //jeジャンプ先のオフセット値
     539    compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
    616540
    617541    //判定(カウンタ減少の場合)
     
    622546    compiler.codeGenerator.op_pop(REG_EAX);
    623547
    624     *((long *)(OpBuffer+i3))=obp-(i3+sizeof(long)); //jmpジャンプ先のオフセット値
     548    //jmpジャンプ先のオフセット値
     549    compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule2 );
    625550
    626551    //cmp eax,0
     
    630555
    631556    //je ...
    632     OpBuffer[obp++]=(char)0x0F;
    633     OpBuffer[obp++]=(char)0x84;
    634     int je_schedule=obp;
    635     obp+=sizeof(long);
     557    pTempPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
    636558
    637559    //レキシカルスコープをレベルアップ
     
    650572
    651573    //jmp ...
    652     OpBuffer[obp++]=(char)0xE9;
    653     *((long *)(OpBuffer+obp))=dwContinueAddress-(obp+sizeof(long));
    654     obp+=sizeof(long);
     574    compiler.codeGenerator.op_jmp_continue();
    655575
    656576    //レキシカルスコープをレベルダウン
    657577    GetLexicalScopes().End();
    658578
    659     *((long *)(OpBuffer+je_schedule))=obp-(je_schedule+sizeof(long)); //jeジャンプ先のオフセット値
     579    //jeジャンプ先のオフセット値
     580    compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
    660581
    661582    //Continueアドレスを復元
    662     dwContinueAddress=dwTempContinue;
     583    compiler.codeGenerator.ContinueAreaEnd();
    663584}
    664585
     
    670591
    671592    //Continueアドレスのバックアップとセット
    672     extern DWORD dwContinueAddress;
    673     DWORD dwTempContinue;
    674     dwTempContinue=dwContinueAddress;
    675     dwContinueAddress=obp;
     593    compiler.codeGenerator.ContinueAreaBegin();
    676594
    677595    //レキシカルスコープをレベルアップ
     
    682600
    683601    GetLexicalScopes().CallDestructorsOfScopeEnd();
     602
     603    CodeGenerator::PertialSchedule *pDoPertialSchedule = NULL;
    684604
    685605    extern char *basbuf;
     
    731651
    732652                    //jne 5(ループ終了)
    733                     OpBuffer[obp++]=(char)0x75;
    734                     OpBuffer[obp++]=(char)0x05;
     653                    pDoPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
    735654                }
    736655                else if(basbuf[i3]=='1'){
     
    738657
    739658                    //je 5(ループ終了)
    740                     OpBuffer[obp++]=(char)0x74;
    741                     OpBuffer[obp++]=(char)0x05;
     659                    pDoPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(char), true );
    742660                }
    743661            }
     
    768686
    769687                    //jne 5(ループ終了)
    770                     OpBuffer[obp++]=(char)0x75;
    771                     OpBuffer[obp++]=(char)0x05;
     688                    pDoPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
    772689                }
    773690                else if(basbuf[i3]=='1'){
     
    775692
    776693                    //je 5(ループ終了)
    777                     OpBuffer[obp++]=(char)0x74;
    778                     OpBuffer[obp++]=(char)0x05;
     694                    pDoPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(char), true );
    779695                }
    780696            }
     
    812728
    813729                    //jmp 5(ループ終了)
    814                     OpBuffer[obp++]=(char)0xEB;
    815                     OpBuffer[obp++]=(char)0x05;
     730                    pDoPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(char), true );
    816731
    817732                    *((long *)(OpBuffer+i2-sizeof(long)))=obp-i2;
     
    829744
    830745                    //jmp 5(ループ終了)
    831                     OpBuffer[obp++]=(char)0xEB;
    832                     OpBuffer[obp++]=(char)0x05;
     746                    pDoPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(char), true );
    833747                }
    834748            }
     
    844758
    845759                    //je 5(ループ終了)
    846                     OpBuffer[obp++]=(char)0x74;
    847                     OpBuffer[obp++]=(char)0x05;
     760                    pDoPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(char), true );
    848761                }
    849762                else if(basbuf[i3]=='1'){
     
    851764
    852765                    //jne 5(ループ終了)
    853                     OpBuffer[obp++]=(char)0x75;
    854                     OpBuffer[obp++]=(char)0x05;
     766                    pDoPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
    855767                }
    856768            }
     
    860772
    861773    //jmp ...
    862     OpBuffer[obp++]=(char)0xE9;
    863     *((long *)(OpBuffer+obp))=dwContinueAddress-(obp+sizeof(long));
    864     obp+=sizeof(long);
     774    compiler.codeGenerator.op_jmp_continue();
     775
     776    if( pDoPertialSchedule )
     777    {
     778        compiler.codeGenerator.opfix_JmpPertialSchedule( pDoPertialSchedule );
     779    }
    865780
    866781    //jmp ...
     
    876791
    877792    //Continueアドレスを復元
    878     dwContinueAddress=dwTempContinue;
     793    compiler.codeGenerator.ContinueAreaEnd();
    879794}
    880795void OpcodeContinue(void){
    881     extern DWORD dwContinueAddress;
    882 
    883     if(dwContinueAddress==-1){
    884         SetError(12,"Continue",cp);
    885         return;
    886     }
    887 
    888796    //jmp ...(Continue addr)
    889     OpBuffer[obp++]=(char)0xE9;
    890 
    891     *((long *)(OpBuffer+obp))=dwContinueAddress-(obp+sizeof(long));
    892     obp+=sizeof(long);
     797    compiler.codeGenerator.op_jmp_continue();
    893798}
    894799
  • trunk/abdev/BasicCompiler32/Compile_Var.cpp

    r237 r241  
    140140
    141141        //add dword ptr[esp],eax
    142         OpBuffer[obp++]=(char)0x01;
    143         OpBuffer[obp++]=(char)0x04;
    144         OpBuffer[obp++]=(char)0x24;
     142        compiler.codeGenerator.PutOld(
     143            (char)0x01,
     144            (char)0x04,
     145            (char)0x24
     146        );
    145147
    146148        HeapDefaultFree(pParm[i]);
     
    238240    if(offset){
    239241        //add ecx,offset
    240         OpBuffer[obp++]=(char)0x81;
    241         OpBuffer[obp++]=(char)0xC1;
    242         *((long *)(OpBuffer+obp))=offset;
    243         obp+=sizeof(long);
     242        compiler.codeGenerator.op_add_RV( REG_ECX, offset );
    244243    }
    245244
     
    314313
    315314                //mov ecx,dword ptr[ecx]
    316                 OpBuffer[obp++]=(char)0x8B;
    317                 OpBuffer[obp++]=(char)0x09;
     315                compiler.codeGenerator.op_mov_RM( sizeof(long), REG_ECX, REG_ECX, 0, MOD_BASE );
    318316            }
    319317            else{
     
    669667
    670668                //mov ecx,dword ptr[eax]
    671                 OpBuffer[obp++]=(char)0x8B;
    672                 OpBuffer[obp++]=(char)0x08;
     669                compiler.codeGenerator.op_mov_RM( sizeof(long), REG_ECX, REG_EAX, 0, MOD_BASE );
    673670            }
    674671        }
     
    690687
    691688                //mov ecx,dword ptr[eax]
    692                 OpBuffer[obp++]=(char)0x8B;
    693                 OpBuffer[obp++]=(char)0x08;
     689                compiler.codeGenerator.op_mov_RM( sizeof(long), REG_ECX, REG_EAX, 0, MOD_BASE );
    694690            }
    695691            else{
     
    964960    if( type.IsDouble() ){
    965961        //mov eax,HILONG(dbl)
    966         OpBuffer[obp++]=(char)0xB8;
    967         *((long *)(OpBuffer+obp))=(long)*(long *)(((char *)(&dbl))+4);
    968         obp+=sizeof(long);
     962        compiler.codeGenerator.op_mov_RV( REG_EAX, *(long *)(((char *)(&dbl))+4) );
    969963
    970964        //mov dword ptr[ebp+offset+sizeof(long)],eax
     
    11331127
    11341128            //mov eax,ebp
    1135             OpBuffer[obp++]=(char)0x8B;
    1136             OpBuffer[obp++]=(char)0xC5;
     1129            compiler.codeGenerator.op_mov_RR( REG_EAX, REG_EBP );
    11371130
    11381131            //add eax,offset
     
    11921185        if(pRelativeVar->bOffsetOffset){
    11931186            //mov eax,ecx
    1194             OpBuffer[obp++]=(char)0x8B;
    1195             OpBuffer[obp++]=(char)0xC1;
     1187            compiler.codeGenerator.op_mov_RR( REG_EAX, REG_ECX );
    11961188
    11971189            //add eax,dword ptr[offset]
     
    12091201
    12101202            //lea eax,dword ptr[ebp+ecx]
    1211             OpBuffer[obp++]=(char)0x8D;
    1212             OpBuffer[obp++]=(char)0x44;
    1213             OpBuffer[obp++]=(char)0x0D;
    1214             OpBuffer[obp++]=(char)0x00;
     1203            compiler.codeGenerator.PutOld(
     1204                (char)0x8D,
     1205                (char)0x44,
     1206                (char)0x0D,
     1207                (char)0x00
     1208            );
    12151209        }
    12161210        else{
  • trunk/abdev/BasicCompiler32/MakePeHdr.cpp

    r234 r241  
    434434
    435435        //Continueアドレスを初期化
    436         extern DWORD dwContinueAddress;
    437         dwContinueAddress=-1;
     436        compiler.codeGenerator.ClearContinueArea();
    438437
    439438        // コード生成対象を選択
  • trunk/abdev/BasicCompiler_Common/Compile.cpp

    r232 r241  
    2323LABEL *pLabelNames;
    2424int MaxLabelNum;
    25 
    26 //Continueアドレス
    27 DWORD dwContinueAddress;
    2825
    2926//Caseスケジュール
  • trunk/abdev/BasicCompiler_Common/include/CodeGenerator.h

    r240 r241  
    5252
    5353private:
     54
     55    // 部分スケジュールの管理
    5456    typedef std::vector<PertialSchedule *> PertialSchedules;
    5557    PertialSchedules pertialSchedules;
    5658
     59    // Continue用のコード位置情報の管理
     60    std::vector<long> continueCodePositions;
     61    std::vector<long> _continueCodePositions_ObpOld;
     62
    5763public:
    5864
     
    7884    }
    7985
     86    long GetContinueCodePos() const
     87    {
     88        if( continueCodePositions.size() == 0 )
     89        {
     90            return -1;
     91        }
     92        return continueCodePositions[continueCodePositions.size()-1];
     93    }
     94    void ClearContinueArea()
     95    {
     96        continueCodePositions.clear();
     97        _continueCodePositions_ObpOld.clear();
     98    }
     99    void ContinueAreaBegin()
     100    {
     101        continueCodePositions.push_back( pNativeCode->GetSize() );
     102
     103        extern int obp;
     104        _continueCodePositions_ObpOld.push_back( obp );
     105    }
     106    void ContinueAreaEnd()
     107    {
     108        continueCodePositions.pop_back();
     109        _continueCodePositions_ObpOld.pop_back();
     110    }
     111    long GetContinueCodePosOld() const
     112    {
     113        if( _continueCodePositions_ObpOld.size() == 0 )
     114        {
     115            return -1;
     116        }
     117        return _continueCodePositions_ObpOld[_continueCodePositions_ObpOld.size()-1];
     118    }
     119
    80120    void CheckUnresolveSchedule();
    81121
     
    88128
    89129private:
    90     PertialSchedule *__jmp_op_format( char opcode, long offset, int op_size, bool isPertialSchedule = false );
     130    PertialSchedule *__jmp_op_format( char opcode, long offset, int op_size, bool isPertialSchedule = false, bool isSelfOpcodeOffset = false );
    91131public:
    92132    PertialSchedule *op_jle( long offset, int op_size = sizeof(char), bool isPertialSchedule = false );
     
    100140    PertialSchedule *op_jne( long offset, int op_size = sizeof(char), bool isPertialSchedule = false );
    101141    PertialSchedule *op_je( long offset, int op_size = sizeof(char), bool isPertialSchedule = false );
    102     PertialSchedule *op_jmp( long offset, int op_size = sizeof(char), bool isPertialSchedule = false );
     142    PertialSchedule *op_jmp( long offset, int op_size = sizeof(char), bool isPertialSchedule = false, bool isSelfOpcodeOffset = false );
     143    void op_jmp_continue();
    103144
    104145
  • trunk/abdev/BasicCompiler_Common/include/NativeCode.h

    r237 r241  
    141141        // 未完成
    142142        extern char *OpBuffer;
    143         extern int obp;
    144143        OpBuffer[_obpOld] = c;
     144    }
     145    void Overwrite( int codePos, long newLongValue )
     146    {
     147        *(long *)(this->codeBuffer+codePos) = newLongValue;
     148    }
     149    void OverwriteOld( int _obpOld, long newLongValue )
     150    {
     151        // 未完成
     152        extern char *OpBuffer;
     153        *(long *)(OpBuffer+_obpOld) = newLongValue;
    145154    }
    146155
  • trunk/abdev/BasicCompiler_Common/src/CommonCodeGenerator.cpp

    r239 r241  
    2323        if( (*it) == pPertialSchedule )
    2424        {
     25            long newValue = pNativeCode->GetSize() - (pPertialSchedule->GetCodePos()+pPertialSchedule->GetTypeSize());
     26
     27            extern int obp;
     28            long newValueOld = obp - (pPertialSchedule->GetObpOld()+pPertialSchedule->GetTypeSize());
     29
    2530            if( pPertialSchedule->GetTypeSize() == sizeof(char) )
    2631            {
    27                 pNativeCode->Overwrite( pPertialSchedule->GetCodePos(), (char)( pNativeCode->GetSize() - (pPertialSchedule->GetCodePos()+1) ) );
     32                if( newValue < -128 || 127 < newValue )
     33                {
     34                    // 範囲外
     35                    SetError();
     36                }
     37
     38                pNativeCode->Overwrite( pPertialSchedule->GetCodePos(), (char)newValue );
    2839
    2940                // TODO: 未完成(用が無くなったら消す)
    30                 extern int obp;
    31                 pNativeCode->OverwriteOld( pPertialSchedule->GetObpOld(), (char)( obp - (pPertialSchedule->GetObpOld()+1) ) );
     41                pNativeCode->OverwriteOld( pPertialSchedule->GetObpOld(), (char)newValueOld );
     42            }
     43            else if( pPertialSchedule->GetTypeSize() == sizeof(long) )
     44            {
     45                pNativeCode->Overwrite( pPertialSchedule->GetCodePos(), newValue );
     46
     47                // TODO: 未完成(用が無くなったら消す)
     48                pNativeCode->OverwriteOld( pPertialSchedule->GetObpOld(), newValueOld );
    3249            }
    3350            else
     
    5269    }
    5370}
    54 CodeGenerator::PertialSchedule *CodeGenerator::__jmp_op_format( char opcode, long offset, int op_size, bool isPertialSchedule )
    55 {
    56     pNativeCode->Put( opcode );
     71CodeGenerator::PertialSchedule *CodeGenerator::__jmp_op_format( char opcode, long offset, int op_size, bool isPertialSchedule, bool isSelfOpcodeOffset )
     72{
     73    long beginCodePos = pNativeCode->GetSize();
     74    {
     75        // TODO: 未完成
     76        extern int obp;
     77        beginCodePos = obp;
     78    }
     79
     80    if( opcode == (char)0xEB )
     81    {
     82        // jmp命令のとき
     83        if( op_size == sizeof(char) )
     84        {
     85            pNativeCode->Put( (char)opcode );
     86        }
     87        else if( op_size == sizeof(long) )
     88        {
     89            pNativeCode->Put( (char)0xE9 );
     90        }
     91        else
     92        {
     93            SetError();
     94        }
     95    }
     96    else
     97    {
     98        if( op_size == sizeof(char) )
     99        {
     100            pNativeCode->Put( (char)((char)0x70 | opcode) );
     101        }
     102        else if( op_size == sizeof(long) )
     103        {
     104            pNativeCode->Put( (char)0x0F );
     105            pNativeCode->Put( (char)((char)0x80 | opcode) );
     106        }
     107        else
     108        {
     109            SetError();
     110        }
     111    }
    57112
    58113    PertialSchedule *pPertialSchedule = NULL;
     
    63118    }
    64119
     120    if( isSelfOpcodeOffset )
     121    {
     122        // 自分自身の命令サイズを考慮する場合
     123        //offset += ( pNativeCode->GetSize() - beginCodePos ) + op_size;
     124
     125        // TODO: 未完成
     126        extern int obp;
     127        offset -= ( obp - beginCodePos ) + op_size;
     128    }
     129
    65130    if( op_size == sizeof(char) )
    66131    {
     
    69134    else if( op_size == sizeof(long) )
    70135    {
     136        pNativeCode->Put( offset );
     137    }
     138    else
     139    {
    71140        SetError();
    72         pNativeCode->Put( offset );
    73     }
    74     else
    75     {
    76         SetError();
    77141    }
    78142
     
    81145CodeGenerator::PertialSchedule *CodeGenerator::op_jle( long offset, int op_size, bool isPertialSchedule )
    82146{
    83     return __jmp_op_format( (char)0x7E, offset, op_size, isPertialSchedule );
     147    return __jmp_op_format( (char)0x0E, offset, op_size, isPertialSchedule );
    84148}
    85149CodeGenerator::PertialSchedule *CodeGenerator::op_jbe( long offset, int op_size, bool isPertialSchedule )
    86150{
    87     return __jmp_op_format( (char)0x76, offset, op_size, isPertialSchedule );
     151    return __jmp_op_format( (char)0x06, offset, op_size, isPertialSchedule );
    88152}
    89153CodeGenerator::PertialSchedule *CodeGenerator::op_jge( long offset, int op_size, bool isPertialSchedule )
    90154{
    91     return __jmp_op_format( (char)0x7D, offset, op_size, isPertialSchedule );
     155    return __jmp_op_format( (char)0x0D, offset, op_size, isPertialSchedule );
    92156}
    93157CodeGenerator::PertialSchedule *CodeGenerator::op_jae( long offset, int op_size, bool isPertialSchedule )
    94158{
    95     return __jmp_op_format( (char)0x73, offset, op_size, isPertialSchedule );
     159    return __jmp_op_format( (char)0x03, offset, op_size, isPertialSchedule );
    96160}
    97161CodeGenerator::PertialSchedule *CodeGenerator::op_jl( long offset, int op_size, bool isPertialSchedule )
    98162{
    99     return __jmp_op_format( (char)0x7C, offset, op_size, isPertialSchedule );
     163    return __jmp_op_format( (char)0x0C, offset, op_size, isPertialSchedule );
    100164}
    101165CodeGenerator::PertialSchedule *CodeGenerator::op_jb( long offset, int op_size, bool isPertialSchedule )
    102166{
    103     return __jmp_op_format( (char)0x72, offset, op_size, isPertialSchedule );
     167    return __jmp_op_format( (char)0x02, offset, op_size, isPertialSchedule );
    104168}
    105169CodeGenerator::PertialSchedule *CodeGenerator::op_jg( long offset, int op_size, bool isPertialSchedule )
    106170{
    107     return __jmp_op_format( (char)0x7F, offset, op_size, isPertialSchedule );
     171    return __jmp_op_format( (char)0x0F, offset, op_size, isPertialSchedule );
    108172}
    109173CodeGenerator::PertialSchedule *CodeGenerator::op_ja( long offset, int op_size, bool isPertialSchedule )
    110174{
    111     return __jmp_op_format( (char)0x77, offset, op_size, isPertialSchedule );
     175    return __jmp_op_format( (char)0x07, offset, op_size, isPertialSchedule );
    112176}
    113177CodeGenerator::PertialSchedule *CodeGenerator::op_jne( long offset, int op_size, bool isPertialSchedule )
    114178{
    115     return __jmp_op_format( (char)0x75, offset, op_size, isPertialSchedule );
     179    return __jmp_op_format( (char)0x05, offset, op_size, isPertialSchedule );
    116180}
    117181CodeGenerator::PertialSchedule *CodeGenerator::op_je( long offset, int op_size, bool isPertialSchedule )
    118182{
    119     return __jmp_op_format( (char)0x74, offset, op_size, isPertialSchedule );
    120 }
    121 CodeGenerator::PertialSchedule *CodeGenerator::op_jmp( long offset, int op_size, bool isPertialSchedule )
    122 {
    123     return __jmp_op_format( (char)0xEB, offset, op_size, isPertialSchedule );
    124 }
     183    return __jmp_op_format( (char)0x04, offset, op_size, isPertialSchedule );
     184}
     185CodeGenerator::PertialSchedule *CodeGenerator::op_jmp( long offset, int op_size, bool isPertialSchedule, bool isSelfOpcodeOffset )
     186{
     187    return __jmp_op_format( (char)0xEB, offset, op_size, isPertialSchedule, isSelfOpcodeOffset );
     188}
     189void CodeGenerator::op_jmp_continue()
     190{
     191    //op_jmp( GetContinueCodePos()-(pNativeCode->GetSize()+sizeof(long)), sizeof(long) );
     192
     193    // TODO: 未完成(OpBuffer/obp廃止が整ったら上記のコードを有効にすべし)
     194
     195    if( GetContinueCodePosOld() == -1 )
     196    {
     197        SetError(12,"Continue",cp);
     198        return;
     199    }
     200
     201    extern int obp;
     202    op_jmp( GetContinueCodePosOld()-obp, sizeof(long), false, true );
     203}
Note: See TracChangeset for help on using the changeset viewer.