diff --git a/src/Manager.cpp b/src/Manager.cpp index d957c86..eb76391 100644 --- a/src/Manager.cpp +++ b/src/Manager.cpp @@ -40,6 +40,10 @@ void Manager::setStreamPosition(const std::streampos pos) { m_programFile.seekg(pos); } +std::streampos Manager::getStreamPosition() { + return m_programFile.tellg(); +} + void Manager::init(const std::string &program_path) { m_path = program_path; std::cout << "Öffne Quellcode Datei: '" << m_path << "'" << "\n" << std::flush; diff --git a/src/Manager.h b/src/Manager.h index 470c4a7..c7bb245 100644 --- a/src/Manager.h +++ b/src/Manager.h @@ -54,6 +54,18 @@ public: */ void setStreamPosition(std::streampos pos); + /** + * Gibt die aktuelle Position des Streams (virtuellen Lesekopfes) zurück + * + * @return Die Streamposition des Lesekopfes + */ + std::streampos getStreamPosition(); + + /** + * Öffnet die Quellcodedatei + * + * @param program_path Der Pfad zur Quellcode .txt + */ void init(const std::string &program_path); }; diff --git a/src/components/Alu.cpp b/src/components/Alu.cpp index 52941c8..3d62849 100644 --- a/src/components/Alu.cpp +++ b/src/components/Alu.cpp @@ -3,6 +3,8 @@ // #include "Alu.h" + +#include #include #include "Memory.h" @@ -126,6 +128,14 @@ void Alu::calculate(const std::vector &commandVector) { if (register1 != register2) { Manager::getInstance()->setStreamPosition(streamPos); } + } else if (command == "jal") { + /// Jump and link Befehl + /// !!! Funktioniert nicht bei großen Daten aufgrund des casts des stream offsets zu int + const auto pos = static_cast(Manager::getInstance()->getStreamPosition().operator std::streamoff()); + const auto &label = commandVector.at(2); + const auto streamPos = ProgramLoader::getInstance()->getStreamPosition(label); + Register::getInstance().setRegister(arg1, pos); + Manager::getInstance()->setStreamPosition(streamPos); } } diff --git a/src/components/Memory.h b/src/components/Memory.h index ab1697d..50ea11c 100644 --- a/src/components/Memory.h +++ b/src/components/Memory.h @@ -51,7 +51,7 @@ public: * @param address Die Adresse, aus der der Wert gelesen werden soll * @return Der Wert aus der Adresse */ - int load(int address) const; + [[nodiscard]] int load(int address) const; }; diff --git a/src/components/Register.cpp b/src/components/Register.cpp index c5a3a5d..8b36ae3 100644 --- a/src/components/Register.cpp +++ b/src/components/Register.cpp @@ -4,6 +4,8 @@ #include "Register.h" +#include + Register::Register() { m_registers = {0}; @@ -15,6 +17,7 @@ Register &Register::getInstance() { } void Register::setRegister(const int reg, const int value) { + if (reg == 0) std::cerr << "Register 0 darf nicht beschrieben werden!"; m_registers.at(reg) = value; } diff --git a/src/components/Register.h b/src/components/Register.h index 874c46d..44e2a24 100644 --- a/src/components/Register.h +++ b/src/components/Register.h @@ -5,6 +5,7 @@ #ifndef REGISTER_H #define REGISTER_H #include +#include /// Eine Registerklasse als Singleton implementiert. /// Als Speicher (Registers) wird ein int Array genutzt. @@ -50,7 +51,7 @@ public: * @param reg Die Position des Registers * @return Der Wert des Registers */ - int getRegister(int reg) const; + [[nodiscard]] int getRegister(int reg) const; }; #endif //REGISTER_H