summaryrefslogtreecommitdiffhomepage
path: root/asm/intel64/int.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'asm/intel64/int.cpp')
-rw-r--r--asm/intel64/int.cpp28
1 files changed, 28 insertions, 0 deletions
diff --git a/asm/intel64/int.cpp b/asm/intel64/int.cpp
new file mode 100644
index 0000000..7b682ab
--- /dev/null
+++ b/asm/intel64/int.cpp
@@ -0,0 +1,28 @@
+#include "int.h"
+
+#include <asm/assembler.h>
+
+Op_int::Op_int(AsmArgs& args)
+{
+ // At this point, the registration already ensured the number and types of args
+
+ Immediate8 i {std::any_cast<Immediate8>(args[0])};
+
+ if (i.value() == 0) { // INT 0
+ machine_code = { 0xCE };
+ } else if (i.value() == 1) { // INT 1
+ machine_code = { 0xF1 };
+ } else if (i.value() == 3) { // INT 3
+ machine_code = { 0xCC };
+ } else { // INT <...>
+ machine_code = std::vector<uint8_t>{ 0xCD, i.value() };
+ }
+}
+
+namespace {
+
+bool registered { registerOp(mangleName<Immediate8>("int"), [](AsmArgs& args) -> std::shared_ptr<Op>{
+ return std::make_shared<Op_int>(args);
+ }) };
+
+}