📄 opcodes.c
字号:
/*
Copyright 2001-2003 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
You may contact the author at:
mailto::camille@bluegrass.net
or by snail mail at:
David Lindauer
850 Washburn Ave Apt 99
Louisville, KY 40222
**********************************************************************
OPCODES.C defines opcode tables for the assembly language disassembler
**********************************************************************
*/
#include "opcodes.h"
static OPTABLE base0[] =
{
{
0x00fc, 0x0000, "add", OP_REGRMREG, 2, VAL_ALL
}
,
{
0x00e7, 0x0006, "push", OP_SEG35, 1, VAL_ALL
}
,
{
0x00fe, 0x0004, "add", OP_ACCIMM, 1, VAL_ALL
}
,
{
0x00e7, 0x0007, "pop", OP_SEG35, 1, VAL_ALL
}
,
{
0x00fc, 0x0008, "or", OP_REGRMREG, 2, VAL_ALL
}
,
{
0x00fe, 0x000c, "or", OP_ACCIMM, 1, VAL_ALL
}
,
{
0x00fc, 0x0010, "adc", OP_REGRMREG, 2, VAL_ALL
}
,
{
0x00fe, 0x0014, "adc", OP_ACCIMM, 1, VAL_ALL
}
,
{
0x00fc, 0x0018, "sbb", OP_REGRMREG, 2, VAL_ALL
}
,
{
0x00fe, 0x001c, "sbb", OP_ACCIMM, 1, VAL_ALL
}
,
{
0, 0, 0, 0, 0, 0
}
};
static OPTABLE base1[] =
{
{
0x00fc, 0x0020, "and", OP_REGRMREG, 2, VAL_ALL
}
,
{
0x00fe, 0x0024, "and", OP_ACCIMM, 1, VAL_ALL
}
,
{
0x00ff, 0x0027, "daa", OP_CODEONLY, 1, VAL_ALL
}
,
{
0x00fc, 0x0028, "sub", OP_REGRMREG, 2, VAL_ALL
}
,
{
0x00fe, 0x002c, "sub", OP_ACCIMM, 1, VAL_ALL
}
,
{
0x00ff, 0x002f, "das", OP_CODEONLY, 1, VAL_ALL
}
,
{
0x00fc, 0x0030, "xor", OP_REGRMREG, 2, VAL_ALL
}
,
{
0x00fe, 0x0034, "xor", OP_ACCIMM, 1, VAL_ALL
}
,
{
0x00ff, 0x0037, "aaa", OP_CODEONLY, 1, VAL_ALL
}
,
{
0x00fc, 0x0038, "cmp", OP_REGRMREG, 2, VAL_ALL
}
,
{
0x00fe, 0x003c, "cmp", OP_ACCIMM, 1, VAL_ALL
}
,
{
0x00ff, 0x003f, "aas", OP_CODEONLY, 1, VAL_ALL
}
,
{
0, 0, 0, 0, 0, 0
}
};
static OPTABLE base2[] =
{
{
0x00f8, 0x0040, "inc", OP_WREG02, 1, VAL_ALL
}
,
{
0x00f8, 0x0048, "dec", OP_WREG02, 1, VAL_ALL
}
,
{
0x00f8, 0x0050, "push", OP_WREG02, 1, VAL_ALL
}
,
{
0x00f8, 0x0058, "pop", OP_WREG02, 1, VAL_ALL
}
,
{
0, 0, 0, 0, 0, 0
}
};
static OPTABLE base3[] =
{
{
0x00ff, 0x0060, "pusha", OP_CODEONLY, 1, VAL_NO8086
}
,
{
0x00ff, 0x0061, "popa", OP_CODEONLY, 1, VAL_NO8086
}
,
{
0x00ff, 0x0062, "bound", OP_WORDREGRM, 2, VAL_NO8086
}
,
{
0x00ff, 0x0063, "arpl", OP_WORDRMREG, 2, VAL_286
}
,
{
0x00ff, 0x0064, "repnc", OP_CODEONLY, 1, VAL_VX
}
,
{
0x00ff, 0x0065, "repc", OP_CODEONLY, 1, VAL_VX
}
,
{
0xc0fe, 0xc066, "fp02", OP_CODEONLY, 2, VAL_VX
}
,
{
0x00fe, 0x0066, "fp02", OP_CODEONLY, 2, VAL_VX
}
,
{
0x00fd, 0x0068, "push", OP_IMM, 1, VAL_NO8086
}
,
{
0x00fd, 0x0069, "imul", OP_IMUL, 2, VAL_NO8086
}
,
{
0x00ff, 0x006c, "insb", OP_CODEONLY, 1, VAL_NO8086
}
,
{
0x00ff, 0x006d, "ins", OP_CODEONLY, 1, VAL_NO8086
}
,
{
0x00ff, 0x006e, "outsb", OP_CODEONLY, 1, VAL_NO8086
}
,
{
0x00ff, 0x006f, "outs", OP_CODEONLY, 1, VAL_NO8086
}
,
{
0x00ff, 0x0070, "jo", OP_SHORTBRANCH, 2, VAL_ALL
}
,
{
0x00ff, 0x0071, "jno", OP_SHORTBRANCH, 2, VAL_ALL
}
,
{
0x00ff, 0x0072, "jb", OP_SHORTBRANCH, 2, VAL_ALL
}
,
{
0x00ff, 0x0073, "jae", OP_SHORTBRANCH, 2, VAL_ALL
}
,
{
0x00ff, 0x0074, "jz", OP_SHORTBRANCH, 2, VAL_ALL
}
,
{
0x00ff, 0x0075, "jnz", OP_SHORTBRANCH, 2, VAL_ALL
}
,
{
0x00ff, 0x0076, "jbe", OP_SHORTBRANCH, 2, VAL_ALL
}
,
{
0x00ff, 0x0077, "ja", OP_SHORTBRANCH, 2, VAL_ALL
}
,
{
0x00ff, 0x0078, "js", OP_SHORTBRANCH, 2, VAL_ALL
}
,
{
0x00ff, 0x0079, "jns", OP_SHORTBRANCH, 2, VAL_ALL
}
,
{
0x00ff, 0x007a, "jpe", OP_SHORTBRANCH, 2, VAL_ALL
}
,
{
0x00ff, 0x007b, "jpo", OP_SHORTBRANCH, 2, VAL_ALL
}
,
{
0x00ff, 0x007c, "jl", OP_SHORTBRANCH, 2, VAL_ALL
}
,
{
0x00ff, 0x007d, "jge", OP_SHORTBRANCH, 2, VAL_ALL
}
,
{
0x00ff, 0x007e, "jle", OP_SHORTBRANCH, 2, VAL_ALL
}
,
{
0x00ff, 0x007f, "jg", OP_SHORTBRANCH, 2, VAL_ALL
}
,
{
0, 0, 0, 0, 0, 0
}
};
static OPTABLE base4[] =
{
{
0x38fc, 0x0080, "add", OP_RMIMMSIGNED, 2, VAL_ALL
}
,
{
0x38fe, 0x0880, "or", OP_RMIMMSIGNED, 2, VAL_ALL
}
,
{
0x38fc, 0x0880, "or", OP_RMIMMSIGNED, 2, VAL_386
}
,
{
0x38fc, 0x1080, "adc", OP_RMIMMSIGNED, 2, VAL_ALL
}
,
{
0x38fc, 0x1880, "sbb", OP_RMIMMSIGNED, 2, VAL_ALL
}
,
{
0x38fe, 0x2080, "and", OP_RMIMMSIGNED, 2, VAL_ALL
}
,
{
0x38fc, 0x2080, "and", OP_RMIMMSIGNED, 2, VAL_386
}
,
{
0x38fc, 0x2880, "sub", OP_RMIMMSIGNED, 2, VAL_ALL
}
,
{
0x38fe, 0x3080, "xor", OP_RMIMMSIGNED, 2, VAL_ALL
}
,
{
0x38fc, 0x3080, "xor", OP_RMIMMSIGNED, 2, VAL_386
}
,
{
0x38fc, 0x3880, "cmp", OP_RMIMMSIGNED, 2, VAL_ALL
}
,
{
0x00fe, 0x0084, "test", OP_REGRM, 2, VAL_ALL
}
,
{
0x00fe, 0x0086, "xchg", OP_REGRMBW, 2, VAL_ALL
}
,
{
0x00fc, 0x0088, "mov", OP_REGRMREG, 2, VAL_ALL
}
,
{
0x20fd, 0x008c, "mov", OP_SEGRMSEG, 2, VAL_ALL
}
,
{
0x00fd, 0x008c, "mov", OP_SEGRMSEG, 2, VAL_386
}
,
{
0x00ff, 0x008d, "lea", OP_WORDREGRM, 2, VAL_ALL
}
,
{
0x38ff, 0x008f, "pop", OP_NOSTRICTRM, 2, VAL_ALL
}
,
{
0x00ff, 0x0090, "nop", OP_CODEONLY, 1, VAL_ALL
}
,
{
0x00f8, 0x0090, "xchg", OP_ACCREG02, 1, VAL_ALL
}
,
{
0x00ff, 0x0098, "cbw", OP_CODEONLY, 1, VAL_ALL
}
,
{
0x00ff, 0x0099, "cwd", OP_CODEONLY, 1, VAL_ALL
}
,
{
0x00ff, 0x009a, "call", OP_SEGBRANCH, 5, VAL_ALL
}
,
{
0x00ff, 0x009b, "wait", OP_CODEONLY, 1, VAL_ALL
}
,
{
0x00ff, 0x009c, "pushf", OP_INSWORDSIZE, 1, VAL_ALL
}
,
{
0x00ff, 0x009d, "popf", OP_INSWORDSIZE, 1, VAL_ALL
}
,
{
0x00ff, 0x009e, "sahf", OP_CODEONLY, 1, VAL_ALL
}
,
{
0x00ff, 0x009f, "lahf", OP_CODEONLY, 1, VAL_ALL
}
,
{
0, 0, 0, 0, 0, 0
}
};
static OPTABLE base5[] =
{
{
0x00fe, 0x00a0, "mov", OP_ACCABS, 3, VAL_ALL
}
,
{
0x00fe, 0x00a2, "mov", OP_ABSACC, 3, VAL_ALL
}
,
{
0x00ff, 0x00a5, "movs", OP_INSWORDSIZE, 1, VAL_ALL
}
,
{
0x00ff, 0x00a7, "cmps", OP_INSWORDSIZE, 1, VAL_ALL
}
,
{
0x00fe, 0x00a8, "test", OP_ACCIMM, 1, VAL_ALL
}
,
{
0x00ff, 0x00ab, "stos", OP_INSWORDSIZE, 1, VAL_ALL
}
,
{
0x00ff, 0x00ad, "lods", OP_INSWORDSIZE, 1, VAL_ALL
}
,
{
0x00ff, 0x00af, "scas", OP_INSWORDSIZE, 1, VAL_ALL
}
,
{
0x00ff, 0x00a4, "movsb", OP_CODEONLY, 1, VAL_ALL
}
,
{
0x00ff, 0x00a6, "cmpsb", OP_CODEONLY, 1, VAL_ALL
}
,
{
0x00ff, 0x00aa, "stosb", OP_CODEONLY, 1, VAL_ALL
}
,
{
0x00ff, 0x00ac, "lodsb", OP_CODEONLY, 1, VAL_ALL
}
,
{
0x00ff, 0x00ae, "scasb", OP_CODEONLY, 1, VAL_ALL
}
,
{
0x00f0, 0x00b0, "mov", OP_ACCIMMB3, 1, VAL_ALL
}
,
{
0, 0, 0, 0, 0, 0
}
};
static OPTABLE base6[] =
{
{
0x38fe, 0x00c0, "rol", OP_RMSHIFT, 2, VAL_NO8086
}
,
{
0x38fe, 0x08c0, "ror", OP_RMSHIFT, 2, VAL_NO8086
}
,
{
0x38fe, 0x10c0, "rcl", OP_RMSHIFT, 2, VAL_NO8086
}
,
{
0x38fe, 0x18c0, "rcr", OP_RMSHIFT, 2, VAL_NO8086
}
,
{
0x38fe, 0x20c0, "shl", OP_RMSHIFT, 2, VAL_NO8086
}
,
{
0x38fe, 0x28c0, "shr", OP_RMSHIFT, 2, VAL_NO8086
}
,
{
0x38fe, 0x38c0, "sar", OP_RMSHIFT, 2, VAL_NO8086
}
,
{
0x00ff, 0x00c2, "ret", OP_RET, 3, VAL_ALL
}
,
{
0x00ff, 0x00c3, "ret", OP_CODEONLY, 1, VAL_ALL
}
,
{
0x00ff, 0x00c4, "les", OP_WORDREGRM, 2, VAL_ALL
}
,
{
0x00ff, 0x00c5, "lds", OP_WORDREGRM, 2, VAL_ALL
}
,
{
0x38fe, 0x00c6, "mov", OP_RMIMM, 2, VAL_ALL
}
,
{
0x00ff, 0x00c8, "enter", OP_ENTER, 4, VAL_NO8086
}
,
{
0x00ff, 0x00ca, "retf", OP_RET, 3, VAL_ALL
}
,
{
0x00ff, 0x00cb, "retf", OP_CODEONLY, 1, VAL_ALL
}
,
{
0x00ff, 0x00cc, "int", OP_INTR, 1, VAL_ALL
}
,
{
0x00ff, 0x00cd, "int", OP_INTR, 2, VAL_ALL
}
,
{
0x00ff, 0x00ce, "into", OP_CODEONLY, 1, VAL_ALL
}
,
{
0x00ff, 0x00cf, "iret", OP_CODEONLY, 1, VAL_ALL
}
,
{
0x00ff, 0x00c9, "leave", OP_CODEONLY, 1, VAL_NO8086
}
,
{
0x38fc, 0x00d0, "rol", OP_RMSHIFT, 2, VAL_ALL
}
,
{
0x38fc, 0x08d0, "ror", OP_RMSHIFT, 2, VAL_ALL
}
,
{
0x38fc, 0x10d0, "rcl", OP_RMSHIFT, 2, VAL_ALL
}
,
{
0x38fc, 0x18d0, "rcr", OP_RMSHIFT, 2, VAL_ALL
}
,
{
0x38fc, 0x20d0, "shl", OP_RMSHIFT, 2, VAL_ALL
}
,
{
0x38fc, 0x28d0, "shr", OP_RMSHIFT, 2, VAL_ALL
}
,
{
0x38fc, 0x38d0, "sar", OP_RMSHIFT, 2, VAL_ALL
}
,
{
0xffff, 0x0ad4, "aam", OP_CODEONLY, 2, VAL_ALL
}
,
{
0xffff, 0x0ad5, "aad", OP_CODEONLY, 2, VAL_ALL
}
,
{
0x00ff, 0x00d7, "xlat", OP_CODEONLY, 1, VAL_ALL
}
,
{
0, 0, 0, 0, 0, 0
}
};
static OPTABLE base7[] =
{
{
0x00ff, 0x00e0, "loopnz", OP_SHORTBRANCH, 2, VAL_ALL
}
,
{
0x00ff, 0x00e1, "loopz", OP_SHORTBRANCH, 2, VAL_ALL
}
,
{
0x00ff, 0x00e2, "loop", OP_SHORTBRANCH, 2, VAL_ALL
}
,
{
0x00ff, 0x00e3, "jcxz", OP_SHORTBRANCH, 2, VAL_ALL
}
,
{
0x00fe, 0x00e4, "in", OP_PORTACCPORT, 2, VAL_ALL
}
,
{
0x00fe, 0x00e6, "out", OP_PORTACCPORT, 2, VAL_ALL
}
,
{
0x00ff, 0x00e8, "call", OP_BRANCH, 3, VAL_ALL
}
,
{
0x00ff, 0x00e9, "jmp", OP_BRANCH, 3, VAL_ALL
}
,
{
0x00ff, 0x00ea, "jmp", OP_SEGBRANCH, 5, VAL_ALL
}
,
{
0x00ff, 0x00eb, "jmp", OP_SHORTBRANCH, 2, VAL_ALL
}
,
{
0x00fe, 0x00ec, "in", OP_ACCDX, 1, VAL_ALL
}
,
{
0x00fe, 0x00ee, "out", OP_DXACC, 1, VAL_ALL
}
,
{
0x00ff, 0x00f0, "lock", OP_CODEONLY, 1, VAL_ALL
}
,
{
0x00ff, 0x00f2, "repnz", OP_CODEONLY, 1, VAL_ALL
}
,
{
0x00ff, 0x00f3, "repz", OP_CODEONLY, 1, VAL_ALL
}
,
{
0x00ff, 0x00f4, "hlt", OP_CODEONLY, 1, VAL_ALL
}
,
{
0x00ff, 0x00f5, "cmc", OP_CODEONLY, 1, VAL_ALL
}
,
{
0x38fe, 0x00f6, "test", OP_RMIMM, 2, VAL_ALL
}
,
{
0x38fe, 0x10f6, "not", OP_RM, 2, VAL_ALL
}
,
{
0x38fe, 0x18f6, "neg", OP_RM, 2, VAL_ALL
}
,
{
0x38fe, 0x20f6, "mul", OP_RM, 2, VAL_ALL
}
,
{
0x38fe, 0x28f6, "imul", OP_RM, 2, VAL_ALL
}
,
{
0x38fe, 0x30f6, "div", OP_RM, 2, VAL_ALL
}
,
{
0x38fe, 0x38f6, "idiv", OP_RM, 2, VAL_ALL
}
,
{
0x00ff, 0x00f8, "clc", OP_CODEONLY, 1, VAL_ALL
}
,
{
0x00ff, 0x00f9, "stc", OP_CODEONLY, 1, VAL_ALL
}
,
{
0x00ff, 0x00fa, "cli", OP_CODEONLY, 1, VAL_ALL
}
,
{
0x00ff, 0x00fb, "sti", OP_CODEONLY, 1, VAL_ALL
}
,
{
0x00ff, 0x00fc, "cld", OP_CODEONLY, 1, VAL_ALL
}
,
{
0x00ff, 0x00fd, "std", OP_CODEONLY, 1, VAL_ALL
}
,
{
0x38fe, 0x00fe, "inc", OP_RM, 2, VAL_ALL
}
,
{
0x38fe, 0x08fe, "dec", OP_RM, 2, VAL_ALL
}
,
{
0x38ff, 0x10ff, "call", OP_RM, 2, VAL_ALL
}
,
{
0x38ff, 0x18ff, "call", OP_FARRM, 2, VAL_ALL
}
,
{
0x38ff, 0x20ff, "jmp", OP_RM, 2, VAL_ALL
}
,
{
0x38ff, 0x28ff, "jmp", OP_FARRM, 2, VAL_ALL
}
,
{
0x38ff, 0x30ff, "push", OP_NOSTRICTRM, 2, VAL_ALL
}
,
{
0, 0, 0, 0, 0, 0
}
};
static OPTABLE baseVX[] =
{
{
0x00ff, 0x0020, "add4s", OP_CODEONLY, 1, VAL_VX
}
,
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -