added "lw" and "sw"
This commit is contained in:
@@ -4,8 +4,10 @@
|
||||
|
||||
#include "Alu.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
|
||||
#include "Memory.h"
|
||||
#include "Register.h"
|
||||
|
||||
void Alu::calculate(const std::vector<std::string> &commandVector) {
|
||||
@@ -14,7 +16,10 @@ void Alu::calculate(const std::vector<std::string> &commandVector) {
|
||||
|
||||
/// Extrahiere die Argumente des Befehls
|
||||
const auto arg1 = parseArgument(commandVector.at(0));
|
||||
const auto arg2 = parseArgument(commandVector.at(1));
|
||||
int arg2 = 0;
|
||||
if (commandVector.at(1).find('(') != std::string::npos) {
|
||||
arg2 = parseArgument(commandVector.at(2));
|
||||
}
|
||||
int arg3 = 0;
|
||||
if (!commandVector.at(2).empty()) {
|
||||
arg3 = parseArgument(commandVector.at(2));
|
||||
@@ -47,19 +52,27 @@ void Alu::calculate(const std::vector<std::string> &commandVector) {
|
||||
Register::getInstance().setRegister(arg1, result);
|
||||
} else if (command == "addi") {
|
||||
const auto register1 = Register::getInstance().getRegister(arg2);
|
||||
const auto immediate = parseArgument(commandVector.at(1));
|
||||
const auto immediate = arg3;
|
||||
const auto result = register1 + immediate;
|
||||
Register::getInstance().setRegister(arg1, result);
|
||||
} else if (command == "andi") {
|
||||
const auto register1 = Register::getInstance().getRegister(arg2);
|
||||
const auto immediate = parseArgument(commandVector.at(1));
|
||||
const auto immediate = arg3;
|
||||
const auto result = register1 & immediate;
|
||||
Register::getInstance().setRegister(arg1, result);
|
||||
} else if (command == "ori") {
|
||||
const auto register1 = Register::getInstance().getRegister(arg2);
|
||||
const auto immediate = parseArgument(commandVector.at(1));
|
||||
const auto immediate = arg3;
|
||||
const auto result = register1 | immediate;
|
||||
Register::getInstance().setRegister(arg1, result);
|
||||
} else if (command == "lw") {
|
||||
const auto address = parseAddress(commandVector.at(2));
|
||||
const auto data = Memory::getInstance()->load(address);
|
||||
Register::getInstance().setRegister(arg1, data);
|
||||
} else if (command == "sw") {
|
||||
const auto address = parseAddress(commandVector.at(2));
|
||||
const auto data = Register::getInstance().getRegister(arg1);
|
||||
Memory::getInstance()->store(address, data);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,3 +84,16 @@ int Alu::parseArgument(std::string argument) {
|
||||
/// Da das Argument noch als String vorliegt, muss es in ein int umgewandelt werden
|
||||
return std::stoi(argument);
|
||||
}
|
||||
|
||||
int Alu::parseAddress(const std::string &argument) {
|
||||
/// Trenne das Argument bei '('
|
||||
/// 0(x1)
|
||||
const size_t pos = argument.find('(');
|
||||
if (pos != std::string::npos) {
|
||||
const auto immediate = argument.substr(0, pos);
|
||||
const auto register1 = argument.substr(pos + 1);
|
||||
const auto address = immediate + register1;
|
||||
return std::stoi(address);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user