summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-01-27 23:28:15 +0100
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-01-27 23:29:11 +0100
commit73482b5dd2f8bacc019c8db2a563f45f81961686 (patch)
tree128fe2d2180553e297ec56cca1f00cff8bccea8a
parent5b49ce381c840a14b2e5a493d471bd2e378e5db6 (diff)
Asm86: Add support for mov instructions.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
-rw-r--r--Private/CompilerKit/AsmKit/Arch/amd64.hpp15
-rw-r--r--Private/CompilerKit/AsmKit/AsmKit.hpp11
-rw-r--r--Private/CompilerKit/Defines.hpp4
-rw-r--r--Private/Toolchain/bin/Source/hello_amd64.masm515
-rw-r--r--Private/Toolchain/i64asm.cc92
-rw-r--r--Public/PDF/ASM_86.TXT10
6 files changed, 66 insertions, 581 deletions
diff --git a/Private/CompilerKit/AsmKit/Arch/amd64.hpp b/Private/CompilerKit/AsmKit/Arch/amd64.hpp
index 78007b1..239bdca 100644
--- a/Private/CompilerKit/AsmKit/Arch/amd64.hpp
+++ b/Private/CompilerKit/AsmKit/Arch/amd64.hpp
@@ -45,10 +45,21 @@ struct CpuCodeAMD64
#define kJumpLimitStandardLimit 0xEB
inline std::vector<CpuCodeAMD64> kOpcodesAMD64 = {
- kAsmOpcodeDecl("int", kAsmIntOpcode)
- kAsmOpcodeDecl("int", kasmIntOpcodeAlt)
+ kAsmOpcodeDecl("int", 0xE3)
kAsmOpcodeDecl("into", 0xCE)
kAsmOpcodeDecl("iret", 0xCF)
+ kAsmOpcodeDecl("ret", 0xC3)
+ kAsmOpcodeDecl("sti", 0xfb)
+ kAsmOpcodeDecl("cli", 0xfa)
+ kAsmOpcodeDecl("mov eax", 0xb8)
+ kAsmOpcodeDecl("mov ecx", 0xb9)
+ kAsmOpcodeDecl("mov edx", 0xba)
+ kAsmOpcodeDecl("mov ebx", 0xbb)
+ kAsmOpcodeDecl("mov esp", 0xbc)
+ kAsmOpcodeDecl("mov ebp", 0xbd)
+ kAsmOpcodeDecl("mov esi", 0xbe)
+ kAsmOpcodeDecl("jmp", 0xE9)
+ kAsmOpcodeDecl("call", 0xE9)
};
// \brief 64x0 register prefix
diff --git a/Private/CompilerKit/AsmKit/AsmKit.hpp b/Private/CompilerKit/AsmKit/AsmKit.hpp
index e85b5d6..cc8940e 100644
--- a/Private/CompilerKit/AsmKit/AsmKit.hpp
+++ b/Private/CompilerKit/AsmKit/AsmKit.hpp
@@ -134,8 +134,17 @@ namespace CompilerKit
explicit NumberCast(UInt64 raw) : raw(raw) {}
~NumberCast() { raw = 0; }
- char number[8];
+ CharType number[8];
UInt64 raw;
};
+
+ union NumberCast32 final
+ {
+ explicit NumberCast32(UInt32 raw) : raw(raw) {}
+ ~NumberCast32() { raw = 0; }
+
+ CharType number[4];
+ UInt32 raw;
+ };
}
diff --git a/Private/CompilerKit/Defines.hpp b/Private/CompilerKit/Defines.hpp
index 33fca43..568e024 100644
--- a/Private/CompilerKit/Defines.hpp
+++ b/Private/CompilerKit/Defines.hpp
@@ -30,8 +30,8 @@
#define Int64 int64_t
#define UInt64 uint64_t
-#define Int32 int32_t
-#define UInt32 uint32_t
+#define Int32 int
+#define UInt32 unsigned
#define Bool bool
diff --git a/Private/Toolchain/bin/Source/hello_amd64.masm b/Private/Toolchain/bin/Source/hello_amd64.masm
index 4d3c349..84010aa 100644
--- a/Private/Toolchain/bin/Source/hello_amd64.masm
+++ b/Private/Toolchain/bin/Source/hello_amd64.masm
@@ -1,510 +1,7 @@
-org 0x7c00
+org 0x1000
+bits 64
-nop
-
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-db 0x0
-
-db 0xAA
-db 0x55 \ No newline at end of file
+export .text MySampleFoo
+cli
+mov edx, 0x1000
+ret \ No newline at end of file
diff --git a/Private/Toolchain/i64asm.cc b/Private/Toolchain/i64asm.cc
index 039cbfc..7ebe06c 100644
--- a/Private/Toolchain/i64asm.cc
+++ b/Private/Toolchain/i64asm.cc
@@ -143,12 +143,6 @@ MPCC_MODULE(MPUXAssemblerAMD64)
CpuCodeAMD64 lea{.fName = "lea", .fOpcode = 0x8D};
kOpcodesAMD64.push_back(lea);
- for (e64_hword_t i = 0xA0; i < 0xA3; i++)
- {
- CpuCodeAMD64 mov{.fName = "mov", .fOpcode = i};
- kOpcodesAMD64.push_back(mov);
- }
-
CpuCodeAMD64 mov{.fName = "nop", .fOpcode = 0x90};
kOpcodesAMD64.push_back(mov);
@@ -350,10 +344,15 @@ MPCC_MODULE(MPUXAssemblerAMD64)
// byte from byte, we write this.
for (auto &byte : kBytes)
{
- for (size_t i = 0; i < sizeof(byte); i++)
+ if (byte == 0)
+ continue;
+
+ if (byte == 0xFF)
{
- file_ptr_out << reinterpret_cast<const char *>(&byte)[i];
+ byte = 0;
}
+
+ file_ptr_out << reinterpret_cast<const char *>(&byte)[0];
}
if (kVerbose)
@@ -656,11 +655,14 @@ bool CompilerKit::PlatformAssemblerAMD64::WriteNumber(const std::size_t &pos, st
}
}
- CompilerKit::NumberCast num(strtoq(jump_label.substr(pos + 2).c_str(),
+ CompilerKit::NumberCast32 num(strtoq(jump_label.substr(pos + 2).c_str(),
nullptr, 16));
for (char &i : num.number)
{
+ if (i == 0)
+ i = 0xFF;
+
kBytes.push_back(i);
}
@@ -684,7 +686,7 @@ bool CompilerKit::PlatformAssemblerAMD64::WriteNumber(const std::size_t &pos, st
}
}
- CompilerKit::NumberCast num(strtoq(jump_label.substr(pos + 2).c_str(),
+ CompilerKit::NumberCast32 num(strtoq(jump_label.substr(pos + 2).c_str(),
nullptr, 2));
if (kVerbose)
@@ -694,6 +696,9 @@ bool CompilerKit::PlatformAssemblerAMD64::WriteNumber(const std::size_t &pos, st
for (char &i : num.number)
{
+ if (i == 0)
+ i = 0xFF;
+
kBytes.push_back(i);
}
@@ -712,7 +717,7 @@ bool CompilerKit::PlatformAssemblerAMD64::WriteNumber(const std::size_t &pos, st
}
}
- CompilerKit::NumberCast num(strtoq(jump_label.substr(pos + 2).c_str(),
+ CompilerKit::NumberCast32 num(strtoq(jump_label.substr(pos + 2).c_str(),
nullptr, 7));
if (kVerbose)
@@ -722,6 +727,9 @@ bool CompilerKit::PlatformAssemblerAMD64::WriteNumber(const std::size_t &pos, st
for (char &i : num.number)
{
+ if (i == 0)
+ i = 0xFF;
+
kBytes.push_back(i);
}
@@ -744,11 +752,14 @@ bool CompilerKit::PlatformAssemblerAMD64::WriteNumber(const std::size_t &pos, st
}
}
- CompilerKit::NumberCast num(strtoq(jump_label.substr(pos).c_str(),
+ CompilerKit::NumberCast32 num(strtoq(jump_label.substr(pos).c_str(),
nullptr, 10));
for (char &i : num.number)
{
+ if (i == 0)
+ i = 0xFF;
+
kBytes.push_back(i);
}
@@ -781,62 +792,9 @@ bool CompilerKit::PlatformAssemblerAMD64::WriteLine(std::string &line, const std
kBytes.emplace_back(opcodeAMD64.fOpcode);
- if (name == "mov")
+ if (name.find("mov") != std::string::npos)
{
- std::size_t found_some = 0UL;
-
- for (size_t line_index = 0UL; line_index < line.size(); line_index++)
- {
- if (line[line_index] == kAsmRegisterPrefix[0] &&
- isdigit(line[line_index + 1]))
- {
- std::string register_syntax = kAsmRegisterPrefix;
- register_syntax += line[line_index + 1];
-
- if (isdigit(line[line_index + 2]))
- register_syntax += line[line_index + 2];
-
- std::string reg_str;
- reg_str += line[line_index + 1];
-
- if (isdigit(line[line_index + 2]))
- reg_str += line[line_index + 2];
-
- // it ranges from r0 to r19
- // something like r190 doesn't exist in the instruction set.
- if (kOutputArch == CompilerKit::kPefArch64000)
- {
- if (isdigit(line[line_index + 3]) &&
- isdigit(line[line_index + 2]))
- {
- reg_str += line[line_index + 3];
- detail::print_error("invalid register index, r" + reg_str + "\nnote: The 64x0 accepts registers from r0 to r20.", file);
- throw std::runtime_error("invalid_register_index");
- }
- }
-
- // finally cast to a size_t
- std::size_t reg_index = strtoq(
- reg_str.c_str(),
- nullptr,
- 10);
-
- if (reg_index > kAsmRegisterLimit)
- {
- detail::print_error("invalid register index, r" + reg_str, file);
- throw std::runtime_error("invalid_register_index");
- }
-
- kBytes.emplace_back(reg_index);
- ++found_some;
-
- if (kVerbose)
- {
- kStdOut << "64asm: Register found: " << register_syntax << "\n";
- kStdOut << "64asm: Register amount in instruction: " << found_some << "\n";
- }
- }
- }
+ this->WriteNumber(line.find(name) + name.size() + 2, line);
}
}
}
diff --git a/Public/PDF/ASM_86.TXT b/Public/PDF/ASM_86.TXT
new file mode 100644
index 0000000..b7111be
--- /dev/null
+++ b/Public/PDF/ASM_86.TXT
@@ -0,0 +1,10 @@
+- We use the Mahrouss Logic x86 Standard:
+- Register is prefixed with 'r' and hols it's id.
+- Register Dest first, Source second, example: mov rd, rs
+- #code_<isa>_<features>, which will let select what
+ instructions to use.
+
+
+TODO:
+ Encode instructions [ X ]
+ Extend instructions support [ ] \ No newline at end of file