diff options
| author | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-01-27 23:28:15 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-01-27 23:29:11 +0100 |
| commit | 73482b5dd2f8bacc019c8db2a563f45f81961686 (patch) | |
| tree | 128fe2d2180553e297ec56cca1f00cff8bccea8a | |
| parent | 5b49ce381c840a14b2e5a493d471bd2e378e5db6 (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.hpp | 15 | ||||
| -rw-r--r-- | Private/CompilerKit/AsmKit/AsmKit.hpp | 11 | ||||
| -rw-r--r-- | Private/CompilerKit/Defines.hpp | 4 | ||||
| -rw-r--r-- | Private/Toolchain/bin/Source/hello_amd64.masm | 515 | ||||
| -rw-r--r-- | Private/Toolchain/i64asm.cc | 92 | ||||
| -rw-r--r-- | Public/PDF/ASM_86.TXT | 10 |
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 |
