Exemple #1
0
			void m_mgrhand_for_sched::syscall(const id_type id)
			{
				_mov(obj()->_mrunning, obj()->_msyscall, id);
			}
Exemple #2
0
	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;
	}
Exemple #3
0
			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;
		}
	}
}