Changeset 36 in dev for BasicCompiler32/op32_main.cpp


Ignore:
Timestamp:
Jan 20, 2007, 4:55:26 AM (17 years ago)
Author:
dai_9181
Message:

Boolean型に対応。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/op32_main.cpp

    r3 r36  
    360360    OpBuffer[obp++]=cValue;
    361361}
     362void op_sbb_RR( int reg1, int reg2 ){
     363    //sbb reg1,reg2
     364
     365    //オペコード
     366    OpBuffer[obp++]=(char)0x1B;
     367
     368    //レジスタ
     369    OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2));
     370}
     371
    362372
    363373
     
    370380    //and reg,value
    371381
    372     //16ビット演算の命令プリフィックス
    373     char op_prefix=0;
    374 
    375     //オペコード
    376     char opcode=(char)0x81;
    377 
    378     __op_format(op_prefix,opcode,0,0,reg,value,MOD_REG);
     382    if(reg==REG_RAX){
     383        //eaxのみ特殊
     384
     385        // [8bit rex] 0010 0101 [32bit offset]
     386        OpBuffer[obp++]=(char)0x25;
     387        *((long *)(OpBuffer+obp))=value;
     388        obp+=sizeof(long);
     389    }
     390    else{
     391        //16ビット演算の命令プリフィックス
     392        char op_prefix=0;
     393
     394        //オペコード
     395        char opcode=(char)0x81;
     396
     397        __op_format(op_prefix,opcode,0,0,reg,value,MOD_REG);
     398    }
     399}
     400
     401void op_or_RR( int op_size, int reg1, int reg2 ){
     402    //16ビット演算のプリフィックス
     403    if(op_size==sizeof(short)) OpBuffer[obp++]=(char)0x66;
     404
     405    //オペコード
     406    if(op_size==sizeof(char)) OpBuffer[obp++]=(char)0x0A;
     407    else OpBuffer[obp++]=(char)0x0B;
     408
     409    //レジスタ
     410    OpBuffer[obp++]=(char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2));
     411}
     412
     413
     414
     415void op_neg( int reg ){
     416    //neg reg
     417
     418    //オペコード
     419    OpBuffer[obp++]=(char)0xF7;
     420
     421    //レジスタ
     422    OpBuffer[obp++]=(char)(0xD8| REGISTER_OPERAND(reg));
    379423}
    380424
     
    481525        OpBuffer[obp++]=(char)num;
    482526    }
     527}
     528
     529
     530
     531/////////////////////
     532// cmp関連
     533/////////////////////
     534void op_cmp_value(int op_size,int reg,char byte_data){
     535    //cmp reg,byte_data
     536
     537    if(op_size==sizeof(char)&&reg==REG_EAX){
     538        //alレジスタの場合は特殊
     539        OpBuffer[obp++]=(char)0x3C;
     540
     541        //8ビット値
     542        OpBuffer[obp++]=byte_data;
     543
     544        return;
     545    }
     546
     547    //16ビット演算のプリフィックス
     548    if(op_size==sizeof(short)) OpBuffer[obp++]=(char)0x66;
     549
     550    //オペコード
     551    if(op_size==sizeof(char)) OpBuffer[obp++]=(char)0x80;
     552    else OpBuffer[obp++]=(char)0x83;
     553
     554    //レジスタ
     555    OpBuffer[obp++]=(char)(0xF8| REGISTER_OPERAND(reg));
     556
     557    //8ビット値
     558    OpBuffer[obp++]=byte_data;
     559}
     560void op_setne( int reg ){
     561    //オペコード
     562    OpBuffer[obp++]=(char)0x0F;
     563    OpBuffer[obp++]=(char)0x95;
     564
     565    //レジスタ
     566    OpBuffer[obp++]=(char)( 0xC0 | REGISTER_OPERAND(reg) );
    483567}
    484568
Note: See TracChangeset for help on using the changeset viewer.