diff --git a/vm/vm.cpp b/vm/vm.cpp index 4207dd3..105b844 100644 --- a/vm/vm.cpp +++ b/vm/vm.cpp @@ -128,7 +128,24 @@ void VM::initVariables(void) { } return; } - +bool VM::dstRegCheck(uint8_t reg) { + if (reg == IP || reg == SP || reg == RP) { + DBG_ERROR(("Invalid register!\n")); + return false; + } + return true; +} +bool VM::srcDstRegCheck(uint8_t dst, uint8_t src) { + if (dst == IP || dst == SP || dst == RP) { + DBG_ERROR(("Invalid register!\n")); + return false; + } + if (src == IP || src == SP || src == RP) { + DBG_ERROR(("Invalid register!\n")); + return false; + } + return true; +} /* INSTRUCTIONS IMPLEMENTATIONS */ @@ -142,10 +159,8 @@ bool VM::execMOVI(void) { dst = as.code[regs[IP] + 1]; imm = *((uint16_t *)&as.code[regs[IP] + 2]); DBG_INFO(("MOVI %s, 0x%x\n", getRegName(dst), imm)); - if (dst == IP || dst == SP || dst == RP) { - DBG_ERROR(("MOVI: Invalid register!\n")); + if (!dstRegCheck(dst)) return false; - } regs[dst] = imm; return true; } @@ -160,7 +175,8 @@ bool VM::execMOVR(void) { dst = as.code[regs[IP] + 1] >> 4; src = as.code[regs[IP] + 1] & 0b00001111; DBG_INFO(("MOVR %s, %s\n", getRegName(dst), getRegName(src))); - if (dst == IP || src == IP || dst == SP || src == SP || dst == RP || src== RP) { + if (dst == IP || src == IP || dst == SP || src == SP || dst == RP || + src == RP) { DBG_ERROR(("MOVR: Invalid register!\n")); return false; } diff --git a/vm/vm.h b/vm/vm.h index 858ead5..4b7aa4d 100644 --- a/vm/vm.h +++ b/vm/vm.h @@ -16,6 +16,9 @@ private: /////////////////////// void initVariables(void); void encryptOpcodes(uint8_t *key); + bool dstRegCheck(uint8_t reg); + bool srcDstRegCheck(uint8_t dst, uint8_t src); + /* DBG UTILS */