现在的位置: 首页 > 综合 > 正文

虚拟机之ARM上mov指令C语言实现

2018年01月29日 ⁄ 综合 ⁄ 共 657字 ⁄ 字号 评论关闭

以下代码是虚拟机源码上摘录下来希望对正在学ARM指令的朋友有帮助,接下来会把ARM的指令都用C语言整理下上传。

void i_mov()
{
 uint32_t icode = ICODE;
 uint32_t S;
 uint32_t cpsr;
 uint32_t Rd;
 int rd;
 
 if(!check_condition(icode)) {
  return;
 }
 
 rd = (icode >> 12)&0xf;
 cpsr=REG_CPSR;
 cpsr&= ~(FLAG_N | FLAG_Z | FLAG_C);
 cpsr |= get_data_processing_operand(icode); 
 Rd = AM_SCRATCH1;
 dbgprintf("MOV value %08x to reg %d \n",Rd,rd);
 ARM9_WriteReg(Rd,rd);
 S=testbit(20,icode);
 
 if(S) {
  if(rd==15) {
   if(MODE_HAS_SPSR) {
    SET_REG_CPSR(REG_SPSR);
   } else {
    fprintf(stderr,"Mode has no spsr in line %d pc %08x icode %08x\n",__LINE__,ARM_GET_NNIA,icode);
   }
  } else { 
   if(!Rd) {
    cpsr |= FLAG_Z;
   }
   if(ISNEG(Rd)) {
    cpsr |= FLAG_N;
   }
   REG_CPSR=cpsr;
  }
 }
}

抱歉!评论已关闭.