From 4fdaf3dafa6ce746b834dcff8829ff42220162d0 Mon Sep 17 00:00:00 2001 From: black Date: Tue, 8 Jul 2025 17:21:46 +0200 Subject: [PATCH] "jal" command fixes --- src/Manager.cpp | 12 ++++++++++++ src/Manager.h | 7 +++++++ src/components/Alu.cpp | 6 ++++-- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/Manager.cpp b/src/Manager.cpp index eb76391..73df8ad 100644 --- a/src/Manager.cpp +++ b/src/Manager.cpp @@ -59,3 +59,15 @@ void Manager::init(const std::string &program_path) { return; } } + +std::streampos Manager::getNextStreamLineOffset() { + /// Speichert das aktuelle stream offset + const auto positionBefore = m_programFile.tellg(); + /// Geht eine Zeile nach vorne zum nächsten Befehl (PC+4) und speichert den offset + std::string line; + std::getline(m_programFile, line); + const auto positionAfter = m_programFile.tellg(); + /// Geht zum offset vom Anfang zurück und gibt die nächste Adresse (PC+4) zurück + m_programFile.seekg(positionBefore); + return positionAfter; +} diff --git a/src/Manager.h b/src/Manager.h index c7bb245..690325e 100644 --- a/src/Manager.h +++ b/src/Manager.h @@ -67,6 +67,13 @@ public: * @param program_path Der Pfad zur Quellcode .txt */ void init(const std::string &program_path); + + /** + * Gibt das stream offset für den nächsten Befehl (PC+4) zurück + * + * @return Die stream offset Position ("Zeilennummer") des nächsten Befehls + */ + std::streampos getNextStreamLineOffset(); }; diff --git a/src/components/Alu.cpp b/src/components/Alu.cpp index 3d62849..f9cb21c 100644 --- a/src/components/Alu.cpp +++ b/src/components/Alu.cpp @@ -130,12 +130,14 @@ void Alu::calculate(const std::vector &commandVector) { } } 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()); + /// !!! Aufgrund des casts des stream offsets zu int funktioniert das nicht bei großen Quellcode Dateien + /// und führt zu undefiniertem Verhalten !!! + const auto pos = static_cast(Manager::getInstance()->getNextStreamLineOffset().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); + } else if (command == "jalr") { } }