fix jump forward

This commit is contained in:
2024-10-23 20:05:41 +02:00
parent 47e7a17a74
commit 51f113804a
3 changed files with 27 additions and 11 deletions

View File

@@ -78,16 +78,16 @@ std::uint32_t Assembleur::ParseOperationImmediate(
} }
std::uint32_t Assembleur::ParseJump(Instruction a_Instruction, const std::string& a_Label) { std::uint32_t Assembleur::ParseJump(Instruction a_Instruction, const std::string& a_Label) {
int jump = a_Instruction.m_Line - ParseLabel(a_Label); std::int32_t jump = ParseLabel(a_Label) - a_Instruction.m_Line;
if (jump < 0) if (jump < 0)
jump = jump & 0x7FFFFFF | 0x4000000; jump = std::abs(jump) & 0x7FFFFFF | 0x4000000;
return IToInt(a_Instruction) | jump; return IToInt(a_Instruction) | jump;
} }
std::uint32_t Assembleur::ParseJump(Instruction a_Instruction, std::uint8_t a_R1, std::uint8_t a_R2, const std::string& a_Label) { std::uint32_t Assembleur::ParseJump(Instruction a_Instruction, std::uint8_t a_R1, std::uint8_t a_R2, const std::string& a_Label) {
int jump = a_Instruction.m_Line - ParseLabel(a_Label); std::int32_t jump = ParseLabel(a_Label) - a_Instruction.m_Line;
if (jump < 0) if (jump < 0)
jump = jump & 0xFFFFF | 100000; jump = std::abs(jump) & 0xFFFFF | 0x100000;
return IToInt(a_Instruction) | a_R1 << 24 | a_R2 << 21 | jump; return IToInt(a_Instruction) | a_R1 << 24 | a_R2 << 21 | jump;
} }

View File

@@ -6,22 +6,38 @@
BinaryData ParseFile(const std::string& fileName) { BinaryData ParseFile(const std::string& fileName) {
std::ifstream file{fileName}; std::ifstream file{fileName};
std::uint32_t lineNumber = 0, realLineNumber = 0; std::uint32_t lineNumber = 0, realLineNumber = 0;
std::string line; std::string currentLine;
std::vector<std::string> lines;
Assembleur assembleur; Assembleur assembleur;
BinaryData output; BinaryData output;
while (getline(file, line)) { // parsing labels
while (getline(file, currentLine)) {
lines.push_back(currentLine);
lineNumber++; lineNumber++;
realLineNumber++; realLineNumber++;
if (line.find(":") != std::string::npos) { if (currentLine.find(":") != std::string::npos) {
std::string label = line.substr(0, line.size() - 1); std::string label = currentLine.substr(0, currentLine.size() - 1);
assembleur.AddLabel(label, lineNumber); assembleur.AddLabel(label, lineNumber);
lineNumber--; lineNumber--;
} else { }
}
lineNumber = realLineNumber = 0;
// parsing instructions
for (std::string line : lines) {
lineNumber++;
realLineNumber++;
if (line.find(":") == std::string::npos) {
output.push_back(assembleur.ParseInstruction(line, lineNumber, realLineNumber)); output.push_back(assembleur.ParseInstruction(line, lineNumber, realLineNumber));
} else {
lineNumber--;
} }
} }

View File

@@ -10,11 +10,11 @@ io:
str R1 R2 R3 str R1 R2 R3
ld R1 R2 R3 ld R1 R2 R3
sauts: sauts:
jmp operations jmp controle
jequ R1 R2 io jequ R1 R2 io
jneq R1 R2 sauts jneq R1 R2 sauts
jsup R1 R2 operations jsup R1 R2 operations
jinf R1 R2 io jinf R1 R2 controle
controle: controle:
call io call io
ret ret