📄 armcommon_iacxl10_2004_3_16.cpp
字号:
#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 + -