以下代码是虚拟机源码上摘录下来希望对正在学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;
}
}
}