summaryrefslogtreecommitdiffhomepage
path: root/asm/intel64/xor.cpp
diff options
context:
space:
mode:
authorRoland Reichwein <mail@reichwein.it>2020-10-18 16:59:54 +0200
committerRoland Reichwein <mail@reichwein.it>2020-10-18 16:59:54 +0200
commit8a2d1dc5c8b6639985d26d1c915048d87d52426b (patch)
tree2f3957a1c24ef35b4ec9259a6a0d97393b248a57 /asm/intel64/xor.cpp
parent8f28495ab9a8ebf53868405541e907394895e51f (diff)
Added xor, mov, jmp
Diffstat (limited to 'asm/intel64/xor.cpp')
-rw-r--r--asm/intel64/xor.cpp31
1 files changed, 31 insertions, 0 deletions
diff --git a/asm/intel64/xor.cpp b/asm/intel64/xor.cpp
new file mode 100644
index 0000000..c0dbb68
--- /dev/null
+++ b/asm/intel64/xor.cpp
@@ -0,0 +1,31 @@
+#include "xor.h"
+
+#include "codes.h"
+
+#include <asm/assembler.h>
+#include <asm/operators.h>
+
+#include <asm/intel64/codes.h>
+
+using namespace std::string_literals;
+
+Op_xor::Op_xor(AsmArgs& args)
+{
+ if (args[0].type() == typeid(AsmArgs::Register8) && args[1].type() == typeid(AsmArgs::Register8)) { // xor reg8, reg8
+ // r8, r/m8: ModRM:reg (w), ModRM:r/m (r)
+ machine_code = std::vector<uint8_t>{ 0x32 } +
+ ModRM(std::any_cast<AsmArgs::Register8>(args[0]).name(), std::any_cast<AsmArgs::Register8>(args[1]).name());
+ } else {
+ throw std::runtime_error("Unimplemented: xor "s + args[0].type().name() + " "s + args[1].type().name());
+ }
+}
+
+namespace {
+
+bool registered {
+ registerOp(mangleName<AsmArgs::Register8, AsmArgs::Register8>("xor"), [](AsmArgs& args) -> std::shared_ptr<Op>{
+ return std::make_shared<Op_xor>(args);
+ })
+};
+
+}