⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 armcommon_iacxl10_2004_3_16.cpp

📁 自己编写的ARM处理器的指令集仿真
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "armia_IAcxl10_2004_3_16.h"#include <iostream.h>void ARMISS_stru::set_decoder_stru(UNL instr){          common_dec   = instr;          ARM_type0    = instr;          ARM_type1    = instr;          ARM_type2    = instr;          ARM_type3    = instr;          ARM_type4    = instr;          ARM_type5    = instr;          ARM_type6    = instr;          ARM_type7    = instr;                      //ins[0]       = instr;        }//设置每一个译码结构,当程序进行译码前需要调用此函数以分离出指令中的各位信息;void ARMISS_stru::Thu_set_decode_stru(UNL instr){          Thu_type1  = instr;          Thu_type2  = instr;          Thu_type3  = instr;          Thu_type4  = instr;          Thu_type5  = instr;          Thu_type6  = instr;          Thu_type7  = instr;          Thu_type8  = instr;          Thu_common = instr;}//set each Thumb decode struct;void ARMISS_stru::barrel_shifter_imm(int shift_mod, int shiftamount, long shift_oper){         switch(shift_mod)         {            case 0:   if( shiftamount == 0 )                         {                            shifter.operand   = shift_oper;                            shifter.carry_out = CPSR.C;                         }                      else                          {                            shifter.operand   = shift_oper << shiftamount;                            shifter.carry_out = shift_oper >> ( 32 - shiftamount );                         }                      break;//Logical Shift Left by immediate - LSL;           case 1:    if ( shiftamount == 0 )                         {                            shifter.operand   = 0;                            shifter.carry_out = shift_oper >> 31;                         }                      else                          {                            shifter.operand   = (unsigned long)shift_oper >> shiftamount;                            shifter.carry_out = shift_oper >> (shiftamount - 1 );                         }                      break;//Logical Shift Right by immediate - LSR;          case 2:     if( shiftamount == 0 )                        if ( (shift_oper >> 31 ) == 0 )                         {                            shifter.operand   = 0;                            shifter.carry_out = shift_oper >> 31;                         }                        else                         {                            shifter.operand   = 0xffffffff;                            shifter.carry_out = shift_oper >> 31;                         }                      else                         {                            shifter.operand   = shift_oper >> shiftamount; // shao 2004-2-5 (unsigned long)shift_oper >> shiftamount;                            shifter.carry_out = shift_oper >> (shiftamount - 1);                         }                       break;//Airthmetic Shift Right by immediate - ASR;           case 3:    if( shiftamount == 0 )                        {                            shifter.operand   = (shift_oper >> 1 ) || CPSR.C;                            shifter.carry_out = shift_oper;                        }                      else                         {                            long  temp;                                                                                 shifter.operand = shift_oper;                                                   for(int i=0; i<shiftamount;i++)                              {                                     temp            = shifter.operand & 0x1;                                     temp            = temp << 31;                                     shifter.operand = shifter.operand >> 1;                                     shifter.operand = (shifter.operand & 0x7fffffff) + temp;                              }                          }                      break;//Rotate right by immediate;           defaults:  break;        }       }// 完成移位操作,这里移位的位数由指令中的立即数给出;void ARMISS_stru::barrel_shifter_reg(int mod,long amount,long oper){             switch(mod)             {                case 0:   if( amount == 0 )                           {                               shifter.operand   = oper;                               shifter.carry_out = CPSR.C;                           }                          else if( amount < 32 )                           {                               shifter.operand   = (unsigned long)oper << amount;                               shifter.carry_out = oper >> (32 - amount);                           }                          else if( amount == 32 )                           {                               shifter.operand   = 0;                               shifter.carry_out = oper;                           }                          else                            {                               shifter.operand   = 0;                               shifter.carry_out = 0;                           }                          break;//LSL - Logical shift left by register;                 case 1:  if( amount == 0 )                           {                               shifter.operand   = oper;                               shifter.carry_out = CPSR.C;                           }                          else if( amount < 32 )                           {                               shifter.operand   = (unsigned long)oper >> amount;                               shifter.carry_out = oper >> (amount - 1);                           }                          else if( amount == 32)                           {                               shifter.operand   = 0;                               shifter.carry_out = oper >> 31;                           }                          else                            {                               shifter.operand   = 0;                               shifter.carry_out = 0;                           }                          break;//LSR - Logical Shift Right by register;               case 2:    if( amount == 0 )                           {                                shifter.operand   = oper;                                shifter.carry_out = CPSR.C;                           }                          else if( amount < 32 )                           {                                shifter.operand   = oper >> amount;                                shifter.carry_out = oper >> (amount - 1);                           }                          else                            {                                  if( ( oper >> 31 ) == 0 )                                  {                                       shifter.operand    = 0;                                       shifter.carry_out  = 0;                                  }                                else                                   {                                       shifter.operand    = 0xffffffff;                                       shifter.carry_out  = 1;                                  }                            }                           break;//ASL - Arithmatic shift Left by register;                case 3:   if( amount == 0 )                           {                                        shifter.operand    = oper;                                       shifter.carry_out  = CPSR.C;                           }                          else if( ( amount & 0x1f ) == 0 )                                {                                       shifter.operand    = 0;                                       shifter.carry_out  = oper >> 31;                                }                          else                                 {                                       long tamount,temp;                                                                              tamount          = ( amount & 0x1f );                                       shifter.operand  = oper;                                       for( int i=0; i<tamount; i++)                                          {                                             temp             = shifter.operand & 0x1;                                             temp             = temp << 31;                                             shifter.operand  = shifter.operand >> 1;                                             shifter.operand  = (shifter.operand & 0x7fffffff) + temp;                                          }                                       shifter.carry_out = oper >> ( tamount - 1 );                                }                          break;//循环右移;                defaults: break;                       }                                                           }//同上,移位位数通过指令中指出的寄存器号中的内容给出;void ARMISS_stru::barrel_shifter_rotate_imm(int rotate,long imm){         long       temp;         bit32_stru bit;                 shifter.operand  = imm;         for( int i=0; i<(2*rotate); i++)          {            temp             = shifter.operand & 0x1;            temp             = temp << 31;            shifter.operand  = shifter.operand >> 1;            shifter.operand  = (shifter.operand & 0x7fffffff) + temp;          }        bit = shifter.operand;        if( rotate == 0 )             shifter.carry_out = CPSR.C;        else            shifter.carry_out = bit[31];}//立即数的循环移位;UNL& ARMISS_stru::getreg(int i){        switch( CPSR.M )        {           case 16: return r_gen[i];//User mode;            case 17: if( ( i > 7 ) && ( i < 15 ) )                          return r_fiq[i];                    else                            return r_gen[i];//Fast interrupt mode;                               case 18: if( ( i == 13 ) || ( i == 14 ) )                          return r_irq[i - 13];                    else                          return r_gen[i];//Normal interrupt mode;           case 19: if( ( i == 13 ) || ( i == 14 ) )                          return r_svc[i - 13];                    else                          return r_gen[i];//Supervisor mode;           case 23: if( ( i == 13 ) || ( i == 14 ) )                          return r_abt[i - 13];                    else                          return r_gen[i];//Abort mode;           case 27: if( ( i == 13 ) || ( i == 14 ) )                          return r_und[i - 13];                    else                          return r_gen[i];//Undeifned abort mode;           case 31: return r_gen[i];//System mode;        }                    }//函数可以返回对一个寄存器的引用,寄存器可根据当前所处的模式来决定;UNL ARMISS_stru::getregd(int i){       switch( CPSR.M )        {           case 16: return r_gen[i];//User mode;           case 17: if( ( i > 7 ) && ( i < 15 ) )                          return r_fiq[i];                    else                            return r_gen[i];//Fast interrrupt mode;                               case 18: if( ( i == 13 ) || ( i == 14 ) )                          return r_irq[i - 13];                    else                          return r_gen[i];//Normal interrrupt mode;           case 19: if( ( i == 13 ) || ( i == 14 ) )                          return r_svc[i - 13];                    else                          return r_gen[i];//Supervisor mode;           case 23: if( ( i == 13 ) || ( i == 14 ) )                          return r_abt[i - 13];                    else                          return r_gen[i];//Abort mode;           case 27: if( ( i == 13 ) || ( i == 14 ) )                          return r_und[i - 13];                    else                          return r_gen[i];//Undefined mode;           case 31: return r_gen[i];//System mode;        }}//返回当前模式下某一个寄存器的值;int ARMISS_stru::getid(){      switch( CPSR.M )     {       case 17: return fiq;       case 18: return irq;       case 19: return svc;       case 23: return abt;       case 27: return und;       default: return -1;     }}//返回当前模式的预定义ID; void ARMISS_stru::Addressing_mod1(int flags){    ARM_type0_stru&  tmp0 = ARM_type0;    ARM_type1_stru&  tmp1 = ARM_type1;    bit32_stru       bit;    UNL              shiftm,shiftoper;    if( tmp0.Rs == PC ) shiftm     = getregd( tmp0.Rs ) + 8;    else                shiftm     = getregd( tmp0.Rs );    if( tmp0.Rm == PC ) shiftoper  = getregd( tmp0.Rm ) + 8;    else                shiftoper  = getregd( tmp0.Rm );    switch( flags )  {    case 0 : bit = tmp1.imm;             bit.rotate( tmp1.rotate*2 );             shifter.operand = bit;             if( tmp1.rotate == 0 )               shifter.carry_out = CPSR.C;             else               shifter.carry_out = bit[31];             break;    case 1 : barrel_shifter_reg(tmp0.shift,shiftm,shiftoper);             break;    case 2 : barrel_shifter_imm(tmp0.shift,tmp0.shiftm,shiftoper );             break;  } }//对应于参考手册中寻址方式1的数据处理指令寻址方式;UNL ARMISS_stru::Addressing_mod2(int mod){   UNL      addr;      if( mod == 0 )   {       ARM_type2_stru&  tmp = ARM_type2;       UNL              offset_12;       UNL              trn=(tmp.Rn==PC)?(getregd(tmp.Rn)+8):getregd(tmp.Rn);       UNL&             rn = getreg( tmp.Rn );       offset_12        = tmp.imm;       switch( tmp.P + tmp.W )      {        case 0  : addr = trn;                  if( executable() )                 {                     rn = (tmp.U==1)? (rn + offset_12):(rn - offset_12);                     if( tmp.Rn==PC)                          pc_changed = true;                 }                  break;        case 1  : addr = (tmp.U==1)? (trn + offset_12):(trn - offset_12);                  break;        case 2  : addr = (tmp.U==1)? (trn + offset_12):(trn - offset_12);                   if( executable() )                 {                     rn = addr;                     if( tmp.Rn==PC)                          pc_changed = true;                 }                  break;      }                      }// immediate;     else      {        ARM_type3_stru& tmp = ARM_type3;        UNL             rm  = (tmp.Rm==PC)?(getregd(tmp.Rm)+8):getregd(tmp.Rm);        UNL            trn  = (tmp.Rn==PC)?(getregd(tmp.Rn)+8):getregd(tmp.Rn);        UNL&            rn  = getreg( tmp.Rn );        UNL             index;        index = addr_mod2_shift(tmp.shift,tmp.shiftm,rm);         switch( tmp.P + tmp.W )      {        case 0  : addr = trn;                  if( executable() )                 {                     rn = (tmp.U==1)? (rn + index):(rn - index);                     if( tmp.Rn==PC)                          pc_changed = true;                 }                  break;        case 1  : addr = (tmp.U==1)? (trn + index):(trn - index);                  break;        case 2  : addr = (tmp.U==1)? (trn + index):(trn - index);                   if( executable() )                 {                     rn = addr;                     if( tmp.Rn==PC )                          pc_changed = true;                 }                  break;      }   }                   return addr;}//Addressing mode 2 - Load and Store Word or Unsigned Byte;       UNL ARMISS_stru::Addressing_mod3(){  ARM_type0_stru&    tmp = ARM_type0;  UNL                addr;  UNL                offset_8,rm,trn,op;  UNL&               rn  = getreg( tmp.mul_ext.Rn2 );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -