📄 proctab.cpp
字号:
/************************************************************************
* proctab.cpp *
* Tables of processor instructions. The whole of this file is full of *
* tables that I constructed some time ago. The main instruction tables *
* include three arguments for instructions, which was necessary to *
* easily include instructions like shld r/m16,r16,CL. I was maybe *
* overexcessive with the number of slightly different modr/ms that I *
* included but the tables have served well, and when you build them up *
* from scratch instruction by instruction you do actually find a lot of *
* slightly different encodings, and the modrm encodings generally *
* indicate what is actually being referenced (like a 16:32 pointer in *
* memory, etc). I included the Z80 processor because I knew the Z80 *
* processor quite well, but mostly just to show it isnt hard to do. *
* At one point I decided that I needed a uid for each instruction to *
* enable proper reconstruction of the disassembly from a saved database *
* and so each instruction also has a uid for this purpose. *
* Flags for modrm may seem excessive, but consider encodings like 0fae *
* which includes the strange sfence instruction with no arguments and a *
* code of 0fae /7, along with stmxcsr m32 with the encoding 0fae /3 *
* Hence the flag FLAGS_MODRM indicates a modrm byte. Any argument *
* encodings may indicate usage of that byte, but may not be present at *
* all. *
* Whilst I havent found any errors in here for some time it would need *
* a very careful analysis to find any which may be present. Certainly *
* newer instruction encodings (mmx, kni) may need more work, and it is *
* worth looking at decodings which should not be possible (eg forced *
* memory operands only may require looking at as some possible *
* instructions are illegal) *
************************************************************************/
#include <windows.h>
#include "proctab.h"
proctable procnames[]=
{ {PROC_8086,"8086",tables86},
{PROC_80286,"80286",tables86},
{PROC_80386,"80386",tables86},
{PROC_80486,"80486",tables86},
{PROC_PENTIUM,"Pentium",tables86},
{PROC_PENTIUMPRO,"Pentium Pro",tables86},
{PROC_PENTMMX,"Pentium MMX",tables86},
{PROC_PENTIUM2,"Pentium II with KNI",tables86},
{PROC_Z80,"Z-80",tablesz80},
{0,"",NULL}
};
char *reg32ascii[]={"eax","ecx","edx","ebx","esp","ebp","esi","edi"};
char *reg16ascii[]={"ax","cx","dx","bx","sp","bp","si","di"};
char *reg8ascii[]={"al","cl","dl","bl","ah","ch","dh","bh"};
char *regind16ascii[]={"bx+si","bx+di","bp+si","bp+di","si","di","bp","bx"};
char *regfascii[]={"st(0)","st(1)","st(2)","st(3)","st(4)","st(5)","st(6)","st(7)"};
char *regmascii[]={"mm0","mm1","mm2","mm3","mm4","mm5","mm6","mm7"};
char *regxascii[]={"xmm0","xmm1","xmm2","xmm3","xmm4","xmm5","xmm6","xmm7"};
char *regsascii[]={"es","cs","ss","ds","fs","gs","??","??"};
char *regcascii[]={"cr0","cr1","cr2","cr3","cr4","cr5","cr6","cr7"};
char *regdascii[]={"dr0","dr1","dr2","dr3","dr4","dr5","dr6","dr7"};
char *regtascii[]={"tr0","tr1","tr2","tr3","tr4","tr5","tr6","tr7"};
char *regzascii[]={"b","c","d","e","h","l","(hl)","a"};
// to be filled in.
asminstdata asm86[]=
{ {"add",0x00,PROC_FROM8086,FLAGS_MODRM|FLAGS_8BIT,ARG_MODRM,ARG_REG,ARG_NONE,1},
{"add",0x01,PROC_FROM8086,FLAGS_MODRM|FLAGS_OMODE16,ARG_MODRM,ARG_REG,ARG_NONE,2},
{"add",0x01,PROC_FROM80386,FLAGS_MODRM|FLAGS_OMODE32,ARG_MODRM,ARG_REG,ARG_NONE,3},
{"add",0x02,PROC_FROM8086,FLAGS_MODRM|FLAGS_8BIT,ARG_REG,ARG_MODRM,ARG_NONE,4},
{"add",0x03,PROC_FROM8086,FLAGS_MODRM|FLAGS_OMODE16,ARG_REG,ARG_MODRM,ARG_NONE,5},
{"add",0x03,PROC_FROM80386,FLAGS_MODRM|FLAGS_OMODE32,ARG_REG,ARG_MODRM,ARG_NONE,6},
{"add",0x04,PROC_FROM8086,FLAGS_8BIT,ARG_REG_AL,ARG_IMM8,ARG_NONE,7},
{"add",0x05,PROC_FROM8086,FLAGS_OMODE16,ARG_REG_AX,ARG_IMM,ARG_NONE,8},
{"add",0x05,PROC_FROM80386,FLAGS_OMODE32,ARG_REG_AX,ARG_IMM,ARG_NONE,9},
{"push",0x06,PROC_FROM8086,0,ARG_REG_ES,ARG_NONE,ARG_NONE,10},
{"pop",0x07,PROC_FROM8086,0,ARG_REG_ES,ARG_NONE,ARG_NONE,11},
{"or",0x08,PROC_FROM8086,FLAGS_MODRM|FLAGS_8BIT,ARG_MODRM,ARG_REG,ARG_NONE,12},
{"or",0x09,PROC_FROM8086,FLAGS_MODRM|FLAGS_OMODE16,ARG_MODRM,ARG_REG,ARG_NONE,13},
{"or",0x09,PROC_FROM80386,FLAGS_MODRM|FLAGS_OMODE32,ARG_MODRM,ARG_REG,ARG_NONE,14},
{"or",0x0a,PROC_FROM8086,FLAGS_MODRM|FLAGS_8BIT,ARG_REG,ARG_MODRM,ARG_NONE,15},
{"or",0x0b,PROC_FROM8086,FLAGS_MODRM|FLAGS_OMODE16,ARG_REG,ARG_MODRM,ARG_NONE,16},
{"or",0x0b,PROC_FROM80386,FLAGS_MODRM|FLAGS_OMODE32,ARG_REG,ARG_MODRM,ARG_NONE,17},
{"or",0x0c,PROC_FROM8086,FLAGS_8BIT,ARG_REG_AL,ARG_IMM8,ARG_NONE,18},
{"or",0x0d,PROC_FROM8086,FLAGS_OMODE16,ARG_REG_AX,ARG_IMM,ARG_NONE,19},
{"or",0x0d,PROC_FROM80386,FLAGS_OMODE32,ARG_REG_AX,ARG_IMM,ARG_NONE,20},
{"push",0x0e,PROC_FROM8086,0,ARG_REG_CS,ARG_NONE,ARG_NONE,21},
{NULL,0x0f,PROC_FROM8086,0,ARG_NONE,ARG_NONE,ARG_NONE,22}, //subtable 0x0f
{"adc",0x10,PROC_FROM8086,FLAGS_MODRM|FLAGS_8BIT,ARG_MODRM,ARG_REG,ARG_NONE,23},
{"adc",0x11,PROC_FROM8086,FLAGS_MODRM|FLAGS_OMODE16,ARG_MODRM,ARG_REG,ARG_NONE,24},
{"adc",0x11,PROC_FROM80386,FLAGS_MODRM|FLAGS_OMODE32,ARG_MODRM,ARG_REG,ARG_NONE,25},
{"adc",0x12,PROC_FROM8086,FLAGS_MODRM|FLAGS_8BIT,ARG_REG,ARG_MODRM,ARG_NONE,26},
{"adc",0x13,PROC_FROM8086,FLAGS_MODRM|FLAGS_OMODE16,ARG_REG,ARG_MODRM,ARG_NONE,27},
{"adc",0x13,PROC_FROM80386,FLAGS_MODRM|FLAGS_OMODE32,ARG_REG,ARG_MODRM,ARG_NONE,28},
{"adc",0x14,PROC_FROM8086,FLAGS_8BIT,ARG_REG_AL,ARG_IMM8,ARG_NONE,29},
{"adc",0x15,PROC_FROM8086,FLAGS_OMODE16,ARG_REG_AX,ARG_IMM,ARG_NONE,30},
{"adc",0x15,PROC_FROM80386,FLAGS_OMODE32,ARG_REG_AX,ARG_IMM,ARG_NONE,31},
{"push",0x16,PROC_FROM8086,0,ARG_REG_SS,ARG_NONE,ARG_NONE,32},
{"pop",0x17,PROC_FROM8086,0,ARG_REG_SS,ARG_NONE,ARG_NONE,33},
{"sbb",0x18,PROC_FROM8086,FLAGS_MODRM|FLAGS_8BIT,ARG_MODRM,ARG_REG,ARG_NONE,34},
{"sbb",0x19,PROC_FROM8086,FLAGS_MODRM|FLAGS_OMODE16,ARG_MODRM,ARG_REG,ARG_NONE,35},
{"sbb",0x19,PROC_FROM80386,FLAGS_MODRM|FLAGS_OMODE32,ARG_MODRM,ARG_REG,ARG_NONE,36},
{"sbb",0x1a,PROC_FROM8086,FLAGS_MODRM|FLAGS_8BIT,ARG_REG,ARG_MODRM,ARG_NONE,37},
{"sbb",0x1b,PROC_FROM8086,FLAGS_MODRM|FLAGS_OMODE16,ARG_REG,ARG_MODRM,ARG_NONE,38},
{"sbb",0x1b,PROC_FROM80386,FLAGS_MODRM|FLAGS_OMODE32,ARG_REG,ARG_MODRM,ARG_NONE,39},
{"sbb",0x1c,PROC_FROM8086,FLAGS_8BIT,ARG_REG_AL,ARG_IMM8,ARG_NONE,40},
{"sbb",0x1d,PROC_FROM8086,FLAGS_OMODE16,ARG_REG_AX,ARG_IMM,ARG_NONE,41},
{"sbb",0x1d,PROC_FROM80386,FLAGS_OMODE32,ARG_REG_AX,ARG_IMM,ARG_NONE,42},
{"push",0x1e,PROC_FROM8086,0,ARG_REG_DS,ARG_NONE,ARG_NONE,43},
{"pop",0x1f,PROC_FROM8086,0,ARG_REG_DS,ARG_NONE,ARG_NONE,44},
{"and",0x20,PROC_FROM8086,FLAGS_MODRM|FLAGS_8BIT,ARG_MODRM,ARG_REG,ARG_NONE,45},
{"and",0x21,PROC_FROM8086,FLAGS_MODRM|FLAGS_OMODE16,ARG_MODRM,ARG_REG,ARG_NONE,46},
{"and",0x21,PROC_FROM80386,FLAGS_MODRM|FLAGS_OMODE32,ARG_MODRM,ARG_REG,ARG_NONE,47},
{"and",0x22,PROC_FROM8086,FLAGS_MODRM|FLAGS_8BIT,ARG_REG,ARG_MODRM,ARG_NONE,48},
{"and",0x23,PROC_FROM8086,FLAGS_MODRM|FLAGS_OMODE16,ARG_REG,ARG_MODRM,ARG_NONE,49},
{"and",0x23,PROC_FROM80386,FLAGS_MODRM|FLAGS_OMODE32,ARG_REG,ARG_MODRM,ARG_NONE,50},
{"and",0x24,PROC_FROM8086,FLAGS_8BIT,ARG_REG_AL,ARG_IMM8,ARG_NONE,51},
{"and",0x25,PROC_FROM8086,FLAGS_OMODE16,ARG_REG_AX,ARG_IMM,ARG_NONE,52},
{"and",0x25,PROC_FROM80386,FLAGS_OMODE32,ARG_REG_AX,ARG_IMM,ARG_NONE,53},
{"es:",0x26,PROC_FROM8086,FLAGS_SEGPREFIX,ARG_NONE,ARG_NONE,ARG_NONE,54},
{"daa",0x27,PROC_FROM8086,0,ARG_NONE,ARG_NONE,ARG_NONE,55},
{"sub",0x28,PROC_FROM8086,FLAGS_MODRM|FLAGS_8BIT,ARG_MODRM,ARG_REG,ARG_NONE,56},
{"sub",0x29,PROC_FROM8086,FLAGS_MODRM|FLAGS_OMODE16,ARG_MODRM,ARG_REG,ARG_NONE,57},
{"sub",0x29,PROC_FROM80386,FLAGS_MODRM|FLAGS_OMODE32,ARG_MODRM,ARG_REG,ARG_NONE,58},
{"sub",0x2a,PROC_FROM8086,FLAGS_MODRM|FLAGS_8BIT,ARG_REG,ARG_MODRM,ARG_NONE,59},
{"sub",0x2b,PROC_FROM8086,FLAGS_MODRM|FLAGS_OMODE16,ARG_REG,ARG_MODRM,ARG_NONE,60},
{"sub",0x2b,PROC_FROM80386,FLAGS_MODRM|FLAGS_OMODE32,ARG_REG,ARG_MODRM,ARG_NONE,61},
{"sub",0x2c,PROC_FROM8086,FLAGS_8BIT,ARG_REG_AL,ARG_IMM8,ARG_NONE,62},
{"sub",0x2d,PROC_FROM8086,FLAGS_OMODE16,ARG_REG_AX,ARG_IMM,ARG_NONE,63},
{"sub",0x2d,PROC_FROM80386,FLAGS_OMODE32,ARG_REG_AX,ARG_IMM,ARG_NONE,64},
{"cs:",0x2e,PROC_FROM8086,FLAGS_SEGPREFIX,ARG_NONE,ARG_NONE,ARG_NONE,65},
{"das",0x2f,PROC_FROM8086,0,ARG_NONE,ARG_NONE,ARG_NONE,66},
{"xor",0x30,PROC_FROM8086,FLAGS_MODRM|FLAGS_8BIT,ARG_MODRM,ARG_REG,ARG_NONE,67},
{"xor",0x31,PROC_FROM8086,FLAGS_MODRM|FLAGS_OMODE16,ARG_MODRM,ARG_REG,ARG_NONE,68},
{"xor",0x31,PROC_FROM80386,FLAGS_MODRM|FLAGS_OMODE32,ARG_MODRM,ARG_REG,ARG_NONE,69},
{"xor",0x32,PROC_FROM8086,FLAGS_MODRM|FLAGS_8BIT,ARG_REG,ARG_MODRM,ARG_NONE,70},
{"xor",0x33,PROC_FROM8086,FLAGS_MODRM|FLAGS_OMODE16,ARG_REG,ARG_MODRM,ARG_NONE,71},
{"xor",0x33,PROC_FROM80386,FLAGS_MODRM|FLAGS_OMODE32,ARG_REG,ARG_MODRM,ARG_NONE,72},
{"xor",0x34,PROC_FROM8086,FLAGS_8BIT,ARG_REG_AL,ARG_IMM8,ARG_NONE,73},
{"xor",0x35,PROC_FROM8086,FLAGS_OMODE16,ARG_REG_AX,ARG_IMM,ARG_NONE,74},
{"xor",0x35,PROC_FROM80386,FLAGS_OMODE32,ARG_REG_AX,ARG_IMM,ARG_NONE,75},
{"ss:",0x36,PROC_FROM8086,FLAGS_SEGPREFIX,ARG_NONE,ARG_NONE,ARG_NONE,76},
{"aaa",0x37,PROC_FROM8086,0,ARG_NONE,ARG_NONE,ARG_NONE,77},
{"cmp",0x38,PROC_FROM8086,FLAGS_MODRM|FLAGS_8BIT,ARG_MODRM,ARG_REG,ARG_NONE,78},
{"cmp",0x39,PROC_FROM8086,FLAGS_MODRM|FLAGS_OMODE16,ARG_MODRM,ARG_REG,ARG_NONE,79},
{"cmp",0x39,PROC_FROM80386,FLAGS_MODRM|FLAGS_OMODE32,ARG_MODRM,ARG_REG,ARG_NONE,80},
{"cmp",0x3a,PROC_FROM8086,FLAGS_MODRM|FLAGS_8BIT,ARG_REG,ARG_MODRM,ARG_NONE,81},
{"cmp",0x3b,PROC_FROM8086,FLAGS_MODRM|FLAGS_OMODE16,ARG_REG,ARG_MODRM,ARG_NONE,82},
{"cmp",0x3b,PROC_FROM80386,FLAGS_MODRM|FLAGS_OMODE32,ARG_REG,ARG_MODRM,ARG_NONE,83},
{"cmp",0x3c,PROC_FROM8086,FLAGS_8BIT,ARG_REG_AL,ARG_IMM8,ARG_NONE,84},
{"cmp",0x3d,PROC_FROM8086,FLAGS_OMODE16,ARG_REG_AX,ARG_IMM,ARG_NONE,85},
{"cmp",0x3d,PROC_FROM80386,FLAGS_OMODE32,ARG_REG_AX,ARG_IMM,ARG_NONE,86},
{"ds:",0x3e,PROC_FROM8086,FLAGS_SEGPREFIX,ARG_NONE,ARG_NONE,ARG_NONE,87},
{"aas",0x3f,PROC_FROM8086,0,ARG_NONE,ARG_NONE,ARG_NONE,88},
{"inc",0x40,PROC_FROM8086,FLAGS_OMODE16,ARG_REG_AX,ARG_NONE,ARG_NONE,89},
{"inc",0x40,PROC_FROM80386,FLAGS_OMODE32,ARG_REG_AX,ARG_NONE,ARG_NONE,90},
{"inc",0x41,PROC_FROM8086,FLAGS_OMODE16,ARG_REG_CX,ARG_NONE,ARG_NONE,91},
{"inc",0x41,PROC_FROM80386,FLAGS_OMODE32,ARG_REG_CX,ARG_NONE,ARG_NONE,92},
{"inc",0x42,PROC_FROM8086,FLAGS_OMODE16,ARG_REG_DX,ARG_NONE,ARG_NONE,93},
{"inc",0x42,PROC_FROM80386,FLAGS_OMODE32,ARG_REG_DX,ARG_NONE,ARG_NONE,94},
{"inc",0x43,PROC_FROM8086,FLAGS_OMODE16,ARG_REG_BX,ARG_NONE,ARG_NONE,95},
{"inc",0x43,PROC_FROM80386,FLAGS_OMODE32,ARG_REG_BX,ARG_NONE,ARG_NONE,96},
{"inc",0x44,PROC_FROM8086,FLAGS_OMODE16,ARG_REG_SP,ARG_NONE,ARG_NONE,97},
{"inc",0x44,PROC_FROM80386,FLAGS_OMODE32,ARG_REG_SP,ARG_NONE,ARG_NONE,98},
{"inc",0x45,PROC_FROM8086,FLAGS_OMODE16,ARG_REG_BP,ARG_NONE,ARG_NONE,99},
{"inc",0x45,PROC_FROM80386,FLAGS_OMODE32,ARG_REG_BP,ARG_NONE,ARG_NONE,100},
{"inc",0x46,PROC_FROM8086,FLAGS_OMODE16,ARG_REG_SI,ARG_NONE,ARG_NONE,101},
{"inc",0x46,PROC_FROM80386,FLAGS_OMODE32,ARG_REG_SI,ARG_NONE,ARG_NONE,102},
{"inc",0x47,PROC_FROM8086,FLAGS_OMODE16,ARG_REG_DI,ARG_NONE,ARG_NONE,103},
{"inc",0x47,PROC_FROM80386,FLAGS_OMODE32,ARG_REG_DI,ARG_NONE,ARG_NONE,104},
{"dec",0x48,PROC_FROM8086,FLAGS_OMODE16,ARG_REG_AX,ARG_NONE,ARG_NONE,105},
{"dec",0x48,PROC_FROM80386,FLAGS_OMODE32,ARG_REG_AX,ARG_NONE,ARG_NONE,106},
{"dec",0x49,PROC_FROM8086,FLAGS_OMODE16,ARG_REG_CX,ARG_NONE,ARG_NONE,107},
{"dec",0x49,PROC_FROM80386,FLAGS_OMODE32,ARG_REG_CX,ARG_NONE,ARG_NONE,108},
{"dec",0x4a,PROC_FROM8086,FLAGS_OMODE16,ARG_REG_DX,ARG_NONE,ARG_NONE,109},
{"dec",0x4a,PROC_FROM80386,FLAGS_OMODE32,ARG_REG_DX,ARG_NONE,ARG_NONE,110},
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -