4 Commits

Author SHA1 Message Date
9738ba1afd update to 1.1 2024-11-26 16:05:19 +01:00
432d706314 update README 2024-11-26 16:03:26 +01:00
be1c9f9fd7 add multiplication 2024-11-26 15:59:36 +01:00
f14d05a28a add reversing 2024-11-13 14:50:22 +01:00
6 changed files with 84 additions and 20 deletions

View File

@@ -3,13 +3,14 @@
## Usage ## Usage
```bash ```bash
./Assembleur [--help] [--version] [--output file] [--format type] file ./Assembleur [--help] [--reversed] [--version] [--output file] [--format type] file
``` ```
There are 3 format types : There are 3 format types :
- "int" : 32 bits integers are written. Exemple : `10878976` - "int" : 32 bits integers are written. Exemple : `10878976`
- "binint" (default) : bits are written. Exemple : `00000000 10100110 00000000 00000000` - "binint" : bits are written. Exemple : `00000000 10100110 00000000 00000000`
- "bin" : the file is written in pure binary - "bin" : the file is written in pure binary
- "logisim" (default) : the file is written in binary for use in LogiSim
## Exemple ## Exemple
@@ -22,6 +23,7 @@ operations:
or R1 R7 R3 or R1 R7 R3
sl R5 R2 #10 sl R5 R2 #10
sr R1 R2 R3 sr R1 R2 R3
mult R1 R1 R3
io: io:
str R1 R2 R3 str R1 R2 R3
ld R1 R2 R3 ld R1 R2 R3
@@ -46,12 +48,13 @@ Produces
00110000 10100110 00000000 00000000 00110000 10100110 00000000 00000000
01010000 10100110 00000000 00000000 01010000 10100110 00000000 00000000
01100000 10100110 00000000 00000000 01100000 10100110 00000000 00000000
01110000 10100110 00000000 00000000
01000001 01001100 00000000 00000000 01000001 01001100 00000000 00000000
01010001 01001100 00000000 00000000 01010001 01001100 00000000 00000000
11000000 00000000 00000000 00000101 11000000 00000000 00000000 00000101
11010001 01010000 00000000 00000011 11010001 01010000 00000000 00000011
11100001 01010000 00000000 00000010 11100001 01010000 00000000 00000010
11110001 01010000 00000000 00001100 11110001 01010000 00000000 00001101
11000001 01000000 00000000 00000001 11000001 01000000 00000000 00000001
11010100 00000000 00000000 00000111 11010100 00000000 00000000 00000111
11100000 00000000 00000000 00000000 11100000 00000000 00000000 00000000

View File

@@ -12,7 +12,7 @@ enum TypeArithmetique {
Xor, Xor,
Sl, Sl,
Sr, Sr,
Not, Mult,
}; };
enum TypeMemoire { enum TypeMemoire {
@@ -38,6 +38,7 @@ static std::map<std::string, Instruction> INSTRUCTION_KEYS = {
{"xor", {Arithmetique, Xor}}, {"xor", {Arithmetique, Xor}},
{"sl", {Arithmetique, Sl}}, {"sl", {Arithmetique, Sl}},
{"sr", {Arithmetique, Sr}}, {"sr", {Arithmetique, Sr}},
{"mult", {Arithmetique, Mult}},
{"str", {Memoire, Str}}, {"str", {Memoire, Str}},
{"ld", {Memoire, Ld}}, {"ld", {Memoire, Ld}},
{"jmp", {SautControle, Jump}}, {"jmp", {SautControle, Jump}},

View File

@@ -1,8 +1,27 @@
#include "IO.h" #include "IO.h"
#include "Assembleur.h" #include "Assembleur.h"
#include <algorithm>
#include <bitset> #include <bitset>
#include <cstring>
#include <fstream> #include <fstream>
#include <iomanip>
static std::uint32_t reverseInt(std::uint32_t a_Int) {
std::uint32_t result = 0;
for (int i = 0; i < 32; i++) {
result |= a_Int & 0x1;
result <<= 1;
a_Int >>= 1;
}
return result;
}
static void reverseDataByte(BinaryData& a_Data) {
for (std::uint32_t& element : a_Data) {
element = reverseInt(element);
}
}
BinaryData ParseFile(const std::string& fileName) { BinaryData ParseFile(const std::string& fileName) {
std::ifstream file{fileName}; std::ifstream file{fileName};
@@ -45,22 +64,47 @@ BinaryData ParseFile(const std::string& fileName) {
return output; return output;
} }
void OutputFileBinary(const BinaryData& a_Data, const std::string& fileName) { void OutputFileBinary(BinaryData& a_Data, const std::string& fileName, bool a_Reverse) {
std::ofstream file{fileName}; std::ofstream file{fileName};
if (a_Reverse)
reverseDataByte(a_Data);
file.write(reinterpret_cast<const char*>(a_Data.data()), a_Data.size() * sizeof(a_Data.at(0))); file.write(reinterpret_cast<const char*>(a_Data.data()), a_Data.size() * sizeof(a_Data.at(0)));
} }
void OutputFileIntegers(const BinaryData& a_Data, const std::string& fileName) { void OutputFileIntegers(BinaryData& a_Data, const std::string& fileName, bool a_Reverse) {
std::ofstream file{fileName}; std::ofstream file{fileName};
if (a_Reverse)
reverseDataByte(a_Data);
for (std::uint32_t number : a_Data) { for (std::uint32_t number : a_Data) {
file << number << "\n"; file << number << "\n";
} }
} }
void OutputFileBinIntegers(const BinaryData& a_Data, const std::string& fileName) { void OutputFileBinIntegers(BinaryData& a_Data, const std::string& fileName, bool a_Reverse) {
std::ofstream file{fileName}; std::ofstream file{fileName};
if (a_Reverse)
reverseDataByte(a_Data);
for (std::uint32_t number : a_Data) { for (std::uint32_t number : a_Data) {
file << std::bitset<8>(number >> 24) << " " << std::bitset<8>(number >> 16) << " " << std::bitset<8>(number >> 8) << file << std::bitset<8>(number >> 24) << " " << std::bitset<8>(number >> 16) << " " << std::bitset<8>(number >> 8) << " "
" " << std::bitset<8>(number) << "\n"; << std::bitset<8>(number) << "\n";
}
}
void OutputFileLogisim(BinaryData& a_Data, const std::string& fileName, const std::string& a_Header, bool a_Reverse) {
std::ofstream file{fileName};
file << a_Header << "\n";
std::uint64_t cursor = 0;
if (a_Reverse)
reverseDataByte(a_Data);
for (std::uint32_t number : a_Data) {
if (cursor % 8 == 0) {
file << std::setfill('0') << std::setw(4) << std::hex << cursor << std::dec << ": ";
file << std::bitset<8>(number >> 24) << " " << std::bitset<8>(number >> 16) << " " << std::bitset<8>(number >> 8) << " "
<< std::bitset<8>(number) << " ";
} else {
file << std::bitset<8>(number >> 24) << " " << std::bitset<8>(number >> 16) << " " << std::bitset<8>(number >> 8) << " "
<< std::bitset<8>(number) << "\n";
}
cursor += 4;
} }
} }

View File

@@ -7,6 +7,7 @@ using BinaryData = std::vector<std::uint32_t>;
BinaryData ParseFile(const std::string& fileName); BinaryData ParseFile(const std::string& fileName);
void OutputFileBinary(const BinaryData& a_Data, const std::string& fileName); void OutputFileBinary(BinaryData& a_Data, const std::string& fileName, bool a_Reverse);
void OutputFileIntegers(const BinaryData& a_Data, const std::string& fileName); void OutputFileIntegers(BinaryData& a_Data, const std::string& fileName, bool a_Reverse);
void OutputFileBinIntegers(const BinaryData& a_Data, const std::string& fileName); void OutputFileBinIntegers(BinaryData& a_Data, const std::string& fileName, bool a_Reverse);
void OutputFileLogisim(BinaryData& a_Data, const std::string& fileName, const std::string& a_Header, bool a_Reverse);

View File

@@ -3,9 +3,11 @@
#include "IO.h" #include "IO.h"
#define ASSEMBLEUR_VERSION "1.1"
int main(int argc, char** argv) { int main(int argc, char** argv) {
argparse::ArgumentParser program("Assembleur"); argparse::ArgumentParser program("Assembleur", ASSEMBLEUR_VERSION);
std::string inputFileName; std::string inputFileName;
program.add_argument("file") program.add_argument("file")
@@ -21,12 +23,22 @@ int main(int argc, char** argv) {
std::string formatType; std::string formatType;
program.add_argument("-f", "--format") program.add_argument("-f", "--format")
.help("Type of the output. [bin|int|binint]") .help("Type of the output. [logisim|bin|int|binint]")
.metavar("type") .metavar("type")
.default_value(std::string("binint")) .default_value(std::string("logisim"))
.choices("bin", "int", "binint") .choices("logisim", "bin", "int", "binint")
.store_into(formatType); .store_into(formatType);
std::string header;
program.add_argument("-h", "--header")
.help("Header of the file")
.metavar("header")
.default_value(std::string("v3.0 hex words addressed"))
.store_into(header);
bool reverse;
program.add_argument("-r", "--reversed").help("inverse bit orders").flag().store_into(reverse);
try { try {
program.parse_args(argc, argv); program.parse_args(argc, argv);
} catch (const std::exception& err) { } catch (const std::exception& err) {
@@ -38,12 +50,14 @@ int main(int argc, char** argv) {
try { try {
auto output = ParseFile(inputFileName); auto output = ParseFile(inputFileName);
if (formatType == "bin") { if (formatType == "logisim") {
OutputFileBinary(output, outputFileName); OutputFileLogisim(output, outputFileName, header, reverse);
} else if (formatType == "bin") {
OutputFileBinary(output, outputFileName, reverse);
} else if (formatType == "int") { } else if (formatType == "int") {
OutputFileIntegers(output, outputFileName); OutputFileIntegers(output, outputFileName, reverse);
} else { } else {
OutputFileBinIntegers(output, outputFileName); OutputFileBinIntegers(output, outputFileName, reverse);
} }
} catch (std::runtime_error& e) { } catch (std::runtime_error& e) {

View File

@@ -6,6 +6,7 @@ operations:
or R1 R2 R3 or R1 R2 R3
sl R1 R2 R3 sl R1 R2 R3
sr R1 R2 R3 sr R1 R2 R3
mult R1 R2 R3
io: io:
str R1 R2 R3 str R1 R2 R3
ld R1 R2 R3 ld R1 R2 R3