void m_mgrhand_for_sched::syscall(const id_type id) { _mov(obj()->_mrunning, obj()->_msyscall, id); }
void VCPU::Execute() { TokenList& insVector = IR->m_elements; static TokenList lastInst = insVector; std::string& first = insVector[ 0 ]; if ( first == "mov" ) { _mov(insVector); } else if ( first == "lea" ) { dword target = NULL; dword source = NULL; target |= (dword)GetReg( insVector[ 1 ] ); target |= (dword)GetVar( insVector[ 1 ] ); source |= (dword)GetReg( insVector[ 2 ] ); source |= (dword)GetVar( insVector[ 2 ] ); source |= (dword)GetConst( insVector[ 2 ] ); dword_pointer t = (dword_pointer)target; dword_pointer s = (dword_pointer)source; *(dword_pointer)target = source; t = (dword_pointer)target; s = (dword_pointer)source; } else if ( first == "push" || first == "arg" ) { push(insVector); } else if ( first == "pop" ) { pop(insVector); } else if ( first == "add" || first == "sub" || first == "mul" || first == "div" ) { _operator(insVector); } else if ( first == "jmp" ) { jump(insVector); } else if ( first == "jeq" || first == "jlt" || first == "jle" || first == "jne" || first == "jgt" || first == "jge") { _conditionJmp(insVector); } else if ( first == "call" ) { _call(insVector); } else if ( first == "leave" ) { leave(); } else if ( first == "in" ) { } else if ( first == "out" ) { dword target = 0; target |= (dword)GetConst( insVector[ 1 ] ); if ( target ) { if ( *(dword_pointer)target == 0 ) m_log += "\n"; else if ( *(dword_pointer)target == 1 ) m_log += " "; } else { target = GetAddress( insVector[ 1 ] ); char out[ 64 ]; sprintf_s( out, "%d", *(dword_pointer)target ); m_log += out; } } else if ( first == "halt" ) { eip = m_pInstructions->size(); // 程序结束 std::cout << "\nDone!!\n"; } lastInst = insVector; }
void m_mgrhand_for_sched::idle(const id_type id) { _mov(obj()->_mrunning, obj()->_midle, id); }
void VMDriver::execute(){ if( this->m_state == STATE_IDLE ){ printf( "Error: state is idle. \n"); return; } assert( this->currentAssembly() ); while( this->isActive() ){ if( this->isBreak() ){ break; } unsigned char content = this->getByte( m_funcAddr , m_pc ); m_pc++; switch( content ){ case EMnemonic::MovPtr : _mov_ptr(); break; case EMnemonic::Mov : _mov(); break; case EMnemonic::Add : _add(); break; case EMnemonic::Sub : _sub(); break; case EMnemonic::Mul : _mul(); break; case EMnemonic::Div : _div(); break; case EMnemonic::Rem : _rem(); break; case EMnemonic::Inc : _inc(); break; case EMnemonic::Dec : _dec(); break; case EMnemonic::Push : _push(); break; case EMnemonic::PushPtr : _push_ptr(); break; case EMnemonic::Pop : _pop(); break; case EMnemonic::Call : _call(); break; case EMnemonic::ST : _st(); break; case EMnemonic::LD : _ld(); break; case EMnemonic::EndFunc : _endFunc(); break; case EMnemonic::CmpGeq : case EMnemonic::CmpG : case EMnemonic::CmpLeq : case EMnemonic::CmpL : case EMnemonic::CmpEq : case EMnemonic::CmpNEq : _cmp( content ); break; case EMnemonic::Not : _not(); break; case EMnemonic::Minus : _minus(); break; case EMnemonic::LogOr : case EMnemonic::LogAnd : _log( content ); break; case EMnemonic::Jmp : _jmp(); break; case EMnemonic::JumpZero : _jumpzero(); break; case EMnemonic::JumpNotZero : _jumpnotzero(); break; case EMnemonic::RET : _ret(); break; } } }