⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i386-pinsn.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 3 页
字号:
/* Print i386 instructions for GDB, the GNU debugger.   Copyright (C) 1988, 1989, 1991 Free Software Foundation, Inc.This file is part of GDB.This program is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe 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 ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program; if not, write to the Free SoftwareFoundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  *//* * 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu) * July 1988 *//* * The main tables describing the instructions is essentially a copy * of the "Opcode Map" chapter (Appendix A) of the Intel 80386 * Programmers Manual.  Usually, there is a capital letter, followed * by a small letter.  The capital letter tell the addressing mode, * and the small letter tells about the operand size.  Refer to  * the Intel manual for details. */#include "defs.h"#include <ctype.h>/* For the GDB interface at the bottom of the file... */#include "gdbcore.h"#define Eb OP_E, b_mode#define indirEb OP_indirE, b_mode#define Gb OP_G, b_mode#define Ev OP_E, v_mode#define indirEv OP_indirE, v_mode#define Ew OP_E, w_mode#define Ma OP_E, v_mode#define M OP_E, 0#define Mp OP_E, 0		/* ? */#define Gv OP_G, v_mode#define Gw OP_G, w_mode#define Rw OP_rm, w_mode#define Rd OP_rm, d_mode#define Ib OP_I, b_mode#define sIb OP_sI, b_mode	/* sign extened byte */#define Iv OP_I, v_mode#define Iw OP_I, w_mode#define Jb OP_J, b_mode#define Jv OP_J, v_mode#define ONE OP_ONE, 0#define Cd OP_C, d_mode#define Dd OP_D, d_mode#define Td OP_T, d_mode#define eAX OP_REG, eAX_reg#define eBX OP_REG, eBX_reg#define eCX OP_REG, eCX_reg#define eDX OP_REG, eDX_reg#define eSP OP_REG, eSP_reg#define eBP OP_REG, eBP_reg#define eSI OP_REG, eSI_reg#define eDI OP_REG, eDI_reg#define AL OP_REG, al_reg#define CL OP_REG, cl_reg#define DL OP_REG, dl_reg#define BL OP_REG, bl_reg#define AH OP_REG, ah_reg#define CH OP_REG, ch_reg#define DH OP_REG, dh_reg#define BH OP_REG, bh_reg#define AX OP_REG, ax_reg#define DX OP_REG, dx_reg#define indirDX OP_REG, indir_dx_reg#define Sw OP_SEG, w_mode#define Ap OP_DIR, lptr#define Av OP_DIR, v_mode#define Ob OP_OFF, b_mode#define Ov OP_OFF, v_mode#define Xb OP_DSSI, b_mode#define Xv OP_DSSI, v_mode#define Yb OP_ESDI, b_mode#define Yv OP_ESDI, v_mode#define es OP_REG, es_reg#define ss OP_REG, ss_reg#define cs OP_REG, cs_reg#define ds OP_REG, ds_reg#define fs OP_REG, fs_reg#define gs OP_REG, gs_regint OP_E(), OP_indirE(), OP_G(), OP_I(), OP_sI(), OP_REG();int OP_J(), OP_SEG();int OP_DIR(), OP_OFF(), OP_DSSI(), OP_ESDI(), OP_ONE(), OP_C();int OP_D(), OP_T(), OP_rm();static void dofloat (), putop (), append_prefix (), set_op ();static int get16 (), get32 ();#define b_mode 1#define v_mode 2#define w_mode 3#define d_mode 4#define es_reg 100#define cs_reg 101#define ss_reg 102#define ds_reg 103#define fs_reg 104#define gs_reg 105#define eAX_reg 107#define eCX_reg 108#define eDX_reg 109#define eBX_reg 110#define eSP_reg 111#define eBP_reg 112#define eSI_reg 113#define eDI_reg 114#define lptr 115#define al_reg 116#define cl_reg 117#define dl_reg 118#define bl_reg 119#define ah_reg 120#define ch_reg 121#define dh_reg 122#define bh_reg 123#define ax_reg 124#define cx_reg 125#define dx_reg 126#define bx_reg 127#define sp_reg 128#define bp_reg 129#define si_reg 130#define di_reg 131#define indir_dx_reg 150#define GRP1b NULL, NULL, 0#define GRP1S NULL, NULL, 1#define GRP1Ss NULL, NULL, 2#define GRP2b NULL, NULL, 3#define GRP2S NULL, NULL, 4#define GRP2b_one NULL, NULL, 5#define GRP2S_one NULL, NULL, 6#define GRP2b_cl NULL, NULL, 7#define GRP2S_cl NULL, NULL, 8#define GRP3b NULL, NULL, 9#define GRP3S NULL, NULL, 10#define GRP4  NULL, NULL, 11#define GRP5  NULL, NULL, 12#define GRP6  NULL, NULL, 13#define GRP7 NULL, NULL, 14#define GRP8 NULL, NULL, 15#define FLOATCODE 50#define FLOAT NULL, NULL, FLOATCODEstruct dis386 {  char *name;  int (*op1)();  int bytemode1;  int (*op2)();  int bytemode2;  int (*op3)();  int bytemode3;};struct dis386 dis386[] = {  /* 00 */  { "addb",	Eb, Gb },  { "addS",	Ev, Gv },  { "addb",	Gb, Eb },  { "addS",	Gv, Ev },  { "addb",	AL, Ib },  { "addS",	eAX, Iv },  { "pushl",	es },  { "popl",	es },  /* 08 */  { "orb",	Eb, Gb },  { "orS",	Ev, Gv },  { "orb",	Gb, Eb },  { "orS",	Gv, Ev },  { "orb",	AL, Ib },  { "orS",	eAX, Iv },  { "pushl",	cs },  { "(bad)" },	/* 0x0f extended opcode escape */  /* 10 */  { "adcb",	Eb, Gb },  { "adcS",	Ev, Gv },  { "adcb",	Gb, Eb },  { "adcS",	Gv, Ev },  { "adcb",	AL, Ib },  { "adcS",	eAX, Iv },  { "pushl",	ss },  { "popl",	ss },  /* 18 */  { "sbbb",	Eb, Gb },  { "sbbS",	Ev, Gv },  { "sbbb",	Gb, Eb },  { "sbbS",	Gv, Ev },  { "sbbb",	AL, Ib },  { "sbbS",	eAX, Iv },  { "pushl",	ds },  { "popl",	ds },  /* 20 */  { "andb",	Eb, Gb },  { "andS",	Ev, Gv },  { "andb",	Gb, Eb },  { "andS",	Gv, Ev },  { "andb",	AL, Ib },  { "andS",	eAX, Iv },  { "(bad)" },			/* SEG ES prefix */  { "daa" },  /* 28 */  { "subb",	Eb, Gb },  { "subS",	Ev, Gv },  { "subb",	Gb, Eb },  { "subS",	Gv, Ev },  { "subb",	AL, Ib },  { "subS",	eAX, Iv },  { "(bad)" },			/* SEG CS prefix */  { "das" },  /* 30 */  { "xorb",	Eb, Gb },  { "xorS",	Ev, Gv },  { "xorb",	Gb, Eb },  { "xorS",	Gv, Ev },  { "xorb",	AL, Ib },  { "xorS",	eAX, Iv },  { "(bad)" },			/* SEG SS prefix */  { "aaa" },  /* 38 */  { "cmpb",	Eb, Gb },  { "cmpS",	Ev, Gv },  { "cmpb",	Gb, Eb },  { "cmpS",	Gv, Ev },  { "cmpb",	AL, Ib },  { "cmpS",	eAX, Iv },  { "(bad)" },			/* SEG DS prefix */  { "aas" },  /* 40 */  { "incS",	eAX },  { "incS",	eCX },  { "incS",	eDX },  { "incS",	eBX },  { "incS",	eSP },  { "incS",	eBP },  { "incS",	eSI },  { "incS",	eDI },  /* 48 */  { "decS",	eAX },  { "decS",	eCX },  { "decS",	eDX },  { "decS",	eBX },  { "decS",	eSP },  { "decS",	eBP },  { "decS",	eSI },  { "decS",	eDI },  /* 50 */  { "pushS",	eAX },  { "pushS",	eCX },  { "pushS",	eDX },  { "pushS",	eBX },  { "pushS",	eSP },  { "pushS",	eBP },  { "pushS",	eSI },  { "pushS",	eDI },  /* 58 */  { "popS",	eAX },  { "popS",	eCX },  { "popS",	eDX },  { "popS",	eBX },  { "popS",	eSP },  { "popS",	eBP },  { "popS",	eSI },  { "popS",	eDI },  /* 60 */  { "pusha" },  { "popa" },  { "boundS",	Gv, Ma },  { "arpl",	Ew, Gw },  { "(bad)" },			/* seg fs */  { "(bad)" },			/* seg gs */  { "(bad)" },			/* op size prefix */  { "(bad)" },			/* adr size prefix */  /* 68 */  { "pushS",	Iv },		/* 386 book wrong */  { "imulS",	Gv, Ev, Iv },  { "pushl",	sIb },		/* push of byte really pushes 4 bytes */  { "imulS",	Gv, Ev, Ib },  { "insb",	Yb, indirDX },  { "insS",	Yv, indirDX },  { "outsb",	indirDX, Xb },  { "outsS",	indirDX, Xv },  /* 70 */  { "jo",		Jb },  { "jno",	Jb },  { "jb",		Jb },  { "jae",	Jb },  { "je",		Jb },  { "jne",	Jb },  { "jbe",	Jb },  { "ja",		Jb },  /* 78 */  { "js",		Jb },  { "jns",	Jb },  { "jp",		Jb },  { "jnp",	Jb },  { "jl",		Jb },  { "jnl",	Jb },  { "jle",	Jb },  { "jg",		Jb },  /* 80 */  { GRP1b },  { GRP1S },  { "(bad)" },  { GRP1Ss },  { "testb",	Eb, Gb },  { "testS",	Ev, Gv },  { "xchgb",	Eb, Gb },  { "xchgS",	Ev, Gv },  /* 88 */  { "movb",	Eb, Gb },  { "movS",	Ev, Gv },  { "movb",	Gb, Eb },  { "movS",	Gv, Ev },  { "movw",	Ew, Sw },  { "leaS",	Gv, M },  { "movw",	Sw, Ew },  { "popS",	Ev },  /* 90 */  { "nop" },  { "xchgS",	eCX, eAX },  { "xchgS",	eDX, eAX },  { "xchgS",	eBX, eAX },  { "xchgS",	eSP, eAX },  { "xchgS",	eBP, eAX },  { "xchgS",	eSI, eAX },  { "xchgS",	eDI, eAX },  /* 98 */  { "cwtl" },  { "cltd" },  { "lcall",	Ap },  { "(bad)" },		/* fwait */  { "pushf" },  { "popf" },  { "sahf" },  { "lahf" },  /* a0 */  { "movb",	AL, Ob },  { "movS",	eAX, Ov },  { "movb",	Ob, AL },  { "movS",	Ov, eAX },  { "movsb",	Yb, Xb },  { "movsS",	Yv, Xv },  { "cmpsb",	Yb, Xb },  { "cmpsS",	Yv, Xv },  /* a8 */  { "testb",	AL, Ib },  { "testS",	eAX, Iv },  { "stosb",	Yb, AL },  { "stosS",	Yv, eAX },  { "lodsb",	AL, Xb },  { "lodsS",	eAX, Xv },  { "scasb",	AL, Xb },  { "scasS",	eAX, Xv },  /* b0 */  { "movb",	AL, Ib },  { "movb",	CL, Ib },  { "movb",	DL, Ib },  { "movb",	BL, Ib },  { "movb",	AH, Ib },  { "movb",	CH, Ib },  { "movb",	DH, Ib },  { "movb",	BH, Ib },  /* b8 */  { "movS",	eAX, Iv },  { "movS",	eCX, Iv },  { "movS",	eDX, Iv },  { "movS",	eBX, Iv },  { "movS",	eSP, Iv },  { "movS",	eBP, Iv },  { "movS",	eSI, Iv },  { "movS",	eDI, Iv },  /* c0 */  { GRP2b },  { GRP2S },  { "ret",	Iw },  { "ret" },  { "lesS",	Gv, Mp },  { "ldsS",	Gv, Mp },  { "movb",	Eb, Ib },  { "movS",	Ev, Iv },  /* c8 */  { "enter",	Iw, Ib },  { "leave" },  { "lret",	Iw },  { "lret" },  { "int3" },  { "int",	Ib },  { "into" },  { "iret" },  /* d0 */  { GRP2b_one },  { GRP2S_one },  { GRP2b_cl },  { GRP2S_cl },  { "aam",	Ib },  { "aad",	Ib },  { "(bad)" },  { "xlat" },  /* d8 */  { FLOAT },  { FLOAT },  { FLOAT },  { FLOAT },  { FLOAT },  { FLOAT },  { FLOAT },  { FLOAT },  /* e0 */  { "loopne",	Jb },  { "loope",	Jb },  { "loop",	Jb },  { "jCcxz",	Jb },  { "inb",	AL, Ib },  { "inS",	eAX, Ib },  { "outb",	Ib, AL },  { "outS",	Ib, eAX },  /* e8 */  { "call",	Av },  { "jmp",	Jv },  { "ljmp",	Ap },  { "jmp",	Jb },  { "inb",	AL, indirDX },  { "inS",	eAX, indirDX },  { "outb",	indirDX, AL },  { "outS",	indirDX, eAX },  /* f0 */  { "(bad)" },			/* lock prefix */  { "(bad)" },  { "(bad)" },			/* repne */  { "(bad)" },			/* repz */  { "hlt" },  { "cmc" },  { GRP3b },  { GRP3S },  /* f8 */  { "clc" },  { "stc" },  { "cli" },  { "sti" },  { "cld" },  { "std" },  { GRP4 },  { GRP5 },};struct dis386 dis386_twobyte[] = {  /* 00 */  { GRP6 },  { GRP7 },  { "larS", Gv, Ew },  { "lslS", Gv, Ew },    { "(bad)" },  { "(bad)" },  { "clts" },  { "(bad)" },    /* 08 */  { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    /* 10 */  { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    /* 18 */  { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    /* 20 */  /* these are all backward in appendix A of the intel book */  { "movl", Rd, Cd },  { "movl", Rd, Dd },  { "movl", Cd, Rd },  { "movl", Dd, Rd },    { "movl", Rd, Td },  { "(bad)" },  { "movl", Td, Rd },  { "(bad)" },    /* 28 */  { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    /* 30 */  { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    /* 38 */  { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    /* 40 */  { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    /* 48 */  { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    /* 50 */  { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    /* 58 */  { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    /* 60 */  { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    /* 68 */  { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    /* 70 */  { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    /* 78 */  { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    /* 80 */  { "jo", Jv },  { "jno", Jv },  { "jb", Jv },  { "jae", Jv },    { "je", Jv },  { "jne", Jv },  { "jbe", Jv },  { "ja", Jv },    /* 88 */  { "js", Jv },  { "jns", Jv },  { "jp", Jv },  { "jnp", Jv },    { "jl", Jv },  { "jge", Jv },  { "jle", Jv },  { "jg", Jv },    /* 90 */  { "seto", Eb },  { "setno", Eb },  { "setb", Eb },  { "setae", Eb },  { "sete", Eb },  { "setne", Eb },  { "setbe", Eb },  { "seta", Eb },  /* 98 */  { "sets", Eb },  { "setns", Eb },  { "setp", Eb },  { "setnp", Eb },  { "setl", Eb },  { "setge", Eb },  { "setle", Eb },  { "setg", Eb },    /* a0 */  { "pushl", fs },  { "popl", fs },  { "(bad)" },  { "btS", Ev, Gv },    { "shldS", Ev, Gv, Ib },  { "shldS", Ev, Gv, CL },  { "(bad)" },  { "(bad)" },    /* a8 */  { "pushl", gs },  { "popl", gs },  { "(bad)" },  { "btsS", Ev, Gv },    { "shrdS", Ev, Gv, Ib },  { "shrdS", Ev, Gv, CL },  { "(bad)" },  { "imulS", Gv, Ev },    /* b0 */  { "(bad)" },  { "(bad)" },  { "lssS", Gv, Mp },	/* 386 lists only Mp */  { "btrS", Ev, Gv },    { "lfsS", Gv, Mp },	/* 386 lists only Mp */  { "lgsS", Gv, Mp },	/* 386 lists only Mp */  { "movzbS", Gv, Eb },  { "movzwS", Gv, Ew },    /* b8 */  { "(bad)" },  { "(bad)" },  { GRP8 },  { "btcS", Ev, Gv },    { "bsfS", Gv, Ev },  { "bsrS", Gv, Ev },  { "movsbS", Gv, Eb },  { "movswS", Gv, Ew },    /* c0 */  { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    /* c8 */  { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    /* d0 */  { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    /* d8 */  { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    /* e0 */  { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    /* e8 */  { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    /* f0 */  { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    /* f8 */  { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },    { "(bad)" },  { "(bad)" },  { "(bad)" },  { "(bad)" },  };static char obuf[100];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -