summaryrefslogtreecommitdiffstats
path: root/src/disasm.c
diff options
context:
space:
mode:
authorladevieq <ladevie.quentin@gmail.com>2026-07-12 00:47:54 +0200
committerladevieq <ladevie.quentin@gmail.com>2026-07-12 00:47:54 +0200
commit7b6964eb1bcf30a0ae7ed3391adce30565b262b4 (patch)
tree3bbf89d582a1466a2319ccaaf6d4cbb734bdd66b /src/disasm.c
parentce51256c91e566d339c6a670af11bab519f98349 (diff)
Load functions by hand
Diffstat (limited to 'src/disasm.c')
-rw-r--r--src/disasm.c86
1 files changed, 44 insertions, 42 deletions
diff --git a/src/disasm.c b/src/disasm.c
index 6e425fb..6cceb53 100644
--- a/src/disasm.c
+++ b/src/disasm.c
@@ -197,7 +197,7 @@ const struct opcode primary_opcode_map[256U] = {
{ "OR", { .src = ModRM_Reg, .type = TYPE_v }, { .src = Imm, .type = TYPE_BYTE }}, // AL, need to understand and handle
{ "OR", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }},
{ "PUSH", { .src = ModRM_Reg, .type = TYPE_v }, { .src = Imm, .type = TYPE_BYTE }}, // TODO
- {}, // Escape to secondary op code map
+ { "INVALID", { .src = None }, { .src = None }}, // Escape to secondary op code map
{ "ADC", { .src = TYPE_E, .type = TYPE_BYTE }, { .src = ModRM_Reg, .type = TYPE_BYTE }},
{ "ADC", { .src = TYPE_E, .type = TYPE_v}, { .src = ModRM_Reg, .type = TYPE_v }},
{ "ADC", { .src = ModRM_Reg, .type = TYPE_BYTE }, { .src = TYPE_E, .type = TYPE_BYTE }},
@@ -284,49 +284,49 @@ const struct opcode primary_opcode_map[256U] = {
{ "ARPL", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
{ "seg", { .src = ModRM_Reg, .type = TYPE_v }, { .src = Imm, .type = TYPE_BYTE }}, // TODO
{ "seg", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
- {}, // Operand size overide prefix
- {}, // Address size override prefix
+ { "INVALID", { .src = None }, { .src = None }}, // Operand size overide prefix
+ { "INVALID", { .src = None }, { .src = None }}, // Address size override prefix
{ "PUSH", { .src = TYPE_E, .type = TYPE_BYTE }, { .src = ModRM_Reg, .type = TYPE_BYTE }}, // TODO
{ "IMUL", { .src = TYPE_E, .type = TYPE_v}, { .src = ModRM_Reg, .type = TYPE_v }}, // TODO
{ "PUSH", { .src = ModRM_Reg, .type = TYPE_BYTE }, { .src = TYPE_E, .type = TYPE_BYTE }}, // TODO
{ "IMUL", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
- { "INSB", { .src = ModRM_Reg, .type = TYPE_v }, { .src = Imm, .type = TYPE_BYTE }}, // TODO
+ { "INSB", { .src = ModRM_Reg, .type = TYPE_v }, { .src = Imm, .type = TYPE_BYTE }}, // TODO
{ "INSW/D", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
- { "OUTS/B", { .src = ModRM_Reg, .type = TYPE_v }, { .src = Imm, .type = TYPE_BYTE }}, // TODO
+ { "OUTS/B", { .src = ModRM_Reg, .type = TYPE_v }, { .src = Imm, .type = TYPE_BYTE }}, // TODO
{ "OUTS/W/D", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
{ "JO", { .src = TYPE_E, .type = TYPE_BYTE }, { .src = ModRM_Reg, .type = TYPE_BYTE }}, // TODO
{ "JNO", { .src = TYPE_E, .type = TYPE_v}, { .src = ModRM_Reg, .type = TYPE_v }}, // TODO
{ "JB", { .src = ModRM_Reg, .type = TYPE_BYTE }, { .src = TYPE_E, .type = TYPE_BYTE }}, // TODO
{ "JNB", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
- { "JZ", { .src = ModRM_Reg, .type = TYPE_v }, { .src = Imm, .type = TYPE_BYTE }}, // TODO
+ { "JZ", { .src = ModRM_Reg, .type = TYPE_v }, { .src = Imm, .type = TYPE_BYTE }}, // TODO
{ "JNZ", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
- { "JBE", { .src = ModRM_Reg, .type = TYPE_v }, { .src = Imm, .type = TYPE_BYTE }}, // TODO
+ { "JBE", { .src = ModRM_Reg, .type = TYPE_v }, { .src = Imm, .type = TYPE_BYTE }}, // TODO
{ "JNBE", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
{ "JS", { .src = TYPE_E, .type = TYPE_BYTE }, { .src = ModRM_Reg, .type = TYPE_BYTE }}, // TODO
{ "JNS", { .src = TYPE_E, .type = TYPE_v}, { .src = ModRM_Reg, .type = TYPE_v }}, // TODO
{ "JP", { .src = ModRM_Reg, .type = TYPE_BYTE }, { .src = TYPE_E, .type = TYPE_BYTE }}, // TODO
{ "JNP", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
- { "JL", { .src = ModRM_Reg, .type = TYPE_v }, { .src = Imm, .type = TYPE_BYTE }}, // TODO
+ { "JL", { .src = ModRM_Reg, .type = TYPE_v }, { .src = Imm, .type = TYPE_BYTE }}, // TODO
{ "JNL", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
- { "JLE", { .src = ModRM_Reg, .type = TYPE_v }, { .src = Imm, .type = TYPE_BYTE }}, // TODO
+ { "JLE", { .src = ModRM_Reg, .type = TYPE_v }, { .src = Imm, .type = TYPE_BYTE }}, // TODO
{ "JNLE", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
- {}, // Group 1 Opcode
- {}, // Group 1 Opcode
- {}, // Group 1 Opcode
- {}, // Group 1 Opcode
- { "TEST", { .src = ModRM_Reg, .type = TYPE_v }, { .src = Imm, .type = TYPE_BYTE }}, // TODO
+ { "INVALID", { .src = None }, { .src = None }}, // Group 1 Opcode
+ { "INVALID", { .src = None }, { .src = None }}, // Group 1 Opcode
+ { "INVALID", { .src = None }, { .src = None }}, // Group 1 Opcode
+ { "INVALID", { .src = None }, { .src = None }}, // Group 1 Opcode
+ { "TEST", { .src = ModRM_Reg, .type = TYPE_v }, { .src = Imm, .type = TYPE_BYTE }}, // TODO
{ "TEST", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
- { "XCHG", { .src = ModRM_Reg, .type = TYPE_v }, { .src = Imm, .type = TYPE_BYTE }}, // TODO
+ { "XCHG", { .src = ModRM_Reg, .type = TYPE_v }, { .src = Imm, .type = TYPE_BYTE }}, // TODO
{ "XCHG", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
{ "MOV", { .src = TYPE_E, .type = TYPE_BYTE }, { .src = ModRM_Reg, .type = TYPE_BYTE }}, // TODO
{ "MOV", { .src = TYPE_E, .type = TYPE_v}, { .src = ModRM_Reg, .type = TYPE_v }}, // TODO
{ "MOV", { .src = ModRM_Reg, .type = TYPE_BYTE }, { .src = TYPE_E, .type = TYPE_BYTE }}, // TODO
{ "MOV", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
- { "MOV", { .src = ModRM_Reg, .type = TYPE_v }, { .src = Imm, .type = TYPE_BYTE }}, // TODO
+ { "MOV", { .src = ModRM_Reg, .type = TYPE_v }, { .src = Imm, .type = TYPE_BYTE }}, // TODO
{ "LEA", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
- { "MOV", { .src = ModRM_Reg, .type = TYPE_v }, { .src = Imm, .type = TYPE_BYTE }}, // TODO
- {}, // Group 1 Opcode
- { "NOP", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
+ { "MOV", { .src = ModRM_Reg, .type = TYPE_v }, { .src = Imm, .type = TYPE_BYTE }}, // TODO
+ { "INVALID", { .src = None }, { .src = None }}, // Group 1 Opcode
+ { "NOP", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
{ "XCHG", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
{ "XCHG", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
{ "XCHG", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
@@ -374,38 +374,38 @@ const struct opcode primary_opcode_map[256U] = {
{ "MOV", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
{ "MOV", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
{ "MOV", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
- {}, // Group 2 opcode
- {}, // Group 2 opcode
+ { "INVALID", { .src = None }, { .src = None }}, // Group 2 opcode
+ { "INVALID", { .src = None }, { .src = None }}, // Group 2 opcode
{ "RET", { .src = ModRM_Reg, .type = TYPE_BYTE }, { .src = TYPE_E, .type = TYPE_BYTE }}, // TODO
{ "RET", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
- { "LES", { .src = ModRM_Reg, .type = TYPE_v }, { .src = Imm, .type = TYPE_BYTE }}, // TODO
+ { "LES", { .src = ModRM_Reg, .type = TYPE_v }, { .src = Imm, .type = TYPE_BYTE }}, // TODO
{ "LDS", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
- {}, // Group 11 opcode
- {}, // Group 11 opcode
+ { "INVALID", { .src = None }, { .src = None }}, // Group 11 opcode
+ { "INVALID", { .src = None }, { .src = None }}, // Group 11 opcode
{ "ENTER", { .src = ModRM_Reg, .type = TYPE_WORD }, { .src = Imm, .type = TYPE_BYTE }},
{ "LEAVE", { .src = None }, { .src = None }},
{ "RET far", { .src = Imm, .type = TYPE_WORD }, { .src = None }},
{ "RET far", { .src = None }, { .src = None }},
{ "INT 3", { .src = None }, { .src = None }},
{ "INT", { .src = Imm, .type = TYPE_BYTE }, { .src = None }},
- { "INTO", { .src = None }, { .src = None }}, // Invalid in 64bit mode
+ { "INTO", { .src = None }, { .src = None }}, // Invalid in 64bit mode
{ "IRET/D/Q", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
- {}, // Group 2 Opcode
- {}, // Group 2 Opcode
- {}, // Group 2 Opcode
- {}, // Group 2 Opcode
+ { "INVALID", { .src = None }, { .src = None }}, // Group 2 Opcode
+ { "INVALID", { .src = None }, { .src = None }}, // Group 2 Opcode
+ { "INVALID", { .src = None }, { .src = None }}, // Group 2 Opcode
+ { "INVALID", { .src = None }, { .src = None }}, // Group 2 Opcode
{ "AAM", { .src = TYPE_E, .type = TYPE_BYTE }, { .src = ModRM_Reg, .type = TYPE_BYTE }}, // TODO
{ "AAD", { .src = TYPE_E, .type = TYPE_v}, { .src = ModRM_Reg, .type = TYPE_v }}, // TODO
- {}, // invalid
+ { "INVALID", { .src = None }, { .src = None }}, // invalid
{ "XLAT", { .src = TYPE_E, .type = TYPE_v}, { .src = ModRM_Reg, .type = TYPE_v }}, // TODO
- {}, // TODO x87 instructions
- {}, // TODO x87 instructions
- {}, // TODO x87 instructions
- {}, // TODO x87 instructions
- {}, // TODO x87 instructions
- {}, // TODO x87 instructions
- {}, // TODO x87 instructions
- {}, // TODO x87 instructions
+ { "INVALID", { .src = None }, { .src = None }}, // TODO x87 instructions
+ { "INVALID", { .src = None }, { .src = None }}, // TODO x87 instructions
+ { "INVALID", { .src = None }, { .src = None }}, // TODO x87 instructions
+ { "INVALID", { .src = None }, { .src = None }}, // TODO x87 instructions
+ { "INVALID", { .src = None }, { .src = None }}, // TODO x87 instructions
+ { "INVALID", { .src = None }, { .src = None }}, // TODO x87 instructions
+ { "INVALID", { .src = None }, { .src = None }}, // TODO x87 instructions
+ { "INVALID", { .src = None }, { .src = None }}, // TODO x87 instructions
{ "LOOPNE/NZ", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
{ "LOOPE/Z", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
{ "LOOP", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
@@ -428,16 +428,16 @@ const struct opcode primary_opcode_map[256U] = {
{ "REP/E", { .src = TYPE_E, .type = TYPE_v}, { .src = ModRM_Reg, .type = TYPE_v }}, // TODO
{ "HLT", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
{ "CMC", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
- {}, // Group 3 opcode
- {}, // Group 3 opcode
+ { "INVALID", { .src = None }, { .src = None }}, // Group 3 opcode
+ { "INVALID", { .src = None }, { .src = None }}, // Group 3 opcode
{ "CLC", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
{ "STC", { .src = TYPE_E, .type = TYPE_v}, { .src = ModRM_Reg, .type = TYPE_v }}, // TODO
{ "CLI", { .src = TYPE_E, .type = TYPE_BYTE }, { .src = ModRM_Reg, .type = TYPE_BYTE }}, // TODO
{ "STI", { .src = TYPE_E, .type = TYPE_v}, { .src = ModRM_Reg, .type = TYPE_v }}, // TODO
{ "CLD", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
{ "STD", { .src = ModRM_Reg, .type = TYPE_v }, { .src = TYPE_E, .type = TYPE_v }}, // TODO
- {}, // Group 4 opcode
- {}, // Group 5 opcode
+ { "INVALID", { .src = None }, { .src = None }}, // Group 4 opcode
+ { "INVALID", { .src = None }, { .src = None }}, // Group 5 opcode
};
// TODO: Think about a smart way to retrieve groups opcodes
@@ -721,8 +721,10 @@ void unassemble(u8* start, u64 size) {
u8 legacy_prefixes_count = 0U;
u8 effective_operand_size = 32U; // 32 by default in 64bit mode
i32 effective_address = -1;
+ (void)effective_address; // Not used yet
u8 operand_size_override_66 = FALSE;
u8 operand_size_override_REX = FALSE;
+ (void)operand_size_override_REX; // Not used yet
u8 REX = 0U;
while (is_legacy_prefix(*current_byte) && legacy_prefixes_count < MAX_LEGACY_PREFIXES) {
if (*current_byte == 0x66) { // Override effective operand size