#include #include #include #include #include "cinstruction.h" #include "cmem.h" using namespace std; void CInc::exec(CMem& mem, vector& instr) { mem.getRegister(instr[1])++; } void CDec::exec(CMem& mem, vector& instr) { mem.getRegister(instr[1])--; } void CAdd::exec(CMem& mem, vector& instr) { mem.getRegister(instr[1]) = mem.getRegister(instr[2]) + mem.getRegister(instr[3]); } void CSub::exec(CMem& mem, vector& instr) { mem.getRegister(instr[1]) = mem.getRegister(instr[2]) - mem.getRegister(instr[3]); } void CMul::exec(CMem& mem, vector& instr) { mem.getRegister(instr[1]) = mem.getRegister(instr[2]) * mem.getRegister(instr[3]); } void CDiv::exec(CMem& mem, vector& instr) { mem.getRegister(instr[1]) = mem.getRegister(instr[2]) / mem.getRegister(instr[3]); } void CLoad::exec(CMem& mem, vector& instr) { istringstream stmp (mem.getMemAt(instr[2])); stmp >> mem.getRegister(instr[1]); } void CStore::exec(CMem& mem, vector& instr) { mem.setMemAt(instr[2], mem.getRegister(instr[1])); } void CTest::exec(CMem& mem, vector& instr) { if(mem.getRegister(instr[1]) == 0) f_zero = true; else f_zero = false; if(mem.getRegister(instr[1]) < 0) f_sign = true; else f_sign = false; } void CJumpa::exec(CMem& mem, vector& instr) { mem.getRegister("R0") = (int) m_jumpaddr[instr[1]]; } void CJumpz::exec(CMem& mem, vector& instr) { if(f_zero) mem.getRegister("R0") = (int) m_jumpaddr[instr[1]]; } void CJumps::exec(CMem& mem, vector& instr) { if(f_sign) mem.getRegister("R0") = (int) m_jumpaddr[instr[1]]; } void CWrite::exec(CMem& mem, vector& instr) { if(instr[1] == "WDEZ") cout << mem.getRegister(instr[2]) << endl; else if (instr[1] == "WHEX") cout << hex << mem.getRegister(instr[2]) << endl; }