mirror of
https://github.com/zoriya/dasm.git
synced 2026-06-11 13:38:21 +00:00
Rework instructions size handling
This commit is contained in:
+96
-58
@@ -1,3 +1,4 @@
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
@@ -8,12 +9,10 @@ const char *registers8[] = { "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh" };
|
||||
const char *registers16[] = { "ax", "cx", "dx", "bx", "sp", "bp", "si", "di" };
|
||||
|
||||
|
||||
void print_rm_operand(instruction_t inst, unsigned raw, u_int8_t operand, bool is16bit)
|
||||
void print_rm_operand(unsigned inst_size, u_int8_t *binary, bool is16bit)
|
||||
{
|
||||
(void)inst;
|
||||
(void)raw;
|
||||
unsigned mod = operand >> 6;
|
||||
unsigned rm = operand & 0b111;
|
||||
unsigned mod = binary[1] >> 6;
|
||||
unsigned rm = binary[1] & 0b111;
|
||||
char disp[20] = {0};
|
||||
|
||||
if (mod == 0b11) {
|
||||
@@ -21,13 +20,15 @@ void print_rm_operand(instruction_t inst, unsigned raw, u_int8_t operand, bool i
|
||||
return;
|
||||
}
|
||||
|
||||
if (mod == 0b10 || (mod == 0 && rm == 0b110)) {
|
||||
// TODO: Understand how to retrieve disp low and high
|
||||
snprintf(disp, sizeof(disp), "+%02x", 0);
|
||||
if (mod == 0b10) {
|
||||
snprintf(disp, sizeof(disp), "+%04x", binary[inst_size - 1] | (binary[inst_size - 2] << 8));
|
||||
}
|
||||
if (mod == 0 && rm == 0b110) {
|
||||
snprintf(disp, sizeof(disp), "+%04x", (binary[inst_size - 1] << 8) | binary[inst_size - 2]);
|
||||
}
|
||||
if (mod == 0b01) {
|
||||
// TODO: Understand how to retrieve disp low and high
|
||||
// TODO: Here, the disp is signed.
|
||||
int8_t disp_v = binary[inst_size - 1];
|
||||
snprintf(disp, 20, "%c%x", disp_v < 0 ? '-' : '+', disp_v);
|
||||
}
|
||||
|
||||
switch (rm)
|
||||
@@ -43,49 +44,6 @@ void print_rm_operand(instruction_t inst, unsigned raw, u_int8_t operand, bool i
|
||||
}
|
||||
}
|
||||
|
||||
void print_instruction(unsigned addr, instruction_t inst, unsigned raw)
|
||||
{
|
||||
bool need_comma = strchr(inst.name, ' ');
|
||||
u_int8_t operand = raw & (0xFF << (inst.size - 2));
|
||||
printf("%04x: %0*x%-*s %s", addr, inst.size * 2, raw, 13 - inst.size * 2, "", inst.name);
|
||||
for (int i = 0; inst.mode[i] != END; i++) {
|
||||
if (need_comma)
|
||||
printf(", ");
|
||||
else
|
||||
printf(" ");
|
||||
need_comma = true;
|
||||
switch (inst.mode[i]) {
|
||||
case IMM8:
|
||||
printf("%02x", raw & 0xFF);
|
||||
break;
|
||||
case IMM16:
|
||||
printf("%02x%02x", raw & 0xFF, (raw & 0xFF00) >> 8);
|
||||
break;
|
||||
case REL8:
|
||||
printf("%02x", addr + inst.size - (raw & 0xFF));
|
||||
break;
|
||||
case REL16:
|
||||
printf("%04x", addr + inst.size - ((raw & 0xFF << 8) + (raw & 0xFF00 >> 8)));
|
||||
break;
|
||||
case REG8:
|
||||
printf("%s", registers8[(operand & 0b111000) >> 3]);
|
||||
break;
|
||||
case REG16:
|
||||
printf("%s", registers16[(operand & 0b111000) >> 3]);
|
||||
break;
|
||||
case R_M8:
|
||||
print_rm_operand(inst, raw, operand, false);
|
||||
break;
|
||||
case R_M16:
|
||||
print_rm_operand(inst, raw, operand, true);
|
||||
break;
|
||||
case END:
|
||||
break;
|
||||
}
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
unsigned read_size(u_int8_t *binary, unsigned size)
|
||||
{
|
||||
unsigned ret = binary[0];
|
||||
@@ -97,6 +55,48 @@ unsigned read_size(u_int8_t *binary, unsigned size)
|
||||
return ret;
|
||||
}
|
||||
|
||||
void print_instruction(unsigned addr, instruction_t inst, unsigned inst_size, u_int8_t *binary)
|
||||
{
|
||||
bool need_comma = strchr(inst.name, ' ');
|
||||
printf("%04x: %0*x%-*s %s", addr, inst_size * 2, read_size(binary, inst_size), 13 - inst_size * 2, "", inst.name);
|
||||
for (int i = 0; inst.mode[i] != END; i++) {
|
||||
if (need_comma)
|
||||
printf(", ");
|
||||
else
|
||||
printf(" ");
|
||||
need_comma = true;
|
||||
switch (inst.mode[i]) {
|
||||
case IMM8:
|
||||
printf("%02x", binary[inst_size - 1]);
|
||||
break;
|
||||
case IMM16:
|
||||
printf("%04x", (binary[inst_size - 1] << 8) | binary[inst_size - 2]);
|
||||
break;
|
||||
case REL8:
|
||||
printf("%02x", addr + inst_size - binary[inst_size - 1]);
|
||||
break;
|
||||
case REL16:
|
||||
printf("%04x", addr + inst_size - ((binary[inst_size - 1] << 8) | binary[inst_size - 2]));
|
||||
break;
|
||||
case REG8:
|
||||
printf("%s", registers8[(binary[1] & 0b111000) >> 3]);
|
||||
break;
|
||||
case REG16:
|
||||
printf("%s", registers16[(binary[1] & 0b111000) >> 3]);
|
||||
break;
|
||||
case R_M8:
|
||||
print_rm_operand(inst_size, binary, false);
|
||||
break;
|
||||
case R_M16:
|
||||
print_rm_operand(inst_size, binary, true);
|
||||
break;
|
||||
case END:
|
||||
break;
|
||||
}
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
instruction_t parse_inst(u_int8_t *binary, unsigned long size)
|
||||
{
|
||||
for (int i = 0; instructions[i].name; i++) {
|
||||
@@ -114,6 +114,44 @@ instruction_t parse_inst(u_int8_t *binary, unsigned long size)
|
||||
return invalid_instruction;
|
||||
}
|
||||
|
||||
unsigned get_inst_size(instruction_t inst, u_int8_t *binary, unsigned bin_size)
|
||||
{
|
||||
unsigned size = 1;
|
||||
bool has_extended_mod = false;
|
||||
for (int i = 0; inst.mode[i] != END; i++) {
|
||||
switch(inst.mode[i]) {
|
||||
case IMM8:
|
||||
case REL8:
|
||||
size += 1;
|
||||
break;
|
||||
case IMM16:
|
||||
case REL16:
|
||||
size += 2;
|
||||
break;
|
||||
case R_M8:
|
||||
case R_M16: {
|
||||
if (bin_size < 2)
|
||||
return 2;
|
||||
unsigned mod = binary[1] >> 6;
|
||||
unsigned rm = binary[1] & 0b111;
|
||||
if (mod == 0b01)
|
||||
size++;
|
||||
else if (mod == 0b10 || (mod == 0 && rm == 0b110))
|
||||
size += 2;
|
||||
has_extended_mod = true;
|
||||
break;
|
||||
}
|
||||
case REG16:
|
||||
case REG8:
|
||||
has_extended_mod = true;
|
||||
break;
|
||||
case END:
|
||||
break;
|
||||
}
|
||||
}
|
||||
return size + has_extended_mod;
|
||||
}
|
||||
|
||||
int dasm(u_int8_t *binary, unsigned long size)
|
||||
{
|
||||
unsigned long pc = 0;
|
||||
@@ -131,14 +169,14 @@ int dasm(u_int8_t *binary, unsigned long size)
|
||||
|
||||
while (pc < size) {
|
||||
instruction_t inst = parse_inst(binary, size - pc);
|
||||
if (pc + inst.size > size) {
|
||||
unsigned inst_size = get_inst_size(inst, binary, size - pc);
|
||||
if (pc + inst_size > size) {
|
||||
printf("Invalid file. Missing operand for instruction: '%s'. (pc: %lx)\n", inst.name, pc);
|
||||
return 1;
|
||||
}
|
||||
unsigned long raw = read_size(binary, inst.size);
|
||||
print_instruction(pc, inst, raw);
|
||||
pc += inst.size;
|
||||
binary += inst.size;
|
||||
print_instruction(pc, inst, inst_size, binary);
|
||||
pc += inst_size;
|
||||
binary += inst_size;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -38,7 +38,6 @@ typedef enum addressing_mode {
|
||||
typedef struct instruction {
|
||||
u_int8_t opcode;
|
||||
const char *name;
|
||||
unsigned size;
|
||||
addressing_mode_t mode[5];
|
||||
int extended;
|
||||
} instruction_t;
|
||||
|
||||
+237
-237
@@ -2,227 +2,227 @@
|
||||
#include "dasm.h"
|
||||
|
||||
const instruction_t instructions[] = {
|
||||
{.opcode = 0x00, .extended = -1, .name = "add", .mode = {R_M8, REG8, END}, .size = 2},
|
||||
{.opcode = 0x01, .extended = -1, .name = "add", .mode = {R_M16, REG16, END}, .size = 3},
|
||||
{.opcode = 0x02, .extended = -1, .name = "add", .mode = {REG8, R_M8, END}, .size = 2},
|
||||
{.opcode = 0x03, .extended = -1, .name = "add", .mode = {REG16, R_M16, END}, .size = 3},
|
||||
{.opcode = 0x04, .extended = -1, .name = "add al", .mode = {IMM8, END}, .size = 2},
|
||||
{.opcode = 0x05, .extended = -1, .name = "add ax", .mode = {IMM16, END}, .size = 3},
|
||||
{.opcode = 0x06, .extended = -1, .name = "push es", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x07, .extended = -1, .name = "pop es", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x08, .extended = -1, .name = "or", .mode = {R_M8, REG8, END}, .size = 2},
|
||||
{.opcode = 0x09, .extended = -1, .name = "or", .mode = {R_M16, REG16, END}, .size = 3},
|
||||
{.opcode = 0x0A, .extended = -1, .name = "or", .mode = {REG8, R_M8, END}, .size = 2},
|
||||
{.opcode = 0x0B, .extended = -1, .name = "or", .mode = {REG16, R_M16, END}, .size = 3},
|
||||
{.opcode = 0x0C, .extended = -1, .name = "or al", .mode = {IMM8, END}, .size = 2},
|
||||
{.opcode = 0x0D, .extended = -1, .name = "or ax", .mode = {IMM16, END}, .size = 3},
|
||||
{.opcode = 0x0E, .extended = -1, .name = "push cs", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x00, .extended = -1, .name = "add", .mode = {R_M8, REG8, END}},
|
||||
{.opcode = 0x01, .extended = -1, .name = "add", .mode = {R_M16, REG16, END}},
|
||||
{.opcode = 0x02, .extended = -1, .name = "add", .mode = {REG8, R_M8, END}},
|
||||
{.opcode = 0x03, .extended = -1, .name = "add", .mode = {REG16, R_M16, END}},
|
||||
{.opcode = 0x04, .extended = -1, .name = "add al", .mode = {IMM8, END}},
|
||||
{.opcode = 0x05, .extended = -1, .name = "add ax", .mode = {IMM16, END}},
|
||||
{.opcode = 0x06, .extended = -1, .name = "push es", .mode = {END}},
|
||||
{.opcode = 0x07, .extended = -1, .name = "pop es", .mode = {END}},
|
||||
{.opcode = 0x08, .extended = -1, .name = "or", .mode = {R_M8, REG8, END}},
|
||||
{.opcode = 0x09, .extended = -1, .name = "or", .mode = {R_M16, REG16, END}},
|
||||
{.opcode = 0x0A, .extended = -1, .name = "or", .mode = {REG8, R_M8, END}},
|
||||
{.opcode = 0x0B, .extended = -1, .name = "or", .mode = {REG16, R_M16, END}},
|
||||
{.opcode = 0x0C, .extended = -1, .name = "or al", .mode = {IMM8, END}},
|
||||
{.opcode = 0x0D, .extended = -1, .name = "or ax", .mode = {IMM16, END}},
|
||||
{.opcode = 0x0E, .extended = -1, .name = "push cs", .mode = {END}},
|
||||
|
||||
{.opcode = 0x10, .extended = -1, .name = "adc", .mode = {R_M8, REG8, END}, .size = 2},
|
||||
{.opcode = 0x11, .extended = -1, .name = "adc", .mode = {R_M16, REG16, END}, .size = 3},
|
||||
{.opcode = 0x12, .extended = -1, .name = "adc", .mode = {REG8, R_M8, END}, .size = 2},
|
||||
{.opcode = 0x13, .extended = -1, .name = "adc", .mode = {REG16, R_M16, END}, .size = 3},
|
||||
{.opcode = 0x14, .extended = -1, .name = "adc al", .mode = {IMM8, END}, .size = 2},
|
||||
{.opcode = 0x15, .extended = -1, .name = "adc ax", .mode = {IMM16, END}, .size = 3},
|
||||
{.opcode = 0x16, .extended = -1, .name = "push ss", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x17, .extended = -1, .name = "pop ss", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x18, .extended = -1, .name = "sbb", .mode = {R_M8, REG8, END}, .size = 2},
|
||||
{.opcode = 0x19, .extended = -1, .name = "sbb", .mode = {R_M16, REG16, END}, .size = 3},
|
||||
{.opcode = 0x1A, .extended = -1, .name = "sbb", .mode = {REG8, R_M8, END}, .size = 2},
|
||||
{.opcode = 0x1B, .extended = -1, .name = "sbb", .mode = {REG16, R_M16, END}, .size = 3},
|
||||
{.opcode = 0x1C, .extended = -1, .name = "sbb al", .mode = {IMM8, END}, .size = 2},
|
||||
{.opcode = 0x1D, .extended = -1, .name = "sbb ax", .mode = {IMM16, END}, .size = 3},
|
||||
{.opcode = 0x1E, .extended = -1, .name = "push ds", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x1F, .extended = -1, .name = "pop ds", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x20, .extended = -1, .name = "and", .mode = {R_M8, REG8, END}, .size = 2},
|
||||
{.opcode = 0x21, .extended = -1, .name = "and", .mode = {R_M16, REG16, END}, .size = 2},
|
||||
{.opcode = 0x22, .extended = -1, .name = "and", .mode = {REG8, R_M8, END}, .size = 2},
|
||||
{.opcode = 0x23, .extended = -1, .name = "and", .mode = {REG16, R_M16, END}, .size = 2},
|
||||
{.opcode = 0x24, .extended = -1, .name = "and al", .mode = {IMM8, END}, .size = 2},
|
||||
{.opcode = 0x25, .extended = -1, .name = "and ax", .mode = {IMM16, END}, .size = 3},
|
||||
{.opcode = 0x10, .extended = -1, .name = "adc", .mode = {R_M8, REG8, END}},
|
||||
{.opcode = 0x11, .extended = -1, .name = "adc", .mode = {R_M16, REG16, END}},
|
||||
{.opcode = 0x12, .extended = -1, .name = "adc", .mode = {REG8, R_M8, END}},
|
||||
{.opcode = 0x13, .extended = -1, .name = "adc", .mode = {REG16, R_M16, END}},
|
||||
{.opcode = 0x14, .extended = -1, .name = "adc al", .mode = {IMM8, END}},
|
||||
{.opcode = 0x15, .extended = -1, .name = "adc ax", .mode = {IMM16, END}},
|
||||
{.opcode = 0x16, .extended = -1, .name = "push ss", .mode = {END}},
|
||||
{.opcode = 0x17, .extended = -1, .name = "pop ss", .mode = {END}},
|
||||
{.opcode = 0x18, .extended = -1, .name = "sbb", .mode = {R_M8, REG8, END}},
|
||||
{.opcode = 0x19, .extended = -1, .name = "sbb", .mode = {R_M16, REG16, END}},
|
||||
{.opcode = 0x1A, .extended = -1, .name = "sbb", .mode = {REG8, R_M8, END}},
|
||||
{.opcode = 0x1B, .extended = -1, .name = "sbb", .mode = {REG16, R_M16, END}},
|
||||
{.opcode = 0x1C, .extended = -1, .name = "sbb al", .mode = {IMM8, END}},
|
||||
{.opcode = 0x1D, .extended = -1, .name = "sbb ax", .mode = {IMM16, END}},
|
||||
{.opcode = 0x1E, .extended = -1, .name = "push ds", .mode = {END}},
|
||||
{.opcode = 0x1F, .extended = -1, .name = "pop ds", .mode = {END}},
|
||||
{.opcode = 0x20, .extended = -1, .name = "and", .mode = {R_M8, REG8, END}},
|
||||
{.opcode = 0x21, .extended = -1, .name = "and", .mode = {R_M16, REG16, END}},
|
||||
{.opcode = 0x22, .extended = -1, .name = "and", .mode = {REG8, R_M8, END}},
|
||||
{.opcode = 0x23, .extended = -1, .name = "and", .mode = {REG16, R_M16, END}},
|
||||
{.opcode = 0x24, .extended = -1, .name = "and al", .mode = {IMM8, END}},
|
||||
{.opcode = 0x25, .extended = -1, .name = "and ax", .mode = {IMM16, END}},
|
||||
|
||||
{.opcode = 0x27, .extended = -1, .name = "daa", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x28, .extended = -1, .name = "sub", .mode = {R_M8, REG8, END}, .size = 2},
|
||||
{.opcode = 0x29, .extended = -1, .name = "sub", .mode = {R_M16, REG16, END}, .size = 2},
|
||||
{.opcode = 0x2A, .extended = -1, .name = "sub", .mode = {REG8, R_M8, END}, .size = 2},
|
||||
{.opcode = 0x2B, .extended = -1, .name = "sub", .mode = {REG16, R_M16, END}, .size = 2},
|
||||
{.opcode = 0x2C, .extended = -1, .name = "sub al", .mode = {IMM8, END}, .size = 2},
|
||||
{.opcode = 0x2D, .extended = -1, .name = "sub ax", .mode = {IMM16, END}, .size = 3},
|
||||
{.opcode = 0x27, .extended = -1, .name = "daa", .mode = {END}},
|
||||
{.opcode = 0x28, .extended = -1, .name = "sub", .mode = {R_M8, REG8, END}},
|
||||
{.opcode = 0x29, .extended = -1, .name = "sub", .mode = {R_M16, REG16, END}},
|
||||
{.opcode = 0x2A, .extended = -1, .name = "sub", .mode = {REG8, R_M8, END}},
|
||||
{.opcode = 0x2B, .extended = -1, .name = "sub", .mode = {REG16, R_M16, END}},
|
||||
{.opcode = 0x2C, .extended = -1, .name = "sub al", .mode = {IMM8, END}},
|
||||
{.opcode = 0x2D, .extended = -1, .name = "sub ax", .mode = {IMM16, END}},
|
||||
|
||||
{.opcode = 0x2F, .extended = -1, .name = "das", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x30, .extended = -1, .name = "xor", .mode = {R_M8, REG8, END}, .size = 2},
|
||||
{.opcode = 0x31, .extended = -1, .name = "xor", .mode = {R_M16, REG16, END}, .size = 2},
|
||||
{.opcode = 0x32, .extended = -1, .name = "xor", .mode = {REG8, R_M8, END}, .size = 2},
|
||||
{.opcode = 0x33, .extended = -1, .name = "xor", .mode = {REG16, R_M16, END}, .size = 2},
|
||||
{.opcode = 0x34, .extended = -1, .name = "xor al", .mode = {IMM8, END}, .size = 2},
|
||||
{.opcode = 0x35, .extended = -1, .name = "xor ax", .mode = {IMM16, END}, .size = 3},
|
||||
{.opcode = 0x2F, .extended = -1, .name = "das", .mode = {END}},
|
||||
{.opcode = 0x30, .extended = -1, .name = "xor", .mode = {R_M8, REG8, END}},
|
||||
{.opcode = 0x31, .extended = -1, .name = "xor", .mode = {R_M16, REG16, END}},
|
||||
{.opcode = 0x32, .extended = -1, .name = "xor", .mode = {REG8, R_M8, END}},
|
||||
{.opcode = 0x33, .extended = -1, .name = "xor", .mode = {REG16, R_M16, END}},
|
||||
{.opcode = 0x34, .extended = -1, .name = "xor al", .mode = {IMM8, END}},
|
||||
{.opcode = 0x35, .extended = -1, .name = "xor ax", .mode = {IMM16, END}},
|
||||
|
||||
{.opcode = 0x37, .extended = -1, .name = "aaa", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x38, .extended = -1, .name = "cmp", .mode = {R_M8, REG8, END}, .size = 2},
|
||||
{.opcode = 0x39, .extended = -1, .name = "cmp", .mode = {R_M16, REG16, END}, .size = 3},
|
||||
{.opcode = 0x3A, .extended = -1, .name = "cmp", .mode = {REG8, R_M8, END}, .size = 2},
|
||||
{.opcode = 0x3B, .extended = -1, .name = "cmp", .mode = {REG16, R_M16, END}, .size = 3},
|
||||
{.opcode = 0x3C, .extended = -1, .name = "cmp al", .mode = {IMM8, END}, .size = 2},
|
||||
{.opcode = 0x3D, .extended = -1, .name = "cmp ax", .mode = {IMM16, END}, .size = 3},
|
||||
{.opcode = 0x37, .extended = -1, .name = "aaa", .mode = {END}},
|
||||
{.opcode = 0x38, .extended = -1, .name = "cmp", .mode = {R_M8, REG8, END}},
|
||||
{.opcode = 0x39, .extended = -1, .name = "cmp", .mode = {R_M16, REG16, END}},
|
||||
{.opcode = 0x3A, .extended = -1, .name = "cmp", .mode = {REG8, R_M8, END}},
|
||||
{.opcode = 0x3B, .extended = -1, .name = "cmp", .mode = {REG16, R_M16, END}},
|
||||
{.opcode = 0x3C, .extended = -1, .name = "cmp al", .mode = {IMM8, END}},
|
||||
{.opcode = 0x3D, .extended = -1, .name = "cmp ax", .mode = {IMM16, END}},
|
||||
|
||||
{.opcode = 0x3F, .extended = -1, .name = "ass", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x40, .extended = -1, .name = "inc ax", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x41, .extended = -1, .name = "inc cx", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x42, .extended = -1, .name = "inc dx", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x43, .extended = -1, .name = "inc bx", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x44, .extended = -1, .name = "inc sp", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x45, .extended = -1, .name = "inc bp", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x46, .extended = -1, .name = "inc si", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x47, .extended = -1, .name = "inc di", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x48, .extended = -1, .name = "dec ax", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x49, .extended = -1, .name = "dec cx", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x4A, .extended = -1, .name = "dec dx", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x4B, .extended = -1, .name = "dec bx", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x4C, .extended = -1, .name = "dec sp", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x4D, .extended = -1, .name = "dec bp", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x4E, .extended = -1, .name = "dec si", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x4F, .extended = -1, .name = "dec di", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x50, .extended = -1, .name = "push ax", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x51, .extended = -1, .name = "push cx", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x52, .extended = -1, .name = "push dx", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x53, .extended = -1, .name = "push bx", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x54, .extended = -1, .name = "push sp", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x55, .extended = -1, .name = "push bp", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x56, .extended = -1, .name = "push si", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x57, .extended = -1, .name = "push di", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x58, .extended = -1, .name = "pop ax", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x59, .extended = -1, .name = "pop cx", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x5A, .extended = -1, .name = "pop dx", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x5B, .extended = -1, .name = "pop bx", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x5C, .extended = -1, .name = "pop sp", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x5D, .extended = -1, .name = "pop bp", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x5E, .extended = -1, .name = "pop si", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x5F, .extended = -1, .name = "pop di", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x70, .extended = -1, .name = "jo", .mode = {REL8, END}, .size = 2},
|
||||
{.opcode = 0x71, .extended = -1, .name = "jno", .mode = {REL8, END}, .size = 2},
|
||||
{.opcode = 0x72, .extended = -1, .name = "jc", .mode = {REL8, END}, .size = 2},
|
||||
{.opcode = 0x73, .extended = -1, .name = "jnc", .mode = {REL8, END}, .size = 2},
|
||||
{.opcode = 0x74, .extended = -1, .name = "jz", .mode = {REL8, END}, .size = 2},
|
||||
{.opcode = 0x75, .extended = -1, .name = "jnz", .mode = {REL8, END}, .size = 2},
|
||||
{.opcode = 0x76, .extended = -1, .name = "jna", .mode = {REL8, END}, .size = 2},
|
||||
{.opcode = 0x77, .extended = -1, .name = "ja", .mode = {REL8, END}, .size = 2},
|
||||
{.opcode = 0x78, .extended = -1, .name = "js", .mode = {REL8, END}, .size = 2},
|
||||
{.opcode = 0x79, .extended = -1, .name = "jns", .mode = {REL8, END}, .size = 2},
|
||||
{.opcode = 0x7A, .extended = -1, .name = "jpe", .mode = {REL8, END}, .size = 2},
|
||||
{.opcode = 0x7B, .extended = -1, .name = "jpo", .mode = {REL8, END}, .size = 2},
|
||||
{.opcode = 0x7C, .extended = -1, .name = "jl", .mode = {REL8, END}, .size = 2},
|
||||
{.opcode = 0x7D, .extended = -1, .name = "jnl", .mode = {REL8, END}, .size = 2},
|
||||
{.opcode = 0x7E, .extended = -1, .name = "jng", .mode = {REL8, END}, .size = 2},
|
||||
{.opcode = 0x7F, .extended = -1, .name = "jg", .mode = {REL8, END}, .size = 2},
|
||||
{.opcode = 0x80, .extended = 0, .name = "EXTENDED", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x81, .extended = 1, .name = "EXTENDED", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x83, .extended = 2, .name = "EXTENDED", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x84, .extended = -1, .name = "test", .mode = {R_M8, REG8, END}, .size = 2},
|
||||
{.opcode = 0x85, .extended = -1, .name = "test", .mode = {R_M16, REG16, END}, .size = 3},
|
||||
{.opcode = 0x86, .extended = -1, .name = "xchg", .mode = {R_M8, REG8, END}, .size = 2},
|
||||
{.opcode = 0x87, .extended = -1, .name = "xchg", .mode = {R_M16, REG16, END}, .size = 3},
|
||||
{.opcode = 0x88, .extended = -1, .name = "mov", .mode = {R_M8, REG8, END}, .size = 2},
|
||||
{.opcode = 0x89, .extended = -1, .name = "mov", .mode = {R_M16, REG16, END}, .size = 2},
|
||||
{.opcode = 0x8A, .extended = -1, .name = "mov", .mode = {REG8, R_M8, END}, .size = 2},
|
||||
{.opcode = 0x8B, .extended = -1, .name = "mov", .mode = {REG16, R_M16, END}, .size = 3},
|
||||
// {.opcode = 0x8C, .extended = -1, .name = "mov", .mode = {R_M16, sreg, END}, .size = 3},
|
||||
{.opcode = 0x8D, .extended = -1, .name = "lea", .mode = {REG16, R_M16, END}, .size = 3},
|
||||
// {.opcode = 0x8E, .extended = -1, .name = "mov", .mode = {sreg, R_M16, END}, .size = 3},
|
||||
{.opcode = 0x8F, .extended = -1, .name = "pop", .mode = {R_M16, END}, .size = 3},
|
||||
{.opcode = 0x90, .extended = -1, .name = "xchg ax,ax", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x91, .extended = -1, .name = "xchg cx,ax", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x92, .extended = -1, .name = "xchg dx,ax", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x93, .extended = -1, .name = "xchg bx,ax", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x94, .extended = -1, .name = "xchg sp,ax", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x95, .extended = -1, .name = "xchg bp,ax", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x96, .extended = -1, .name = "xchg si,ax", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x97, .extended = -1, .name = "xchg di,ax", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x98, .extended = -1, .name = "cbw", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x99, .extended = -1, .name = "cwd", .mode = {END}, .size = 1},
|
||||
// {.opcode = 0x9A, .extended = -1, .name = "call", .mode = {CALL_INTER, END}, .size = 1},
|
||||
{.opcode = 0x9B, .extended = -1, .name = "wait", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x9C, .extended = -1, .name = "pushf", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x9D, .extended = -1, .name = "popf", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x9E, .extended = -1, .name = "sahf", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x9F, .extended = -1, .name = "lahf", .mode = {END}, .size = 1},
|
||||
// {.opcode = 0xA0, .extended = -1, .name = "mov al,%s", .mode = {moffs16, END}, .size = 1},
|
||||
// {.opcode = 0xA1, .extended = -1, .name = "mov ax,%s", .mode = {moffs16, END}, .size = 1},
|
||||
// {.opcode = 0xA2, .extended = -1, .name = "mov %s,al", .mode = {moffs16, END}, .size = 1},
|
||||
// {.opcode = 0xA3, .extended = -1, .name = "mov %s,ax", .mode = {moffs16, END}, .size = 1},
|
||||
{.opcode = 0xA4, .extended = -1, .name = "movsb", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xA5, .extended = -1, .name = "movsw", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xA6, .extended = -1, .name = "cmpsb", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xA7, .extended = -1, .name = "cmpsw", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xA8, .extended = -1, .name = "test al,", .mode = {IMM8, END}, .size = 2},
|
||||
{.opcode = 0xA9, .extended = -1, .name = "test ax,", .mode = {IMM16, END}, .size = 3},
|
||||
{.opcode = 0xAA, .extended = -1, .name = "stosb", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xAB, .extended = -1, .name = "stosw", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xAC, .extended = -1, .name = "lodsb", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xAD, .extended = -1, .name = "lodsw", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xAE, .extended = -1, .name = "scasb", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xAF, .extended = -1, .name = "scasw", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xB0, .extended = -1, .name = "mov al", .mode = {IMM8, END}, .size = 2},
|
||||
{.opcode = 0xB1, .extended = -1, .name = "mov cl", .mode = {IMM8, END}, .size = 2},
|
||||
{.opcode = 0xB2, .extended = -1, .name = "mov dl", .mode = {IMM8, END}, .size = 2},
|
||||
{.opcode = 0xB3, .extended = -1, .name = "mov bl", .mode = {IMM8, END}, .size = 2},
|
||||
{.opcode = 0xB4, .extended = -1, .name = "mov ah", .mode = {IMM8, END}, .size = 2},
|
||||
{.opcode = 0xB5, .extended = -1, .name = "mov ch", .mode = {IMM8, END}, .size = 2},
|
||||
{.opcode = 0xB6, .extended = -1, .name = "mov dh", .mode = {IMM8, END}, .size = 2},
|
||||
{.opcode = 0xB7, .extended = -1, .name = "mov bh", .mode = {IMM8, END}, .size = 2},
|
||||
{.opcode = 0xB8, .extended = -1, .name = "mov ax", .mode = {IMM16, END}, .size = 3},
|
||||
{.opcode = 0xB9, .extended = -1, .name = "mov cx", .mode = {IMM16, END}, .size = 3},
|
||||
{.opcode = 0xBA, .extended = -1, .name = "mov dx", .mode = {IMM16, END}, .size = 3},
|
||||
{.opcode = 0xBB, .extended = -1, .name = "mov bx", .mode = {IMM16, END}, .size = 3},
|
||||
{.opcode = 0xBC, .extended = -1, .name = "mov sp", .mode = {IMM16, END}, .size = 3},
|
||||
{.opcode = 0xBD, .extended = -1, .name = "mov bp", .mode = {IMM16, END}, .size = 3},
|
||||
{.opcode = 0xBE, .extended = -1, .name = "mov si", .mode = {IMM16, END}, .size = 3},
|
||||
{.opcode = 0xBF, .extended = -1, .name = "mov di", .mode = {IMM16, END}, .size = 3},
|
||||
{.opcode = 0x3F, .extended = -1, .name = "ass", .mode = {END}},
|
||||
{.opcode = 0x40, .extended = -1, .name = "inc ax", .mode = {END}},
|
||||
{.opcode = 0x41, .extended = -1, .name = "inc cx", .mode = {END}},
|
||||
{.opcode = 0x42, .extended = -1, .name = "inc dx", .mode = {END}},
|
||||
{.opcode = 0x43, .extended = -1, .name = "inc bx", .mode = {END}},
|
||||
{.opcode = 0x44, .extended = -1, .name = "inc sp", .mode = {END}},
|
||||
{.opcode = 0x45, .extended = -1, .name = "inc bp", .mode = {END}},
|
||||
{.opcode = 0x46, .extended = -1, .name = "inc si", .mode = {END}},
|
||||
{.opcode = 0x47, .extended = -1, .name = "inc di", .mode = {END}},
|
||||
{.opcode = 0x48, .extended = -1, .name = "dec ax", .mode = {END}},
|
||||
{.opcode = 0x49, .extended = -1, .name = "dec cx", .mode = {END}},
|
||||
{.opcode = 0x4A, .extended = -1, .name = "dec dx", .mode = {END}},
|
||||
{.opcode = 0x4B, .extended = -1, .name = "dec bx", .mode = {END}},
|
||||
{.opcode = 0x4C, .extended = -1, .name = "dec sp", .mode = {END}},
|
||||
{.opcode = 0x4D, .extended = -1, .name = "dec bp", .mode = {END}},
|
||||
{.opcode = 0x4E, .extended = -1, .name = "dec si", .mode = {END}},
|
||||
{.opcode = 0x4F, .extended = -1, .name = "dec di", .mode = {END}},
|
||||
{.opcode = 0x50, .extended = -1, .name = "push ax", .mode = {END}},
|
||||
{.opcode = 0x51, .extended = -1, .name = "push cx", .mode = {END}},
|
||||
{.opcode = 0x52, .extended = -1, .name = "push dx", .mode = {END}},
|
||||
{.opcode = 0x53, .extended = -1, .name = "push bx", .mode = {END}},
|
||||
{.opcode = 0x54, .extended = -1, .name = "push sp", .mode = {END}},
|
||||
{.opcode = 0x55, .extended = -1, .name = "push bp", .mode = {END}},
|
||||
{.opcode = 0x56, .extended = -1, .name = "push si", .mode = {END}},
|
||||
{.opcode = 0x57, .extended = -1, .name = "push di", .mode = {END}},
|
||||
{.opcode = 0x58, .extended = -1, .name = "pop ax", .mode = {END}},
|
||||
{.opcode = 0x59, .extended = -1, .name = "pop cx", .mode = {END}},
|
||||
{.opcode = 0x5A, .extended = -1, .name = "pop dx", .mode = {END}},
|
||||
{.opcode = 0x5B, .extended = -1, .name = "pop bx", .mode = {END}},
|
||||
{.opcode = 0x5C, .extended = -1, .name = "pop sp", .mode = {END}},
|
||||
{.opcode = 0x5D, .extended = -1, .name = "pop bp", .mode = {END}},
|
||||
{.opcode = 0x5E, .extended = -1, .name = "pop si", .mode = {END}},
|
||||
{.opcode = 0x5F, .extended = -1, .name = "pop di", .mode = {END}},
|
||||
{.opcode = 0x70, .extended = -1, .name = "jo", .mode = {REL8, END}},
|
||||
{.opcode = 0x71, .extended = -1, .name = "jno", .mode = {REL8, END}},
|
||||
{.opcode = 0x72, .extended = -1, .name = "jc", .mode = {REL8, END}},
|
||||
{.opcode = 0x73, .extended = -1, .name = "jnc", .mode = {REL8, END}},
|
||||
{.opcode = 0x74, .extended = -1, .name = "jz", .mode = {REL8, END}},
|
||||
{.opcode = 0x75, .extended = -1, .name = "jnz", .mode = {REL8, END}},
|
||||
{.opcode = 0x76, .extended = -1, .name = "jna", .mode = {REL8, END}},
|
||||
{.opcode = 0x77, .extended = -1, .name = "ja", .mode = {REL8, END}},
|
||||
{.opcode = 0x78, .extended = -1, .name = "js", .mode = {REL8, END}},
|
||||
{.opcode = 0x79, .extended = -1, .name = "jns", .mode = {REL8, END}},
|
||||
{.opcode = 0x7A, .extended = -1, .name = "jpe", .mode = {REL8, END}},
|
||||
{.opcode = 0x7B, .extended = -1, .name = "jpo", .mode = {REL8, END}},
|
||||
{.opcode = 0x7C, .extended = -1, .name = "jl", .mode = {REL8, END}},
|
||||
{.opcode = 0x7D, .extended = -1, .name = "jnl", .mode = {REL8, END}},
|
||||
{.opcode = 0x7E, .extended = -1, .name = "jng", .mode = {REL8, END}},
|
||||
{.opcode = 0x7F, .extended = -1, .name = "jg", .mode = {REL8, END}},
|
||||
{.opcode = 0x80, .extended = 0, .name = "EXTENDED", .mode = {END}},
|
||||
{.opcode = 0x81, .extended = 1, .name = "EXTENDED", .mode = {END}},
|
||||
{.opcode = 0x83, .extended = 2, .name = "EXTENDED", .mode = {END}},
|
||||
{.opcode = 0x84, .extended = -1, .name = "test", .mode = {R_M8, REG8, END}},
|
||||
{.opcode = 0x85, .extended = -1, .name = "test", .mode = {R_M16, REG16, END}},
|
||||
{.opcode = 0x86, .extended = -1, .name = "xchg", .mode = {R_M8, REG8, END}},
|
||||
{.opcode = 0x87, .extended = -1, .name = "xchg", .mode = {R_M16, REG16, END}},
|
||||
{.opcode = 0x88, .extended = -1, .name = "mov", .mode = {R_M8, REG8, END}},
|
||||
{.opcode = 0x89, .extended = -1, .name = "mov", .mode = {R_M16, REG16, END}},
|
||||
{.opcode = 0x8A, .extended = -1, .name = "mov", .mode = {REG8, R_M8, END}},
|
||||
{.opcode = 0x8B, .extended = -1, .name = "mov", .mode = {REG16, R_M16, END}},
|
||||
// {.opcode = 0x8C, .extended = -1, .name = "mov", .mode = {R_M16, sreg, END}},
|
||||
{.opcode = 0x8D, .extended = -1, .name = "lea", .mode = {REG16, R_M16, END}},
|
||||
// {.opcode = 0x8E, .extended = -1, .name = "mov", .mode = {sreg, R_M16, END}},
|
||||
{.opcode = 0x8F, .extended = -1, .name = "pop", .mode = {R_M16, END}},
|
||||
{.opcode = 0x90, .extended = -1, .name = "xchg ax,ax", .mode = {END}},
|
||||
{.opcode = 0x91, .extended = -1, .name = "xchg cx,ax", .mode = {END}},
|
||||
{.opcode = 0x92, .extended = -1, .name = "xchg dx,ax", .mode = {END}},
|
||||
{.opcode = 0x93, .extended = -1, .name = "xchg bx,ax", .mode = {END}},
|
||||
{.opcode = 0x94, .extended = -1, .name = "xchg sp,ax", .mode = {END}},
|
||||
{.opcode = 0x95, .extended = -1, .name = "xchg bp,ax", .mode = {END}},
|
||||
{.opcode = 0x96, .extended = -1, .name = "xchg si,ax", .mode = {END}},
|
||||
{.opcode = 0x97, .extended = -1, .name = "xchg di,ax", .mode = {END}},
|
||||
{.opcode = 0x98, .extended = -1, .name = "cbw", .mode = {END}},
|
||||
{.opcode = 0x99, .extended = -1, .name = "cwd", .mode = {END}},
|
||||
// {.opcode = 0x9A, .extended = -1, .name = "call", .mode = {CALL_INTER, END}},
|
||||
{.opcode = 0x9B, .extended = -1, .name = "wait", .mode = {END}},
|
||||
{.opcode = 0x9C, .extended = -1, .name = "pushf", .mode = {END}},
|
||||
{.opcode = 0x9D, .extended = -1, .name = "popf", .mode = {END}},
|
||||
{.opcode = 0x9E, .extended = -1, .name = "sahf", .mode = {END}},
|
||||
{.opcode = 0x9F, .extended = -1, .name = "lahf", .mode = {END}},
|
||||
// {.opcode = 0xA0, .extended = -1, .name = "mov al,%s", .mode = {moffs16, END}},
|
||||
// {.opcode = 0xA1, .extended = -1, .name = "mov ax,%s", .mode = {moffs16, END}},
|
||||
// {.opcode = 0xA2, .extended = -1, .name = "mov %s,al", .mode = {moffs16, END}},
|
||||
// {.opcode = 0xA3, .extended = -1, .name = "mov %s,ax", .mode = {moffs16, END}},
|
||||
{.opcode = 0xA4, .extended = -1, .name = "movsb", .mode = {END}},
|
||||
{.opcode = 0xA5, .extended = -1, .name = "movsw", .mode = {END}},
|
||||
{.opcode = 0xA6, .extended = -1, .name = "cmpsb", .mode = {END}},
|
||||
{.opcode = 0xA7, .extended = -1, .name = "cmpsw", .mode = {END}},
|
||||
{.opcode = 0xA8, .extended = -1, .name = "test al,", .mode = {IMM8, END}},
|
||||
{.opcode = 0xA9, .extended = -1, .name = "test ax,", .mode = {IMM16, END}},
|
||||
{.opcode = 0xAA, .extended = -1, .name = "stosb", .mode = {END}},
|
||||
{.opcode = 0xAB, .extended = -1, .name = "stosw", .mode = {END}},
|
||||
{.opcode = 0xAC, .extended = -1, .name = "lodsb", .mode = {END}},
|
||||
{.opcode = 0xAD, .extended = -1, .name = "lodsw", .mode = {END}},
|
||||
{.opcode = 0xAE, .extended = -1, .name = "scasb", .mode = {END}},
|
||||
{.opcode = 0xAF, .extended = -1, .name = "scasw", .mode = {END}},
|
||||
{.opcode = 0xB0, .extended = -1, .name = "mov al", .mode = {IMM8, END}},
|
||||
{.opcode = 0xB1, .extended = -1, .name = "mov cl", .mode = {IMM8, END}},
|
||||
{.opcode = 0xB2, .extended = -1, .name = "mov dl", .mode = {IMM8, END}},
|
||||
{.opcode = 0xB3, .extended = -1, .name = "mov bl", .mode = {IMM8, END}},
|
||||
{.opcode = 0xB4, .extended = -1, .name = "mov ah", .mode = {IMM8, END}},
|
||||
{.opcode = 0xB5, .extended = -1, .name = "mov ch", .mode = {IMM8, END}},
|
||||
{.opcode = 0xB6, .extended = -1, .name = "mov dh", .mode = {IMM8, END}},
|
||||
{.opcode = 0xB7, .extended = -1, .name = "mov bh", .mode = {IMM8, END}},
|
||||
{.opcode = 0xB8, .extended = -1, .name = "mov ax", .mode = {IMM16, END}},
|
||||
{.opcode = 0xB9, .extended = -1, .name = "mov cx", .mode = {IMM16, END}},
|
||||
{.opcode = 0xBA, .extended = -1, .name = "mov dx", .mode = {IMM16, END}},
|
||||
{.opcode = 0xBB, .extended = -1, .name = "mov bx", .mode = {IMM16, END}},
|
||||
{.opcode = 0xBC, .extended = -1, .name = "mov sp", .mode = {IMM16, END}},
|
||||
{.opcode = 0xBD, .extended = -1, .name = "mov bp", .mode = {IMM16, END}},
|
||||
{.opcode = 0xBE, .extended = -1, .name = "mov si", .mode = {IMM16, END}},
|
||||
{.opcode = 0xBF, .extended = -1, .name = "mov di", .mode = {IMM16, END}},
|
||||
|
||||
{.opcode = 0xC2, .extended = -1, .name = "ret", .mode = {IMM16, END}, .size = 3},
|
||||
{.opcode = 0xC3, .extended = -1, .name = "ret", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xC4, .extended = -1, .name = "les", .mode = {REG16, R_M16, END}, .size = 3},
|
||||
{.opcode = 0xC5, .extended = -1, .name = "lds", .mode = {R_M16, REG16, END}, .size = 3},
|
||||
{.opcode = 0xC6, .extended = -1, .name = "mov", .mode = {R_M16, IMM8, END}, .size = 4},
|
||||
{.opcode = 0xC7, .extended = -1, .name = "mov", .mode = {R_M16, IMM16, END}, .size = 5},
|
||||
{.opcode = 0xCA, .extended = -1, .name = "retf", .mode = {IMM16, END}, .size = 3},
|
||||
{.opcode = 0xCB, .extended = -1, .name = "retf", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xCC, .extended = -1, .name = "int3", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xCD, .extended = -1, .name = "int", .mode = {IMM8, END}, .size = 2},
|
||||
{.opcode = 0xCE, .extended = -1, .name = "into", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xCF, .extended = -1, .name = "iret", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xC2, .extended = -1, .name = "ret", .mode = {IMM16, END}},
|
||||
{.opcode = 0xC3, .extended = -1, .name = "ret", .mode = {END}},
|
||||
{.opcode = 0xC4, .extended = -1, .name = "les", .mode = {REG16, R_M16, END}},
|
||||
{.opcode = 0xC5, .extended = -1, .name = "lds", .mode = {R_M16, REG16, END}},
|
||||
{.opcode = 0xC6, .extended = -1, .name = "mov", .mode = {R_M16, IMM8, END}},
|
||||
{.opcode = 0xC7, .extended = -1, .name = "mov", .mode = {R_M16, IMM16, END}},
|
||||
{.opcode = 0xCA, .extended = -1, .name = "retf", .mode = {IMM16, END}},
|
||||
{.opcode = 0xCB, .extended = -1, .name = "retf", .mode = {END}},
|
||||
{.opcode = 0xCC, .extended = -1, .name = "int3", .mode = {END}},
|
||||
{.opcode = 0xCD, .extended = -1, .name = "int", .mode = {IMM8, END}},
|
||||
{.opcode = 0xCE, .extended = -1, .name = "into", .mode = {END}},
|
||||
{.opcode = 0xCF, .extended = -1, .name = "iret", .mode = {END}},
|
||||
|
||||
{.opcode = 0xD4, .extended = -1, .name = "aam", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xD5, .extended = -1, .name = "aad", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xD7, .extended = -1, .name = "xlatb", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xD4, .extended = -1, .name = "aam", .mode = {END}},
|
||||
{.opcode = 0xD5, .extended = -1, .name = "aad", .mode = {END}},
|
||||
{.opcode = 0xD7, .extended = -1, .name = "xlatb", .mode = {END}},
|
||||
|
||||
{.opcode = 0xE0, .extended = -1, .name = "loopne", .mode = {REL8, END}, .size = 2},
|
||||
{.opcode = 0xE1, .extended = -1, .name = "loope", .mode = {REL8, END}, .size = 2},
|
||||
{.opcode = 0xE2, .extended = -1, .name = "loop", .mode = {REL8, END}, .size = 2},
|
||||
{.opcode = 0xE3, .extended = -1, .name = "jcxz", .mode = {REL8, END}, .size = 2},
|
||||
{.opcode = 0xE4, .extended = -1, .name = "in al,%s", .mode = {IMM8, END}, .size = 2},
|
||||
{.opcode = 0xE5, .extended = -1, .name = "in ax,%s", .mode = {IMM8, END}, .size = 2},
|
||||
{.opcode = 0xE6, .extended = -1, .name = "out %s,al", .mode = {IMM8, END}, .size = 2},
|
||||
{.opcode = 0xE7, .extended = -1, .name = "out %s,ax", .mode = {IMM8, END}, .size = 2},
|
||||
{.opcode = 0xE8, .extended = -1, .name = "call", .mode = {REL16, END}, .size = 3},
|
||||
{.opcode = 0xE9, .extended = -1, .name = "jmp", .mode = {REL16, END}, .size = 3},
|
||||
// {.opcode = 0xEA, .extended = -1, .name = "jmp", .mode = {CALL_INTER, END}, .size = 1},
|
||||
{.opcode = 0xEB, .extended = -1, .name = "jmp short", .mode = {REL8, END}, .size = 2},
|
||||
{.opcode = 0xEC, .extended = -1, .name = "in al,dx", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xED, .extended = -1, .name = "in ax,dx", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xEE, .extended = -1, .name = "out dx,al", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xEF, .extended = -1, .name = "out dx,ax", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xF0, .extended = -1, .name = "lock", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xF2, .extended = -1, .name = "repne", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xF3, .extended = -1, .name = "rep", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xF4, .extended = -1, .name = "hlt", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xF5, .extended = -1, .name = "cmc", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xE0, .extended = -1, .name = "loopne", .mode = {REL8, END}},
|
||||
{.opcode = 0xE1, .extended = -1, .name = "loope", .mode = {REL8, END}},
|
||||
{.opcode = 0xE2, .extended = -1, .name = "loop", .mode = {REL8, END}},
|
||||
{.opcode = 0xE3, .extended = -1, .name = "jcxz", .mode = {REL8, END}},
|
||||
{.opcode = 0xE4, .extended = -1, .name = "in al,%s", .mode = {IMM8, END}},
|
||||
{.opcode = 0xE5, .extended = -1, .name = "in ax,%s", .mode = {IMM8, END}},
|
||||
{.opcode = 0xE6, .extended = -1, .name = "out %s,al", .mode = {IMM8, END}},
|
||||
{.opcode = 0xE7, .extended = -1, .name = "out %s,ax", .mode = {IMM8, END}},
|
||||
{.opcode = 0xE8, .extended = -1, .name = "call", .mode = {REL16, END}},
|
||||
{.opcode = 0xE9, .extended = -1, .name = "jmp", .mode = {REL16, END}},
|
||||
// {.opcode = 0xEA, .extended = -1, .name = "jmp", .mode = {CALL_INTER, END}},
|
||||
{.opcode = 0xEB, .extended = -1, .name = "jmp short", .mode = {REL8, END}},
|
||||
{.opcode = 0xEC, .extended = -1, .name = "in al,dx", .mode = {END}},
|
||||
{.opcode = 0xED, .extended = -1, .name = "in ax,dx", .mode = {END}},
|
||||
{.opcode = 0xEE, .extended = -1, .name = "out dx,al", .mode = {END}},
|
||||
{.opcode = 0xEF, .extended = -1, .name = "out dx,ax", .mode = {END}},
|
||||
{.opcode = 0xF0, .extended = -1, .name = "lock", .mode = {END}},
|
||||
{.opcode = 0xF2, .extended = -1, .name = "repne", .mode = {END}},
|
||||
{.opcode = 0xF3, .extended = -1, .name = "rep", .mode = {END}},
|
||||
{.opcode = 0xF4, .extended = -1, .name = "hlt", .mode = {END}},
|
||||
{.opcode = 0xF5, .extended = -1, .name = "cmc", .mode = {END}},
|
||||
|
||||
{.opcode = 0xF8, .extended = -1, .name = "clc", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xF9, .extended = -1, .name = "stc", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xFA, .extended = -1, .name = "cli", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xFB, .extended = -1, .name = "sti", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xFC, .extended = -1, .name = "cld", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xFD, .extended = -1, .name = "std", .mode = {END}, .size = 1},
|
||||
{.opcode = 0xF8, .extended = -1, .name = "clc", .mode = {END}},
|
||||
{.opcode = 0xF9, .extended = -1, .name = "stc", .mode = {END}},
|
||||
{.opcode = 0xFA, .extended = -1, .name = "cli", .mode = {END}},
|
||||
{.opcode = 0xFB, .extended = -1, .name = "sti", .mode = {END}},
|
||||
{.opcode = 0xFC, .extended = -1, .name = "cld", .mode = {END}},
|
||||
{.opcode = 0xFD, .extended = -1, .name = "std", .mode = {END}},
|
||||
|
||||
{.name = NULL}
|
||||
};
|
||||
@@ -230,38 +230,38 @@ const instruction_t instructions[] = {
|
||||
const instruction_t extended[][8] = {
|
||||
// 0x80 extended
|
||||
{
|
||||
{.opcode = 0x00, .extended = -1, .name = "add", .mode = {R_M8, IMM8, END}, .size = 2},
|
||||
{.opcode = 0x01, .extended = -1, .name = "or", .mode = {R_M8, IMM8, END}, .size = 2},
|
||||
{.opcode = 0x02, .extended = -1, .name = "adc", .mode = {R_M8, IMM8, END}, .size = 2},
|
||||
{.opcode = 0x03, .extended = -1, .name = "sbb", .mode = {R_M8, IMM8, END}, .size = 2},
|
||||
{.opcode = 0x04, .extended = -1, .name = "and", .mode = {R_M8, IMM8, END}, .size = 2},
|
||||
{.opcode = 0x05, .extended = -1, .name = "sub", .mode = {R_M8, IMM8, END}, .size = 2},
|
||||
{.opcode = 0x06, .extended = -1, .name = "xor", .mode = {R_M8, IMM8, END}, .size = 2},
|
||||
{.opcode = 0x07, .extended = -1, .name = "cmp", .mode = {R_M8, IMM8, END}, .size = 2},
|
||||
{.opcode = 0x00, .extended = -2, .name = "add", .mode = {R_M8, IMM8, END}},
|
||||
{.opcode = 0x01, .extended = -2, .name = "or", .mode = {R_M8, IMM8, END}},
|
||||
{.opcode = 0x02, .extended = -2, .name = "adc", .mode = {R_M8, IMM8, END}},
|
||||
{.opcode = 0x03, .extended = -2, .name = "sbb", .mode = {R_M8, IMM8, END}},
|
||||
{.opcode = 0x04, .extended = -2, .name = "and", .mode = {R_M8, IMM8, END}},
|
||||
{.opcode = 0x05, .extended = -2, .name = "sub", .mode = {R_M8, IMM8, END}},
|
||||
{.opcode = 0x06, .extended = -2, .name = "xor", .mode = {R_M8, IMM8, END}},
|
||||
{.opcode = 0x07, .extended = -2, .name = "cmp", .mode = {R_M8, IMM8, END}},
|
||||
},
|
||||
// 0x81 extended
|
||||
{
|
||||
{.opcode = 0x00, .extended = -1, .name = "add", .mode = {R_M16, IMM16, END}, .size = 3},
|
||||
{.opcode = 0x01, .extended = -1, .name = "or", .mode = {R_M16, IMM16, END}, .size = 3},
|
||||
{.opcode = 0x02, .extended = -1, .name = "adc", .mode = {R_M16, IMM16, END}, .size = 3},
|
||||
{.opcode = 0x03, .extended = -1, .name = "sbb", .mode = {R_M16, IMM16, END}, .size = 3},
|
||||
{.opcode = 0x04, .extended = -1, .name = "and", .mode = {R_M16, IMM16, END}, .size = 3},
|
||||
{.opcode = 0x05, .extended = -1, .name = "sub", .mode = {R_M16, IMM16, END}, .size = 3},
|
||||
{.opcode = 0x06, .extended = -1, .name = "xor", .mode = {R_M16, IMM16, END}, .size = 3},
|
||||
{.opcode = 0x07, .extended = -1, .name = "cmp", .mode = {R_M16, IMM16, END}, .size = 3},
|
||||
{.opcode = 0x00, .extended = -2, .name = "add", .mode = {R_M16, IMM16, END}},
|
||||
{.opcode = 0x01, .extended = -2, .name = "or", .mode = {R_M16, IMM16, END}},
|
||||
{.opcode = 0x02, .extended = -2, .name = "adc", .mode = {R_M16, IMM16, END}},
|
||||
{.opcode = 0x03, .extended = -2, .name = "sbb", .mode = {R_M16, IMM16, END}},
|
||||
{.opcode = 0x04, .extended = -2, .name = "and", .mode = {R_M16, IMM16, END}},
|
||||
{.opcode = 0x05, .extended = -2, .name = "sub", .mode = {R_M16, IMM16, END}},
|
||||
{.opcode = 0x06, .extended = -2, .name = "xor", .mode = {R_M16, IMM16, END}},
|
||||
{.opcode = 0x07, .extended = -2, .name = "cmp", .mode = {R_M16, IMM16, END}},
|
||||
},
|
||||
// 0x83 extended
|
||||
{
|
||||
{.opcode = 0x00, .extended = -1, .name = "add", .mode = {R_M16, IMM8, END}, .size = 3},
|
||||
{.opcode = 0x01, .extended = -1, .name = "invalid", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x02, .extended = -1, .name = "adc", .mode = {R_M16, IMM8, END}, .size = 3},
|
||||
{.opcode = 0x03, .extended = -1, .name = "sbb", .mode = {R_M16, IMM8, END}, .size = 3},
|
||||
{.opcode = 0x04, .extended = -1, .name = "invalid", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x05, .extended = -1, .name = "sub", .mode = {R_M16, IMM8, END}, .size = 3},
|
||||
{.opcode = 0x06, .extended = -1, .name = "invalid", .mode = {END}, .size = 1},
|
||||
{.opcode = 0x07, .extended = -1, .name = "cmp", .mode = {R_M16, IMM8, END}, .size = 3},
|
||||
{.opcode = 0x00, .extended = -2, .name = "add", .mode = {R_M16, IMM8, END}},
|
||||
{.opcode = 0x01, .extended = -2, .name = "invalid", .mode = {END}},
|
||||
{.opcode = 0x02, .extended = -2, .name = "adc", .mode = {R_M16, IMM8, END}},
|
||||
{.opcode = 0x03, .extended = -2, .name = "sbb", .mode = {R_M16, IMM8, END}},
|
||||
{.opcode = 0x04, .extended = -2, .name = "invalid", .mode = {END}},
|
||||
{.opcode = 0x05, .extended = -2, .name = "sub", .mode = {R_M16, IMM8, END}},
|
||||
{.opcode = 0x06, .extended = -2, .name = "invalid", .mode = {END}},
|
||||
{.opcode = 0x07, .extended = -2, .name = "cmp", .mode = {R_M16, IMM8, END}},
|
||||
},
|
||||
};
|
||||
|
||||
const instruction_t invalid_instruction = { .opcode = 0xFF, .name = "unknown", .mode = {END}, .size = 1 };
|
||||
const instruction_t invalid_instruction = { .opcode = 0xFF, .name = "unknown", .mode = {END}};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user