Changeset 227 in dev


Ignore:
Timestamp:
Jul 22, 2007, 9:13:57 PM (17 years ago)
Author:
dai_9181
Message:
 
Location:
trunk/abdev/BasicCompiler32
Files:
3 edited

Legend:

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

    r225 r227  
    445445
    446446        //xor eax,eax
    447         OpBuffer[obp++]=(char)0x33;
    448         OpBuffer[obp++]=(char)0xC0;
     447        compiler.codeGenerator.op_xor_RR(REG_EAX);
    449448
    450449        //mov ax,word ptr[ebx]
     
    458457
    459458        //xor eax,eax
    460         OpBuffer[obp++]=(char)0x33;
    461         OpBuffer[obp++]=(char)0xC0;
     459        compiler.codeGenerator.op_xor_RR(REG_EAX);
    462460
    463461        //mov al,byte ptr[ebx]
  • trunk/abdev/BasicCompiler32/Compile_Statement.cpp

    r225 r227  
    11661166
    11671167                    //cmp eax,ebx
    1168                     OpBuffer[obp++]=(char)0x3B;
    1169                     OpBuffer[obp++]=(char)0xC3;
     1168                    compiler.codeGenerator.op_cmp_RR( REG_EAX, REG_EBX );
    11701169
    11711170                    //je ...
  • trunk/abdev/BasicCompiler32/NumOpe_Relation.cpp

    r225 r227  
    176176
    177177        //cmp eax,ebx
    178         OpBuffer[obp++]=(char)0x3B;
    179         OpBuffer[obp++]=(char)0xC3;
     178        compiler.codeGenerator.op_cmp_RR( REG_EAX, REG_EBX );
    180179
    181180        //ja FalseSchedule2(偽へジャンプ)
     
    188187
    189188        //mov eax,1
    190         OpBuffer[obp++]=(char)0xB8;
    191         *((long *)(OpBuffer+obp))=1;
    192         obp+=sizeof(long);
     189        compiler.codeGenerator.op_mov_RV( REG_EAX, 1 );
    193190
    194191        //jmp 2(演算終了位置へジャンプ)
     
    224221
    225222        //mov ecx,1
    226         OpBuffer[obp++]=(char)0xB9;
    227         *((long *)(OpBuffer+obp))=1;
    228         obp+=sizeof(long);
     223        compiler.codeGenerator.op_mov_RV( REG_ECX, 1 );
    229224
    230225        //cmp eax,ebx
    231         OpBuffer[obp++]=(char)0x3B;
    232         OpBuffer[obp++]=(char)0xC3;
     226        compiler.codeGenerator.op_cmp_RR( REG_EAX, REG_EBX );
    233227
    234228        if(IsSignedType(type_stack[sp-2])==0&&IsSignedType(type_stack[sp-1])==0){
    235229            //符号なし演算
    236230
    237             //jbe 5(次のmovを飛び越す)
     231            //jbe 2(次のxorを飛び越す)
    238232            OpBuffer[obp++]=(char)0x76;
    239             OpBuffer[obp++]=(char)0x05;
     233            OpBuffer[obp++]=(char)0x02;
    240234        }
    241235        else{
    242236            //符号あり演算
    243237
    244             //jle 5(次のmovを飛び越す)
     238            //jle 2(次のxorを飛び越す)
    245239            OpBuffer[obp++]=(char)0x7E;
    246             OpBuffer[obp++]=(char)0x05;
    247         }
    248 
    249         //mov ecx,0
    250         OpBuffer[obp++]=(char)0xB9;
    251         *((long *)(OpBuffer+obp))=0;
    252         obp+=sizeof(long);
     240            OpBuffer[obp++]=(char)0x02;
     241        }
     242
     243        //xor ecx,ecx
     244        compiler.codeGenerator.op_xor_RR( REG_ECX );
    253245
    254246        //mov dword ptr[esp],ecx
     
    342334
    343335        //mov ecx,1
    344         OpBuffer[obp++]=(char)0xB9;
    345         *((long *)(OpBuffer+obp))=1;
    346         obp+=sizeof(long);
     336        compiler.codeGenerator.op_mov_RV( REG_ECX, 1 );
    347337
    348338        //test ah,1
    349339        compiler.codeGenerator.op_test_ah( (char)0x01 );
    350340
    351         //je 5
     341        //je 2(次のxorを飛び越す)
    352342        OpBuffer[obp++]=(char)0x74;
    353         OpBuffer[obp++]=(char)0x05;
    354 
    355         //mov ecx,0
    356         OpBuffer[obp++]=(char)0xB9;
    357         *((long *)(OpBuffer+obp))=0;
    358         obp+=sizeof(long);
     343        OpBuffer[obp++]=(char)0x02;
     344
     345        //xor ecx,ecx
     346        compiler.codeGenerator.op_xor_RR( REG_ECX );
    359347
    360348        //mov dword ptr[esp],ecx
     
    376364
    377365        //cmp edx,ecx
    378         OpBuffer[obp++]=(char)0x3B;
    379         OpBuffer[obp++]=(char)0xD1;
     366        compiler.codeGenerator.op_cmp_RR( REG_EDX, REG_ECX );
    380367
    381368        if(IsSignedType(AnswerType)){
     
    410397
    411398        //cmp eax,ebx
    412         OpBuffer[obp++]=(char)0x3B;
    413         OpBuffer[obp++]=(char)0xC3;
     399        compiler.codeGenerator.op_cmp_RR( REG_EAX, REG_EBX );
    414400
    415401        //jb FalseSchedule2(偽へジャンプ)
     
    422408
    423409        //mov eax,1
    424         OpBuffer[obp++]=(char)0xB8;
    425         *((long *)(OpBuffer+obp))=1;
    426         obp+=sizeof(long);
     410        compiler.codeGenerator.op_mov_RV( REG_EAX, 1 );
    427411
    428412        //jmp 2(演算終了位置へジャンプ)
     
    458442
    459443        //mov ecx,1
    460         OpBuffer[obp++]=(char)0xB9;
    461         *((long *)(OpBuffer+obp))=1;
    462         obp+=sizeof(long);
     444        compiler.codeGenerator.op_mov_RV( REG_ECX, 1 );
    463445
    464446        //cmp eax,ebx
    465         OpBuffer[obp++]=(char)0x3B;
    466         OpBuffer[obp++]=(char)0xC3;
     447        compiler.codeGenerator.op_cmp_RR( REG_EAX, REG_EBX );
    467448
    468449        if(IsSignedType(AnswerType)){
    469450            //符号あり演算
    470451
    471             //jge 5(次のmovを飛び越す)符号有り
     452            //jge 2(次のxorを飛び越す)符号有り
    472453            OpBuffer[obp++]=(char)0x7D;
    473             OpBuffer[obp++]=(char)0x05;
     454            OpBuffer[obp++]=(char)0x02;
    474455        }
    475456        else{
    476457            //符号なし演算
    477458
    478             //jae 5(次のmovを飛び越す)
     459            //jae 2(次のxorを飛び越す)
    479460            OpBuffer[obp++]=(char)0x73;
    480             OpBuffer[obp++]=(char)0x05;
    481         }
    482 
    483         //mov ecx,0
    484         OpBuffer[obp++]=(char)0xB9;
    485         *((long *)(OpBuffer+obp))=0;
    486         obp+=sizeof(long);
     461            OpBuffer[obp++]=(char)0x02;
     462        }
     463
     464        //xor ecx,ecx
     465        compiler.codeGenerator.op_xor_RR( REG_ECX );
    487466
    488467        //mov dword ptr[esp],ecx
     
    578557
    579558        //mov ecx,1
    580         OpBuffer[obp++]=(char)0xB9;
    581         *((long *)(OpBuffer+obp))=1;
    582         obp+=sizeof(long);
     559        compiler.codeGenerator.op_mov_RV( REG_ECX, 1 );
    583560
    584561        //test ah,01h
    585562        compiler.codeGenerator.op_test_ah( (char)0x41 );
    586563
    587         //jne 5
     564        //jne 2
    588565        OpBuffer[obp++]=(char)0x75;
    589566        OpBuffer[obp++]=(char)0x05;
    590567
    591         //mov ecx,0
    592         OpBuffer[obp++]=(char)0xB9;
    593         *((long *)(OpBuffer+obp))=0;
    594         obp+=sizeof(long);
     568        //xor ecx,ecx
     569        compiler.codeGenerator.op_xor_RR( REG_ECX );
    595570
    596571        //mov dword ptr[esp],ecx
     
    612587
    613588        //cmp edx,ecx
    614         OpBuffer[obp++]=(char)0x3B;
    615         OpBuffer[obp++]=(char)0xD1;
     589        compiler.codeGenerator.op_cmp_RR( REG_EDX, REG_ECX );
    616590
    617591        if(IsSignedType(AnswerType)){
     
    646620
    647621        //cmp eax,ebx
    648         OpBuffer[obp++]=(char)0x3B;
    649         OpBuffer[obp++]=(char)0xC3;
     622        compiler.codeGenerator.op_cmp_RR( REG_EAX, REG_EBX );
    650623
    651624        //jb TrueSchedule2(真へジャンプ)
     
    669642
    670643        //mov eax,1
    671         OpBuffer[obp++]=(char)0xB8;
    672         *((long *)(OpBuffer+obp))=1;
    673         obp+=sizeof(long);
     644        compiler.codeGenerator.op_mov_RV( REG_EAX, 1 );
    674645
    675646        //push eax
     
    694665
    695666        //mov ecx,1
    696         OpBuffer[obp++]=(char)0xB9;
    697         *((long *)(OpBuffer+obp))=1;
    698         obp+=sizeof(long);
     667        compiler.codeGenerator.op_mov_RV( REG_ECX, 1 );
    699668
    700669        //cmp eax,ebx
    701         OpBuffer[obp++]=(char)0x3B;
    702         OpBuffer[obp++]=(char)0xC3;
     670        compiler.codeGenerator.op_cmp_RR( REG_EAX, REG_EBX );
    703671
    704672        if(IsSignedType(AnswerType)){
    705673            //符号あり演算
    706674
    707             //jl 5(次のmovを飛び越す)
     675            //jl 2(次のxorを飛び越す)
    708676            OpBuffer[obp++]=(char)0x7C;
    709             OpBuffer[obp++]=(char)0x05;
     677            OpBuffer[obp++]=(char)0x02;
    710678        }
    711679        else{
    712680            //符号なし演算
    713681
    714             //jb 5(次のmovを飛び越す)
     682            //jb 2(次のxorを飛び越す)
    715683            OpBuffer[obp++]=(char)0x72;
    716             OpBuffer[obp++]=(char)0x05;
    717         }
    718 
    719         //mov ecx,0
    720         OpBuffer[obp++]=(char)0xB9;
    721         *((long *)(OpBuffer+obp))=0;
    722         obp+=sizeof(long);
     684            OpBuffer[obp++]=(char)0x02;
     685        }
     686
     687        //xor ecx,ecx
     688        compiler.codeGenerator.op_xor_RR( REG_ECX );
    723689
    724690        //mov dword ptr[esp],ecx
     
    810776
    811777        //mov ecx,1
    812         OpBuffer[obp++]=(char)0xB9;
    813         *((long *)(OpBuffer+obp))=1;
    814         obp+=sizeof(long);
     778        compiler.codeGenerator.op_mov_RV( REG_ECX, 1 );
    815779
    816780        //test ah,41
    817781        compiler.codeGenerator.op_test_ah( (char)0x41 );
    818782
    819         //je 5
     783        //je 2(次のxorを飛び越す)
    820784        OpBuffer[obp++]=(char)0x74;
    821         OpBuffer[obp++]=(char)0x05;
    822 
    823         //mov ecx,0
    824         OpBuffer[obp++]=(char)0xB9;
    825         *((long *)(OpBuffer+obp))=0;
    826         obp+=sizeof(long);
     785        OpBuffer[obp++]=(char)0x02;
     786
     787        //xor ecx,ecx
     788        compiler.codeGenerator.op_xor_RR( REG_ECX );
    827789
    828790        //mov dword ptr[esp],ecx
     
    844806
    845807        //cmp edx,ecx
    846         OpBuffer[obp++]=(char)0x3B;
    847         OpBuffer[obp++]=(char)0xD1;
     808        compiler.codeGenerator.op_cmp_RR( REG_EDX, REG_ECX );
    848809
    849810        if(IsSignedType(AnswerType)){
     
    878839
    879840        //cmp eax,ebx
    880         OpBuffer[obp++]=(char)0x3B;
    881         OpBuffer[obp++]=(char)0xC3;
     841        compiler.codeGenerator.op_cmp_RR( REG_EAX, REG_EBX );
    882842
    883843        //ja TrueSchedule2(真へジャンプ)
     
    901861
    902862        //mov eax,1
    903         OpBuffer[obp++]=(char)0xB8;
    904         *((long *)(OpBuffer+obp))=1;
    905         obp+=sizeof(long);
     863        compiler.codeGenerator.op_mov_RV( REG_EAX, 1 );
    906864
    907865        //push eax
     
    926884
    927885        //mov ecx,1
    928         OpBuffer[obp++]=(char)0xB9;
    929         *((long *)(OpBuffer+obp))=1;
    930         obp+=sizeof(long);
     886        compiler.codeGenerator.op_mov_RV( REG_ECX, 1 );
    931887
    932888        //cmp eax,ebx
    933         OpBuffer[obp++]=(char)0x3B;
    934         OpBuffer[obp++]=(char)0xC3;
     889        compiler.codeGenerator.op_cmp_RR( REG_EAX, REG_EBX );
    935890
    936891        if(IsSignedType(AnswerType)){
    937             //jg 5(次のmovを飛び越す)
     892            //jg 2(次のxorを飛び越す)
    938893            OpBuffer[obp++]=(char)0x7F;
    939             OpBuffer[obp++]=(char)0x05;
    940         }
    941         else{
    942             //ja 5(次のmovを飛び越す)
     894            OpBuffer[obp++]=(char)0x02;
     895        }
     896        else{
     897            //ja 2(次のxorを飛び越す)
    943898            OpBuffer[obp++]=(char)0x77;
    944             OpBuffer[obp++]=(char)0x05;
    945         }
    946 
    947         //mov ecx,0
    948         OpBuffer[obp++]=(char)0xB9;
    949         *((long *)(OpBuffer+obp))=0;
    950         obp+=sizeof(long);
     899            OpBuffer[obp++]=(char)0x02;
     900        }
     901
     902        //xor ecx,ecx
     903        compiler.codeGenerator.op_xor_RR( REG_ECX );
    951904
    952905        //mov dword ptr[esp],ecx
     
    1036989
    1037990        //mov ecx,1
    1038         OpBuffer[obp++]=(char)0xB9;
    1039         *((long *)(OpBuffer+obp))=1;
    1040         obp+=sizeof(long);
     991        compiler.codeGenerator.op_mov_RV( REG_ECX, 1 );
    1041992
    1042993        //test ah,40
    1043994        compiler.codeGenerator.op_test_ah( (char)0x40 );
    1044995
    1045         //je 5
     996        //je 2
    1046997        OpBuffer[obp++]=(char)0x74;
    1047         OpBuffer[obp++]=(char)0x05;
    1048 
    1049         //mov ecx,0
    1050         OpBuffer[obp++]=(char)0xB9;
    1051         *((long *)(OpBuffer+obp))=0;
    1052         obp+=sizeof(long);
     998        OpBuffer[obp++]=(char)0x02;
     999
     1000        //xor ecx,ecx
     1001        compiler.codeGenerator.op_xor_RR( REG_ECX );
    10531002
    10541003        //mov dword ptr[esp],ecx
     
    10701019
    10711020        //cmp eax,ebx
    1072         OpBuffer[obp++]=(char)0x3B;
    1073         OpBuffer[obp++]=(char)0xC3;
     1021        compiler.codeGenerator.op_cmp_RR( REG_EAX, REG_EBX );
    10741022
    10751023        //jnz TrueSchedule1(真へジャンプ)
     
    10791027
    10801028        //cmp edx,ecx
    1081         OpBuffer[obp++]=(char)0x3B;
    1082         OpBuffer[obp++]=(char)0xD1;
     1029        compiler.codeGenerator.op_cmp_RR( REG_EDX, REG_ECX );
    10831030
    10841031        //jnz TrueSchedule2(真へジャンプ)
     
    10991046
    11001047        //mov eax,1
    1101         OpBuffer[obp++]=(char)0xB8;
    1102         *((long *)(OpBuffer+obp))=1;
    1103         obp+=sizeof(long);
     1048        compiler.codeGenerator.op_mov_RV( REG_EAX, 1 );
    11041049
    11051050        //push eax
     
    11321077
    11331078        //mov eax,1
    1134         OpBuffer[obp++]=(char)0xB8;
    1135         *((long *)(OpBuffer+obp))=1;
    1136         obp+=sizeof(long);
     1079        compiler.codeGenerator.op_mov_RV( REG_EAX, 1 );
    11371080
    11381081        //mov dword ptr[esp],eax
     
    12221165
    12231166        //mov ecx,1
    1224         OpBuffer[obp++]=(char)0xB9;
    1225         *((long *)(OpBuffer+obp))=1;
    1226         obp+=sizeof(long);
     1167        compiler.codeGenerator.op_mov_RV( REG_ECX, 1 );
    12271168
    12281169        //test ah,40
    12291170        compiler.codeGenerator.op_test_ah( (char)0x40 );
    12301171
    1231         //jne 5
     1172        //jne 2(次のxorを飛び越す)
    12321173        OpBuffer[obp++]=(char)0x75;
    1233         OpBuffer[obp++]=(char)0x05;
    1234 
    1235         //mov ecx,0
    1236         OpBuffer[obp++]=(char)0xB9;
    1237         *((long *)(OpBuffer+obp))=0;
    1238         obp+=sizeof(long);
     1174        OpBuffer[obp++]=(char)0x02;
     1175
     1176        //xor ecx,ecx
     1177        compiler.codeGenerator.op_xor_RR( REG_ECX );
    12391178
    12401179        //mov dword ptr[esp],ecx
     
    12561195
    12571196        //cmp eax,ebx
    1258         OpBuffer[obp++]=(char)0x3B;
    1259         OpBuffer[obp++]=(char)0xC3;
     1197        compiler.codeGenerator.op_cmp_RR( REG_EAX, REG_EBX );
    12601198
    12611199        //jnz FalseSchedule1(偽へジャンプ)
     
    12651203
    12661204        //cmp edx,ecx
    1267         OpBuffer[obp++]=(char)0x3B;
    1268         OpBuffer[obp++]=(char)0xD1;
     1205        compiler.codeGenerator.op_cmp_RR( REG_EDX, REG_ECX );
    12691206
    12701207        //jnz FalseSchedule2(偽へジャンプ)
     
    12741211
    12751212        //mov eax,1
    1276         OpBuffer[obp++]=(char)0xB8;
    1277         *((long *)(OpBuffer+obp))=1;
    1278         obp+=sizeof(long);
     1213        compiler.codeGenerator.op_mov_RV( REG_EAX, 1 );
    12791214
    12801215        //jmp 2(演算終了位置へジャンプ)
     
    13261261
    13271262        //mov eax,1
    1328         OpBuffer[obp++]=(char)0xB8;
    1329         *((long *)(OpBuffer+obp))=1;
    1330         obp+=sizeof(long);
     1263        compiler.codeGenerator.op_mov_RV( REG_EAX, 1 );
    13311264
    13321265        //mov dword ptr[esp],eax
Note: See TracChangeset for help on using the changeset viewer.