1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816 |
- /*
- * Mach Operating System
- * Copyright (c) 1991,1990 Carnegie Mellon University
- * All Rights Reserved.
- *
- * Permission to use, copy, modify and distribute this software and its
- * documentation is hereby granted, provided that both the copyright
- * notice and this permission notice appear in all copies of the
- * software, derivative works or modified versions, and any portions
- * thereof, and that both notices appear in supporting documentation.
- *
- * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
- * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
- * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
- *
- * Carnegie Mellon requests users of this software to return to
- *
- * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
- * School of Computer Science
- * Carnegie Mellon University
- * Pittsburgh PA 15213-3890
- *
- * any improvements or extensions that they make and grant Carnegie Mellon
- * the rights to redistribute these changes.
- */
- /*
- * HISTORY
- *
- * Revision 2.6 92/01/03 20:05:00 dbg
- * Add a switch to disassemble 16-bit code.
- * Fix spelling of 'lods' opcodes.
- * [91/10/30 dbg]
- *
- * Revision 2.5 91/10/09 16:05:58 af
- * Supported disassemble of non current task by passing task parameter.
- * [91/08/29 tak]
- *
- * Revision 2.4 91/05/14 16:05:04 mrt
- * Correcting copyright
- *
- * Revision 2.3 91/02/05 17:11:03 mrt
- * Changed to new Mach copyright
- * [91/02/01 17:31:03 mrt]
- *
- * Revision 2.2 90/08/27 21:55:56 dbg
- * Fix register operand for move to/from control/test/debug
- * register instructions. Add i486 instructions.
- * [90/08/27 dbg]
- *
- * Import db_sym.h. Print instruction displacements in
- * current radix (signed). Change calling sequence of
- * db_disasm.
- * [90/08/21 dbg]
- * Fix includes.
- * [90/08/08 dbg]
- * Created.
- * [90/07/25 dbg]
- *
- */
- /*
- * Instruction disassembler.
- */
- #include "debugger.h"
- #if defined(__i386__) || defined(__x86_64__)
- /*
- * Switch to disassemble 16-bit code.
- */
- static BOOL db_disasm_16 = FALSE;
- /*
- * Flag to indicate whether we need to display instruction,
- * or whether we just need to know the address of the next
- * instruction.
- */
- static BOOL db_display = FALSE;
- /*
- * Size attributes
- */
- #define BYTE 0
- #define WORD 1
- #define LONG 2
- #define QUAD 3
- #define DQUA 4
- #define SNGL 5
- #define DBLR 6
- #define EXTR 7
- #define SDEP 8
- #define NONE 9
- /*
- * Addressing modes
- */
- #define E 1 /* general effective address */
- #define Eind 2 /* indirect address (jump, call) */
- #define Ew 3 /* address, word size */
- #define Eb 4 /* address, byte size */
- #define R 5 /* register, in 'reg' field */
- #define Rw 6 /* word register, in 'reg' field */
- #define Ri 7 /* register in instruction */
- #define S 8 /* segment reg, in 'reg' field */
- #define Si 9 /* segment reg, in instruction */
- #define A 10 /* accumulator */
- #define BX 11 /* (bx) */
- #define CL 12 /* cl, for shifts */
- #define DX 13 /* dx, for IO */
- #define SI 14 /* si */
- #define DI 15 /* di */
- #define CR 16 /* control register */
- #define DR 17 /* debug register */
- #define TR 18 /* test register */
- #define I 19 /* immediate, unsigned */
- #define Is 20 /* immediate, signed */
- #define Ib 21 /* byte immediate, unsigned */
- #define Ibs 22 /* byte immediate, signed */
- #define Iw 23 /* word immediate, unsigned */
- #define Il 24 /* long immediate */
- #define O 25 /* direct address */
- #define Db 26 /* byte displacement from EIP */
- #define Dl 27 /* long displacement from EIP */
- #define o1 28 /* constant 1 */
- #define o3 29 /* constant 3 */
- #define OS 30 /* immediate offset/segment */
- #define ST 31 /* FP stack top */
- #define STI 32 /* FP stack */
- #define X 33 /* extended FP op */
- #define XA 34 /* for 'fstcw %ax' */
- #define MX 35 /* special register (MMX reg %mm0-7) */
- #define EMX 36 /* special register (MMX reg %mm0-7) */
- #define XMM 37 /* special register (floating point reg %xmm0-7) */
- #define EXMM 38 /* special register (floating point reg %xmm0-7) */
- struct inst {
- const char *i_name; /* name */
- short i_has_modrm; /* has regmodrm byte */
- short i_size; /* operand size */
- int i_mode; /* addressing modes */
- const char *i_extra; /* pointer to extra opcode table */
- };
- #define op1(x) (x)
- #define op2(x,y) ((x)|((y)<<8))
- #define op3(x,y,z) ((x)|((y)<<8)|((z)<<16))
- struct finst {
- const char *f_name; /* name for memory instruction */
- int f_size; /* size for memory instruction */
- int f_rrmode; /* mode for rr instruction */
- const char *f_rrname; /* name for rr instruction
- (or pointer to table) */
- };
- static const char * const db_Grp6[] = {
- "sldt",
- "str",
- "lldt",
- "ltr",
- "verr",
- "verw",
- "",
- ""
- };
- static const char * const db_Grp7[] = {
- "sgdt",
- "sidt",
- "lgdt",
- "lidt",
- "smsw",
- "",
- "lmsw",
- "invlpg"
- };
- static const char * const db_Grp8[] = {
- "",
- "",
- "",
- "",
- "bt",
- "bts",
- "btr",
- "btc"
- };
- static const char * const db_Grp10[] = {
- "(bad)",
- "(bad)",
- "psrlw",
- "(bad)",
- "psraw",
- "(bad)",
- "psllw",
- "(bad)"
- };
- static const char * const db_Grp11[] = {
- "(bad)",
- "(bad)",
- "psrld",
- "(bad)",
- "psrad",
- "(bad)",
- "pslld",
- "(bad)"
- };
- static const char * const db_Grp12[] = {
- "(bad)",
- "(bad)",
- "psrlq",
- "(bad)",
- "psraq",
- "(bad)",
- "psllq",
- "(bad)"
- };
- static const struct inst db_inst_0f0x[] = {
- /*00*/ { "", TRUE, NONE, op1(Ew), (const char *)db_Grp6 },
- /*01*/ { "", TRUE, NONE, op1(Ew), (const char *)db_Grp7 },
- /*02*/ { "lar", TRUE, LONG, op2(E,R), 0 },
- /*03*/ { "lsl", TRUE, LONG, op2(E,R), 0 },
- /*04*/ { "", FALSE, NONE, 0, 0 },
- /*05*/ { "syscall", FALSE, NONE, 0, 0 },
- /*06*/ { "clts", FALSE, NONE, 0, 0 },
- /*07*/ { "sysret", FALSE, NONE, 0, 0 },
- /*08*/ { "invd", FALSE, NONE, 0, 0 },
- /*09*/ { "wbinvd",FALSE, NONE, 0, 0 },
- /*0a*/ { "", FALSE, NONE, 0, 0 },
- /*0b*/ { "", FALSE, NONE, 0, 0 },
- /*0c*/ { "", FALSE, NONE, 0, 0 },
- /*0d*/ { "", FALSE, NONE, 0, 0 },
- /*0e*/ { "", FALSE, NONE, 0, 0 },
- /*0f*/ { "", FALSE, NONE, 0, 0 },
- };
- static const struct inst db_inst_0f2x[] = {
- /*20*/ { "mov", TRUE, LONG, op2(CR,E), 0 }, /* use E for reg */
- /*21*/ { "mov", TRUE, LONG, op2(DR,E), 0 }, /* since mod == 11 */
- /*22*/ { "mov", TRUE, LONG, op2(E,CR), 0 },
- /*23*/ { "mov", TRUE, LONG, op2(E,DR), 0 },
- /*24*/ { "mov", TRUE, LONG, op2(TR,E), 0 },
- /*25*/ { "(bad)", FALSE, NONE, 0, 0 },
- /*26*/ { "mov", TRUE, LONG, op2(E,TR), 0 },
- /*27*/ { "(bad)", FALSE, NONE, 0, 0 },
- /*28*/ { "", FALSE, NONE, 0, 0 },
- /*29*/ { "", FALSE, NONE, 0, 0 },
- /*2a*/ { "", FALSE, NONE, 0, 0 },
- /*2b*/ { "", FALSE, NONE, 0, 0 },
- /*2c*/ { "", FALSE, NONE, 0, 0 },
- /*2d*/ { "", FALSE, NONE, 0, 0 },
- /*2e*/ { "", FALSE, NONE, 0, 0 },
- /*2f*/ { "", FALSE, NONE, 0, 0 },
- };
- static const struct inst db_inst_0f3x[] = {
- /*30*/ { "wrmsr", FALSE, NONE, 0, 0 },
- /*31*/ { "rdtsc", FALSE, NONE, 0, 0 },
- /*32*/ { "rdmsr", FALSE, NONE, 0, 0 },
- /*33*/ { "rdpmc", FALSE, NONE, 0, 0 },
- /*34*/ { "sysenter",FALSE,NONE, 0, 0 },
- /*35*/ { "sysexit",FALSE,NONE, 0, 0 },
- /*36*/ { "(bad)", FALSE, NONE, 0, 0 },
- /*37*/ { "(bad)", FALSE, NONE, 0, 0 },
- /*38*/ { "(bad)",FALSE, NONE, 0, 0 },
- /*39*/ { "(bad)",FALSE, NONE, 0, 0 },
- /*3a*/ { "(bad)",FALSE, NONE, 0, 0 },
- /*3b*/ { "(bad)",FALSE, NONE, 0, 0 },
- /*3c*/ { "(bad)",FALSE, NONE, 0, 0 },
- /*3d*/ { "(bad)",FALSE, NONE, 0, 0 },
- /*3e*/ { "(bad)",FALSE, NONE, 0, 0 },
- /*3f*/ { "(bad)",FALSE, NONE, 0, 0 },
- };
- static const struct inst db_inst_0f4x[] = {
- /*40*/ { "cmovo", TRUE, NONE, op2(E, R), 0 },
- /*41*/ { "cmovno", TRUE, NONE, op2(E, R), 0 },
- /*42*/ { "cmovnae",TRUE, NONE, op2(E, R), 0 },
- /*43*/ { "cmovnb", TRUE, NONE, op2(E, R), 0 },
- /*44*/ { "cmove", TRUE, NONE, op2(E, R), 0 },
- /*45*/ { "cmovne", TRUE, NONE, op2(E, R), 0 },
- /*46*/ { "cmovna", TRUE, NONE, op2(E, R), 0 },
- /*47*/ { "cmova", TRUE, NONE, op2(E, R), 0 },
- /*48*/ { "cmovs", TRUE, NONE, op2(E, R), 0 },
- /*49*/ { "cmovns", TRUE, NONE, op2(E, R), 0 },
- /*4a*/ { "cmovpe", TRUE, NONE, op2(E, R), 0 },
- /*4b*/ { "cmovpo", TRUE, NONE, op2(E, R), 0 },
- /*4c*/ { "cmovl", TRUE, NONE, op2(E, R), 0 },
- /*4d*/ { "cmovge", TRUE, NONE, op2(E, R), 0 },
- /*4e*/ { "cmovle", TRUE, NONE, op2(E, R), 0 },
- /*4f*/ { "cmovnle",TRUE, NONE, op2(E, R), 0 },
- };
- static const struct inst db_inst_0f5x[] = {
- /*50*/ { "movmskps",TRUE, NONE, op2(EXMM, R), 0 },
- /*51*/ { "sqrtps", TRUE, NONE, op2(EXMM, XMM), 0 },
- /*52*/ { "rsqrtps", TRUE, NONE, op2(EXMM, XMM), 0 },
- /*53*/ { "rcpps", TRUE, NONE, op2(EXMM, XMM), 0 },
- /*54*/ { "andps", TRUE, NONE, op2(EXMM, XMM), 0 },
- /*55*/ { "andnps", TRUE, NONE, op2(EXMM, XMM), 0 },
- /*56*/ { "orps", TRUE, NONE, op2(EXMM, XMM), 0 },
- /*57*/ { "xorps", TRUE, NONE, op2(EXMM, XMM), 0 },
- /*58*/ { "addps", TRUE, NONE, op2(EXMM, XMM), 0 },
- /*59*/ { "mulps", TRUE, NONE, op2(EXMM, XMM), 0 },
- /*5a*/ { "cvtps2pd",TRUE, NONE, op2(EXMM, XMM), 0 },
- /*5b*/ { "cvtdq2ps",TRUE, NONE, op2(EXMM, XMM), 0 },
- /*5c*/ { "subps", TRUE, NONE, op2(EXMM, XMM), 0 },
- /*5d*/ { "minps", TRUE, NONE, op2(EXMM, XMM), 0 },
- /*5e*/ { "divps", TRUE, NONE, op2(EXMM, XMM), 0 },
- /*5f*/ { "maxps", TRUE, NONE, op2(EXMM, XMM), 0 },
- };
- static const struct inst db_inst_0f6x[] = {
- /*60*/ { "punpcklbw", TRUE, NONE, op2(E, MX), 0 },
- /*61*/ { "punpcklwd", TRUE, NONE, op2(E, MX), 0 },
- /*62*/ { "punpckldq", TRUE, NONE, op2(E, MX), 0 },
- /*63*/ { "packsswb", TRUE, NONE, op2(E, MX), 0 },
- /*64*/ { "pcmpgtb", TRUE, NONE, op2(E, MX), 0 },
- /*65*/ { "pcmpgtw", TRUE, NONE, op2(E, MX), 0 },
- /*66*/ { "pcmpgtd", TRUE, NONE, op2(E, MX), 0 },
- /*67*/ { "packuswb", TRUE, NONE, op2(E, MX), 0 },
- /*68*/ { "punpckhbw", TRUE, NONE, op2(E, MX), 0 },
- /*69*/ { "punpckhwd", TRUE, NONE, op2(E, MX), 0 },
- /*6a*/ { "punpckhdq", TRUE, NONE, op2(E, MX), 0 },
- /*6b*/ { "packssdw", TRUE, NONE, op2(E, MX), 0 },
- /*6c*/ { "(bad)", TRUE, NONE, 0, 0 },
- /*6d*/ { "(bad)", TRUE, NONE, 0, 0 },
- /*6e*/ { "movd", TRUE, NONE, op2(E, MX), 0 },
- /*6f*/ { "movq", TRUE, NONE, op2(EMX, MX), 0 },
- };
- static const struct inst db_inst_0f7x[] = {
- /*70*/ { "pshufw", TRUE, NONE, op2(MX, EMX), 0 },
- /*71*/ { "(grp10)", TRUE, BYTE, op2(EMX, I), (const char*)db_Grp10 },
- /*72*/ { "(grp11)", TRUE, BYTE, op2(EMX, I), (const char*)db_Grp11 },
- /*73*/ { "(grp12)", TRUE, BYTE, op2(EMX, I), (const char*)db_Grp12 },
- /*74*/ { "pcmpeqb", TRUE, NONE, op2(E, MX), 0 },
- /*75*/ { "pcmpeqw", TRUE, NONE, op2(E, MX), 0 },
- /*76*/ { "pcmpeqd", TRUE, NONE, op2(E, MX), 0 },
- /*77*/ { "emms", FALSE,NONE, 0, 0 },
- /*78*/ { "(bad)", TRUE, NONE, 0, 0 },
- /*79*/ { "(bad)", TRUE, NONE, 0, 0 },
- /*7a*/ { "(bad)", TRUE, NONE, 0, 0 },
- /*7b*/ { "(bad)", TRUE, NONE, 0, 0 },
- /*7c*/ { "(bad)", TRUE, NONE, 0, 0 },
- /*7d*/ { "(bad)", TRUE, NONE, 0, 0 },
- /*7e*/ { "movd", TRUE, NONE, op2(E, MX), 0 },
- /*7f*/ { "movq", TRUE, NONE, op2(MX, EMX), 0 },
- };
- static const struct inst db_inst_0f8x[] = {
- /*80*/ { "jo", FALSE, NONE, op1(Dl), 0 },
- /*81*/ { "jno", FALSE, NONE, op1(Dl), 0 },
- /*82*/ { "jb", FALSE, NONE, op1(Dl), 0 },
- /*83*/ { "jnb", FALSE, NONE, op1(Dl), 0 },
- /*84*/ { "jz", FALSE, NONE, op1(Dl), 0 },
- /*85*/ { "jnz", FALSE, NONE, op1(Dl), 0 },
- /*86*/ { "jbe", FALSE, NONE, op1(Dl), 0 },
- /*87*/ { "jnbe", FALSE, NONE, op1(Dl), 0 },
- /*88*/ { "js", FALSE, NONE, op1(Dl), 0 },
- /*89*/ { "jns", FALSE, NONE, op1(Dl), 0 },
- /*8a*/ { "jp", FALSE, NONE, op1(Dl), 0 },
- /*8b*/ { "jnp", FALSE, NONE, op1(Dl), 0 },
- /*8c*/ { "jl", FALSE, NONE, op1(Dl), 0 },
- /*8d*/ { "jnl", FALSE, NONE, op1(Dl), 0 },
- /*8e*/ { "jle", FALSE, NONE, op1(Dl), 0 },
- /*8f*/ { "jnle", FALSE, NONE, op1(Dl), 0 },
- };
- static const struct inst db_inst_0f9x[] = {
- /*90*/ { "seto", TRUE, NONE, op1(Eb), 0 },
- /*91*/ { "setno", TRUE, NONE, op1(Eb), 0 },
- /*92*/ { "setb", TRUE, NONE, op1(Eb), 0 },
- /*93*/ { "setnb", TRUE, NONE, op1(Eb), 0 },
- /*94*/ { "setz", TRUE, NONE, op1(Eb), 0 },
- /*95*/ { "setnz", TRUE, NONE, op1(Eb), 0 },
- /*96*/ { "setbe", TRUE, NONE, op1(Eb), 0 },
- /*97*/ { "setnbe",TRUE, NONE, op1(Eb), 0 },
- /*98*/ { "sets", TRUE, NONE, op1(Eb), 0 },
- /*99*/ { "setns", TRUE, NONE, op1(Eb), 0 },
- /*9a*/ { "setp", TRUE, NONE, op1(Eb), 0 },
- /*9b*/ { "setnp", TRUE, NONE, op1(Eb), 0 },
- /*9c*/ { "setl", TRUE, NONE, op1(Eb), 0 },
- /*9d*/ { "setnl", TRUE, NONE, op1(Eb), 0 },
- /*9e*/ { "setle", TRUE, NONE, op1(Eb), 0 },
- /*9f*/ { "setnle",TRUE, NONE, op1(Eb), 0 },
- };
- static const struct inst db_inst_0fax[] = {
- /*a0*/ { "push", FALSE, NONE, op1(Si), 0 },
- /*a1*/ { "pop", FALSE, NONE, op1(Si), 0 },
- /*a2*/ { "cpuid", FALSE, NONE, 0, 0 },
- /*a3*/ { "bt", TRUE, LONG, op2(E,R), 0 },
- /*a4*/ { "shld", TRUE, LONG, op3(Ib,E,R), 0 },
- /*a5*/ { "shld", TRUE, LONG, op3(CL,E,R), 0 },
- /*a6*/ { "", FALSE, NONE, 0, 0 },
- /*a7*/ { "", FALSE, NONE, 0, 0 },
- /*a8*/ { "push", FALSE, NONE, op1(Si), 0 },
- /*a9*/ { "pop", FALSE, NONE, op1(Si), 0 },
- /*aa*/ { "", FALSE, NONE, 0, 0 },
- /*ab*/ { "bts", TRUE, LONG, op2(E,R), 0 },
- /*ac*/ { "shrd", TRUE, LONG, op3(Ib,E,R), 0 },
- /*ad*/ { "shrd", TRUE, LONG, op3(CL,E,R), 0 },
- /*a6*/ { "", FALSE, NONE, 0, 0 },
- /*a7*/ { "imul", TRUE, LONG, op2(E,R), 0 },
- };
- static const struct inst db_inst_0fbx[] = {
- /*b0*/ { "cmpxchg",TRUE, BYTE, op2(E, R), 0 },
- /*b1*/ { "cmpxchg",TRUE, LONG, op2(E, R), 0 },
- /*b2*/ { "lss", TRUE, LONG, op2(E, R), 0 },
- /*b3*/ { "bts", TRUE, LONG, op2(R, E), 0 },
- /*b4*/ { "lfs", TRUE, LONG, op2(E, R), 0 },
- /*b5*/ { "lgs", TRUE, LONG, op2(E, R), 0 },
- /*b6*/ { "movzb", TRUE, LONG, op2(E, R), 0 },
- /*b7*/ { "movzw", TRUE, LONG, op2(E, R), 0 },
- /*b8*/ { "", FALSE, NONE, 0, 0 },
- /*b9*/ { "", FALSE, NONE, 0, 0 },
- /*ba*/ { "", TRUE, LONG, op2(Ib, E), (const char *)db_Grp8 },
- /*bb*/ { "btc", TRUE, LONG, op2(R, E), 0 },
- /*bc*/ { "bsf", TRUE, LONG, op2(E, R), 0 },
- /*bd*/ { "bsr", TRUE, LONG, op2(E, R), 0 },
- /*be*/ { "movsb", TRUE, LONG, op2(E, R), 0 },
- /*bf*/ { "movsw", TRUE, LONG, op2(E, R), 0 },
- };
- static const struct inst db_inst_0fcx[] = {
- /*c0*/ { "xadd", TRUE, BYTE, op2(R, E), 0 },
- /*c1*/ { "xadd", TRUE, LONG, op2(R, E), 0 },
- /*c2*/ { "", FALSE, NONE, 0, 0 },
- /*c3*/ { "", FALSE, NONE, 0, 0 },
- /*c4*/ { "", FALSE, NONE, 0, 0 },
- /*c5*/ { "", FALSE, NONE, 0, 0 },
- /*c6*/ { "", FALSE, NONE, 0, 0 },
- /*c7*/ { "", FALSE, NONE, 0, 0 },
- /*c8*/ { "bswap", FALSE, LONG, op1(Ri), 0 },
- /*c9*/ { "bswap", FALSE, LONG, op1(Ri), 0 },
- /*ca*/ { "bswap", FALSE, LONG, op1(Ri), 0 },
- /*cb*/ { "bswap", FALSE, LONG, op1(Ri), 0 },
- /*cc*/ { "bswap", FALSE, LONG, op1(Ri), 0 },
- /*cd*/ { "bswap", FALSE, LONG, op1(Ri), 0 },
- /*ce*/ { "bswap", FALSE, LONG, op1(Ri), 0 },
- /*cf*/ { "bswap", FALSE, LONG, op1(Ri), 0 },
- };
- static const struct inst db_inst_0fdx[] = {
- /*d0*/ { "(bad)", FALSE, NONE,0, 0 },
- /*d1*/ { "psrlw", TRUE, NONE,op2(MX,EMX), 0 },
- /*d2*/ { "psrld", TRUE, NONE,op2(MX,EMX), 0 },
- /*d3*/ { "psrld", TRUE, NONE,op2(MX,EMX), 0 },
- /*d4*/ { "(bad)", FALSE, NONE,0, 0 },
- /*d5*/ { "pmulww", TRUE, NONE,op2(MX,EMX), 0 },
- /*d6*/ { "(bad)", FALSE, NONE,0, 0 },
- /*d7*/ { "pmovmskb",FALSE, NONE,op2(MX,EMX),0 },
- /*d8*/ { "psubusb", TRUE, NONE,op2(MX,EMX), 0 },
- /*d9*/ { "psubusw", TRUE, NONE,op2(MX,EMX), 0 },
- /*da*/ { "pminub", TRUE, NONE,op2(MX,EMX), 0 },
- /*db*/ { "pand", TRUE, NONE,op2(MX,EMX), 0 },
- /*dc*/ { "paddusb", TRUE, NONE,op2(MX,EMX), 0 },
- /*dd*/ { "paddusw", TRUE, NONE,op2(MX,EMX), 0 },
- /*de*/ { "pmaxub", TRUE, NONE,op2(MX,EMX), 0 },
- /*df*/ { "pandn", TRUE, NONE,op2(MX,EMX), 0 },
- };
- static const struct inst db_inst_0fex[] = {
- /*e0*/ { "pavgb", TRUE, NONE, op2(MX, EMX), 0 },
- /*e1*/ { "psraw", TRUE, NONE, op2(MX, EMX), 0 },
- /*e2*/ { "psrad", TRUE, NONE, op2(MX, EMX), 0 },
- /*e3*/ { "pavgw", TRUE, NONE, op2(MX, EMX), 0 },
- /*e4*/ { "pmulhuw",TRUE, NONE, op2(MX, EMX), 0 },
- /*e5*/ { "pmulhw", TRUE, NONE, op2(MX, EMX), 0 },
- /*e6*/ { "(bad)", FALSE,NONE, 0, 0 },
- /*e7*/ { "movntq", TRUE, NONE, op2(MX, EMX), 0 },
- /*e8*/ { "psubsb", TRUE, NONE, op2(MX, EMX), 0 },
- /*e9*/ { "psubsw", TRUE, NONE, op2(MX, EMX), 0 },
- /*ea*/ { "pminsw", TRUE, NONE, op2(MX, EMX), 0 },
- /*eb*/ { "por", TRUE, NONE, op2(MX, EMX), 0 },
- /*ec*/ { "paddsb", TRUE, NONE, op2(MX, EMX), 0 },
- /*ed*/ { "paddsw", TRUE, NONE, op2(MX, EMX), 0 },
- /*ee*/ { "pmaxsw", TRUE, NONE, op2(MX, EMX), 0 },
- /*ef*/ { "pxor", TRUE, NONE, op2(MX, EMX), 0 },
- };
- static const struct inst db_inst_0ffx[] = {
- /*f0*/ { "(bad)", FALSE,NONE, 0, 0 },
- /*f1*/ { "psllw", TRUE, NONE, op2(MX, EMX), 0 },
- /*f2*/ { "pslld", TRUE, NONE, op2(MX, EMX), 0 },
- /*f3*/ { "psllq", TRUE, NONE, op2(MX, EMX), 0 },
- /*f4*/ { "(bad)", FALSE,NONE, 0, 0 },
- /*f5*/ { "pmaddwd",TRUE, NONE, op2(MX, EMX), 0 },
- /*f6*/ { "psadbw", TRUE, NONE, op2(MX, EMX), 0 },
- /*f7*/ { "maskmovq",TRUE,NONE, op2(MX, EMX), 0 },
- /*f8*/ { "psubb", TRUE, NONE, op2(MX, EMX), 0 },
- /*f9*/ { "psubw", TRUE, NONE, op2(MX, EMX), 0 },
- /*fa*/ { "psubd", TRUE, NONE, op2(MX, EMX), 0 },
- /*fb*/ { "(bad)", FALSE,NONE, 0, 0 },
- /*fc*/ { "paddb", TRUE, NONE, op2(MX, EMX), 0 },
- /*fd*/ { "paddw", TRUE, NONE, op2(MX, EMX), 0 },
- /*fe*/ { "paddd", TRUE, NONE, op2(MX, EMX), 0 },
- /*ff*/ { "(bad)", FALSE, NONE, 0, 0 },
- };
- static const struct inst * const db_inst_0f[] = {
- db_inst_0f0x,
- 0,
- db_inst_0f2x,
- db_inst_0f3x,
- db_inst_0f4x,
- db_inst_0f5x,
- db_inst_0f6x,
- db_inst_0f7x,
- db_inst_0f8x,
- db_inst_0f9x,
- db_inst_0fax,
- db_inst_0fbx,
- db_inst_0fcx,
- db_inst_0fdx,
- db_inst_0fex,
- db_inst_0ffx
- };
- static const char * const db_Esc92[] = {
- "fnop", "", "", "", "", "", "", ""
- };
- static const char * const db_Esc93[] = {
- "", "", "", "", "", "", "", ""
- };
- static const char * const db_Esc94[] = {
- "fchs", "fabs", "", "", "ftst", "fxam", "", ""
- };
- static const char * const db_Esc95[] = {
- "fld1", "fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz",""
- };
- static const char * const db_Esc96[] = {
- "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp",
- "fincstp"
- };
- static const char * const db_Esc97[] = {
- "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos"
- };
- static const char * const db_Esca4[] = {
- "", "fucompp","", "", "", "", "", ""
- };
- static const char * const db_Escb4[] = {
- "", "", "fnclex","fninit","", "", "", ""
- };
- static const char * const db_Esce3[] = {
- "", "fcompp","", "", "", "", "", ""
- };
- static const char * const db_Escf4[] = {
- "fnstsw","", "", "", "", "", "", ""
- };
- static const struct finst db_Esc8[] = {
- /*0*/ { "fadd", SNGL, op2(STI,ST), 0 },
- /*1*/ { "fmul", SNGL, op2(STI,ST), 0 },
- /*2*/ { "fcom", SNGL, op2(STI,ST), 0 },
- /*3*/ { "fcomp", SNGL, op2(STI,ST), 0 },
- /*4*/ { "fsub", SNGL, op2(STI,ST), 0 },
- /*5*/ { "fsubr", SNGL, op2(STI,ST), 0 },
- /*6*/ { "fdiv", SNGL, op2(STI,ST), 0 },
- /*7*/ { "fdivr", SNGL, op2(STI,ST), 0 },
- };
- static const struct finst db_Esc9[] = {
- /*0*/ { "fld", SNGL, op1(STI), 0 },
- /*1*/ { "", NONE, op1(STI), "fxch" },
- /*2*/ { "fst", SNGL, op1(X), (const char *)db_Esc92 },
- /*3*/ { "fstp", SNGL, op1(X), (const char *)db_Esc93 },
- /*4*/ { "fldenv", NONE, op1(X), (const char *)db_Esc94 },
- /*5*/ { "fldcw", NONE, op1(X), (const char *)db_Esc95 },
- /*6*/ { "fnstenv",NONE, op1(X), (const char *)db_Esc96 },
- /*7*/ { "fnstcw", NONE, op1(X), (const char *)db_Esc97 },
- };
- static const struct finst db_Esca[] = {
- /*0*/ { "fiadd", WORD, 0, 0 },
- /*1*/ { "fimul", WORD, 0, 0 },
- /*2*/ { "ficom", WORD, 0, 0 },
- /*3*/ { "ficomp", WORD, 0, 0 },
- /*4*/ { "fisub", WORD, op1(X), (const char *)db_Esca4 },
- /*5*/ { "fisubr", WORD, 0, 0 },
- /*6*/ { "fidiv", WORD, 0, 0 },
- /*7*/ { "fidivr", WORD, 0, 0 }
- };
- static const struct finst db_Escb[] = {
- /*0*/ { "fild", WORD, 0, 0 },
- /*1*/ { "", NONE, 0, 0 },
- /*2*/ { "fist", WORD, 0, 0 },
- /*3*/ { "fistp", WORD, 0, 0 },
- /*4*/ { "", WORD, op1(X), (const char *)db_Escb4 },
- /*5*/ { "fld", EXTR, 0, 0 },
- /*6*/ { "", WORD, 0, 0 },
- /*7*/ { "fstp", EXTR, 0, 0 },
- };
- static const struct finst db_Escc[] = {
- /*0*/ { "fadd", DBLR, op2(ST,STI), 0 },
- /*1*/ { "fmul", DBLR, op2(ST,STI), 0 },
- /*2*/ { "fcom", DBLR, op2(ST,STI), 0 },
- /*3*/ { "fcomp", DBLR, op2(ST,STI), 0 },
- /*4*/ { "fsub", DBLR, op2(ST,STI), "fsubr" },
- /*5*/ { "fsubr", DBLR, op2(ST,STI), "fsub" },
- /*6*/ { "fdiv", DBLR, op2(ST,STI), "fdivr" },
- /*7*/ { "fdivr", DBLR, op2(ST,STI), "fdiv" },
- };
- static const struct finst db_Escd[] = {
- /*0*/ { "fld", DBLR, op1(STI), "ffree" },
- /*1*/ { "", NONE, 0, 0 },
- /*2*/ { "fst", DBLR, op1(STI), 0 },
- /*3*/ { "fstp", DBLR, op1(STI), 0 },
- /*4*/ { "frstor", NONE, op1(STI), "fucom" },
- /*5*/ { "", NONE, op1(STI), "fucomp" },
- /*6*/ { "fnsave", NONE, 0, 0 },
- /*7*/ { "fnstsw", NONE, 0, 0 },
- };
- static const struct finst db_Esce[] = {
- /*0*/ { "fiadd", LONG, op2(ST,STI), "faddp" },
- /*1*/ { "fimul", LONG, op2(ST,STI), "fmulp" },
- /*2*/ { "ficom", LONG, 0, 0 },
- /*3*/ { "ficomp", LONG, op1(X), (const char *)db_Esce3 },
- /*4*/ { "fisub", LONG, op2(ST,STI), "fsubrp" },
- /*5*/ { "fisubr", LONG, op2(ST,STI), "fsubp" },
- /*6*/ { "fidiv", LONG, op2(ST,STI), "fdivrp" },
- /*7*/ { "fidivr", LONG, op2(ST,STI), "fdivp" },
- };
- static const struct finst db_Escf[] = {
- /*0*/ { "fild", LONG, 0, 0 },
- /*1*/ { "", LONG, 0, 0 },
- /*2*/ { "fist", LONG, 0, 0 },
- /*3*/ { "fistp", LONG, 0, 0 },
- /*4*/ { "fbld", NONE, op1(XA), (const char *)db_Escf4 },
- /*5*/ { "fld", QUAD, 0, 0 },
- /*6*/ { "fbstp", NONE, 0, 0 },
- /*7*/ { "fstp", QUAD, 0, 0 },
- };
- static const struct finst * const db_Esc_inst[] = {
- db_Esc8, db_Esc9, db_Esca, db_Escb,
- db_Escc, db_Escd, db_Esce, db_Escf
- };
- static const char * const db_Grp1[] = {
- "add",
- "or",
- "adc",
- "sbb",
- "and",
- "sub",
- "xor",
- "cmp"
- };
- static const char * const db_Grp2[] = {
- "rol",
- "ror",
- "rcl",
- "rcr",
- "shl",
- "shr",
- "shl",
- "sar"
- };
- static const struct inst db_Grp3[] = {
- { "test", TRUE, NONE, op2(I,E), 0 },
- { "test", TRUE, NONE, op2(I,E), 0 },
- { "not", TRUE, NONE, op1(E), 0 },
- { "neg", TRUE, NONE, op1(E), 0 },
- { "mul", TRUE, NONE, op2(E,A), 0 },
- { "imul", TRUE, NONE, op2(E,A), 0 },
- { "div", TRUE, NONE, op2(E,A), 0 },
- { "idiv", TRUE, NONE, op2(E,A), 0 },
- };
- static const struct inst db_Grp4[] = {
- { "inc", TRUE, BYTE, op1(E), 0 },
- { "dec", TRUE, BYTE, op1(E), 0 },
- { "", TRUE, NONE, 0, 0 },
- { "", TRUE, NONE, 0, 0 },
- { "", TRUE, NONE, 0, 0 },
- { "", TRUE, NONE, 0, 0 },
- { "", TRUE, NONE, 0, 0 },
- { "", TRUE, NONE, 0, 0 }
- };
- static const struct inst db_Grp5[] = {
- { "inc", TRUE, LONG, op1(E), 0 },
- { "dec", TRUE, LONG, op1(E), 0 },
- { "call", TRUE, NONE, op1(Eind),0 },
- { "lcall", TRUE, NONE, op1(Eind),0 },
- { "jmp", TRUE, NONE, op1(Eind),0 },
- { "ljmp", TRUE, NONE, op1(Eind),0 },
- { "push", TRUE, LONG, op1(E), 0 },
- { "", TRUE, NONE, 0, 0 }
- };
- static const struct inst db_inst_table[256] = {
- /*00*/ { "add", TRUE, BYTE, op2(R, E), 0 },
- /*01*/ { "add", TRUE, LONG, op2(R, E), 0 },
- /*02*/ { "add", TRUE, BYTE, op2(E, R), 0 },
- /*03*/ { "add", TRUE, LONG, op2(E, R), 0 },
- /*04*/ { "add", FALSE, BYTE, op2(Is, A), 0 },
- /*05*/ { "add", FALSE, LONG, op2(Is, A), 0 },
- /*06*/ { "push", FALSE, NONE, op1(Si), 0 },
- /*07*/ { "pop", FALSE, NONE, op1(Si), 0 },
- /*08*/ { "or", TRUE, BYTE, op2(R, E), 0 },
- /*09*/ { "or", TRUE, LONG, op2(R, E), 0 },
- /*0a*/ { "or", TRUE, BYTE, op2(E, R), 0 },
- /*0b*/ { "or", TRUE, LONG, op2(E, R), 0 },
- /*0c*/ { "or", FALSE, BYTE, op2(I, A), 0 },
- /*0d*/ { "or", FALSE, LONG, op2(I, A), 0 },
- /*0e*/ { "push", FALSE, NONE, op1(Si), 0 },
- /*0f*/ { "", FALSE, NONE, 0, 0 },
- /*10*/ { "adc", TRUE, BYTE, op2(R, E), 0 },
- /*11*/ { "adc", TRUE, LONG, op2(R, E), 0 },
- /*12*/ { "adc", TRUE, BYTE, op2(E, R), 0 },
- /*13*/ { "adc", TRUE, LONG, op2(E, R), 0 },
- /*14*/ { "adc", FALSE, BYTE, op2(Is, A), 0 },
- /*15*/ { "adc", FALSE, LONG, op2(Is, A), 0 },
- /*16*/ { "push", FALSE, NONE, op1(Si), 0 },
- /*17*/ { "pop", FALSE, NONE, op1(Si), 0 },
- /*18*/ { "sbb", TRUE, BYTE, op2(R, E), 0 },
- /*19*/ { "sbb", TRUE, LONG, op2(R, E), 0 },
- /*1a*/ { "sbb", TRUE, BYTE, op2(E, R), 0 },
- /*1b*/ { "sbb", TRUE, LONG, op2(E, R), 0 },
- /*1c*/ { "sbb", FALSE, BYTE, op2(Is, A), 0 },
- /*1d*/ { "sbb", FALSE, LONG, op2(Is, A), 0 },
- /*1e*/ { "push", FALSE, NONE, op1(Si), 0 },
- /*1f*/ { "pop", FALSE, NONE, op1(Si), 0 },
- /*20*/ { "and", TRUE, BYTE, op2(R, E), 0 },
- /*21*/ { "and", TRUE, LONG, op2(R, E), 0 },
- /*22*/ { "and", TRUE, BYTE, op2(E, R), 0 },
- /*23*/ { "and", TRUE, LONG, op2(E, R), 0 },
- /*24*/ { "and", FALSE, BYTE, op2(I, A), 0 },
- /*25*/ { "and", FALSE, LONG, op2(I, A), 0 },
- /*26*/ { "", FALSE, NONE, 0, 0 },
- /*27*/ { "aaa", FALSE, NONE, 0, 0 },
- /*28*/ { "sub", TRUE, BYTE, op2(R, E), 0 },
- /*29*/ { "sub", TRUE, LONG, op2(R, E), 0 },
- /*2a*/ { "sub", TRUE, BYTE, op2(E, R), 0 },
- /*2b*/ { "sub", TRUE, LONG, op2(E, R), 0 },
- /*2c*/ { "sub", FALSE, BYTE, op2(Is, A), 0 },
- /*2d*/ { "sub", FALSE, LONG, op2(Is, A), 0 },
- /*2e*/ { "", FALSE, NONE, 0, 0 },
- /*2f*/ { "das", FALSE, NONE, 0, 0 },
- /*30*/ { "xor", TRUE, BYTE, op2(R, E), 0 },
- /*31*/ { "xor", TRUE, LONG, op2(R, E), 0 },
- /*32*/ { "xor", TRUE, BYTE, op2(E, R), 0 },
- /*33*/ { "xor", TRUE, LONG, op2(E, R), 0 },
- /*34*/ { "xor", FALSE, BYTE, op2(I, A), 0 },
- /*35*/ { "xor", FALSE, LONG, op2(I, A), 0 },
- /*36*/ { "", FALSE, NONE, 0, 0 },
- /*37*/ { "daa", FALSE, NONE, 0, 0 },
- /*38*/ { "cmp", TRUE, BYTE, op2(R, E), 0 },
- /*39*/ { "cmp", TRUE, LONG, op2(R, E), 0 },
- /*3a*/ { "cmp", TRUE, BYTE, op2(E, R), 0 },
- /*3b*/ { "cmp", TRUE, LONG, op2(E, R), 0 },
- /*3c*/ { "cmp", FALSE, BYTE, op2(Is, A), 0 },
- /*3d*/ { "cmp", FALSE, LONG, op2(Is, A), 0 },
- /*3e*/ { "", FALSE, NONE, 0, 0 },
- /*3f*/ { "aas", FALSE, NONE, 0, 0 },
- /*40*/ { "inc", FALSE, LONG, op1(Ri), 0 },
- /*41*/ { "inc", FALSE, LONG, op1(Ri), 0 },
- /*42*/ { "inc", FALSE, LONG, op1(Ri), 0 },
- /*43*/ { "inc", FALSE, LONG, op1(Ri), 0 },
- /*44*/ { "inc", FALSE, LONG, op1(Ri), 0 },
- /*45*/ { "inc", FALSE, LONG, op1(Ri), 0 },
- /*46*/ { "inc", FALSE, LONG, op1(Ri), 0 },
- /*47*/ { "inc", FALSE, LONG, op1(Ri), 0 },
- /*48*/ { "dec", FALSE, LONG, op1(Ri), 0 },
- /*49*/ { "dec", FALSE, LONG, op1(Ri), 0 },
- /*4a*/ { "dec", FALSE, LONG, op1(Ri), 0 },
- /*4b*/ { "dec", FALSE, LONG, op1(Ri), 0 },
- /*4c*/ { "dec", FALSE, LONG, op1(Ri), 0 },
- /*4d*/ { "dec", FALSE, LONG, op1(Ri), 0 },
- /*4e*/ { "dec", FALSE, LONG, op1(Ri), 0 },
- /*4f*/ { "dec", FALSE, LONG, op1(Ri), 0 },
- /*50*/ { "push", FALSE, LONG, op1(Ri), 0 },
- /*51*/ { "push", FALSE, LONG, op1(Ri), 0 },
- /*52*/ { "push", FALSE, LONG, op1(Ri), 0 },
- /*53*/ { "push", FALSE, LONG, op1(Ri), 0 },
- /*54*/ { "push", FALSE, LONG, op1(Ri), 0 },
- /*55*/ { "push", FALSE, LONG, op1(Ri), 0 },
- /*56*/ { "push", FALSE, LONG, op1(Ri), 0 },
- /*57*/ { "push", FALSE, LONG, op1(Ri), 0 },
- /*58*/ { "pop", FALSE, LONG, op1(Ri), 0 },
- /*59*/ { "pop", FALSE, LONG, op1(Ri), 0 },
- /*5a*/ { "pop", FALSE, LONG, op1(Ri), 0 },
- /*5b*/ { "pop", FALSE, LONG, op1(Ri), 0 },
- /*5c*/ { "pop", FALSE, LONG, op1(Ri), 0 },
- /*5d*/ { "pop", FALSE, LONG, op1(Ri), 0 },
- /*5e*/ { "pop", FALSE, LONG, op1(Ri), 0 },
- /*5f*/ { "pop", FALSE, LONG, op1(Ri), 0 },
- /*60*/ { "pusha", FALSE, LONG, 0, 0 },
- /*61*/ { "popa", FALSE, LONG, 0, 0 },
- /*62*/ { "bound", TRUE, LONG, op2(E, R), 0 },
- /*63*/ { "arpl", TRUE, NONE, op2(Ew,Rw), 0 },
- /*64*/ { "", FALSE, NONE, 0, 0 },
- /*65*/ { "", FALSE, NONE, 0, 0 },
- /*66*/ { "", FALSE, NONE, 0, 0 },
- /*67*/ { "", FALSE, NONE, 0, 0 },
- /*68*/ { "push", FALSE, LONG, op1(I), 0 },
- /*69*/ { "imul", TRUE, LONG, op3(I,E,R), 0 },
- /*6a*/ { "push", FALSE, LONG, op1(Ib), 0 },
- /*6b*/ { "imul", TRUE, LONG, op3(Ibs,E,R),0 },
- /*6c*/ { "ins", FALSE, BYTE, op2(DX, DI), 0 },
- /*6d*/ { "ins", FALSE, LONG, op2(DX, DI), 0 },
- /*6e*/ { "outs", FALSE, BYTE, op2(SI, DX), 0 },
- /*6f*/ { "outs", FALSE, LONG, op2(SI, DX), 0 },
- /*70*/ { "jo", FALSE, NONE, op1(Db), 0 },
- /*71*/ { "jno", FALSE, NONE, op1(Db), 0 },
- /*72*/ { "jb", FALSE, NONE, op1(Db), 0 },
- /*73*/ { "jnb", FALSE, NONE, op1(Db), 0 },
- /*74*/ { "jz", FALSE, NONE, op1(Db), 0 },
- /*75*/ { "jnz", FALSE, NONE, op1(Db), 0 },
- /*76*/ { "jbe", FALSE, NONE, op1(Db), 0 },
- /*77*/ { "jnbe", FALSE, NONE, op1(Db), 0 },
- /*78*/ { "js", FALSE, NONE, op1(Db), 0 },
- /*79*/ { "jns", FALSE, NONE, op1(Db), 0 },
- /*7a*/ { "jp", FALSE, NONE, op1(Db), 0 },
- /*7b*/ { "jnp", FALSE, NONE, op1(Db), 0 },
- /*7c*/ { "jl", FALSE, NONE, op1(Db), 0 },
- /*7d*/ { "jnl", FALSE, NONE, op1(Db), 0 },
- /*7e*/ { "jle", FALSE, NONE, op1(Db), 0 },
- /*7f*/ { "jnle", FALSE, NONE, op1(Db), 0 },
- /*80*/ { "", TRUE, BYTE, op2(I, E), (const char *)db_Grp1 },
- /*81*/ { "", TRUE, LONG, op2(I, E), (const char *)db_Grp1 },
- /*82*/ { "", TRUE, BYTE, op2(Is,E), (const char *)db_Grp1 },
- /*83*/ { "", TRUE, LONG, op2(Ibs,E), (const char *)db_Grp1 },
- /*84*/ { "test", TRUE, BYTE, op2(R, E), 0 },
- /*85*/ { "test", TRUE, LONG, op2(R, E), 0 },
- /*86*/ { "xchg", TRUE, BYTE, op2(R, E), 0 },
- /*87*/ { "xchg", TRUE, LONG, op2(R, E), 0 },
- /*88*/ { "mov", TRUE, BYTE, op2(R, E), 0 },
- /*89*/ { "mov", TRUE, LONG, op2(R, E), 0 },
- /*8a*/ { "mov", TRUE, BYTE, op2(E, R), 0 },
- /*8b*/ { "mov", TRUE, LONG, op2(E, R), 0 },
- /*8c*/ { "mov", TRUE, NONE, op2(S, Ew), 0 },
- /*8d*/ { "lea", TRUE, LONG, op2(E, R), 0 },
- /*8e*/ { "mov", TRUE, NONE, op2(Ew, S), 0 },
- /*8f*/ { "pop", TRUE, LONG, op1(E), 0 },
- /*90*/ { "nop", FALSE, NONE, 0, 0 },
- /*91*/ { "xchg", FALSE, LONG, op2(A, Ri), 0 },
- /*92*/ { "xchg", FALSE, LONG, op2(A, Ri), 0 },
- /*93*/ { "xchg", FALSE, LONG, op2(A, Ri), 0 },
- /*94*/ { "xchg", FALSE, LONG, op2(A, Ri), 0 },
- /*95*/ { "xchg", FALSE, LONG, op2(A, Ri), 0 },
- /*96*/ { "xchg", FALSE, LONG, op2(A, Ri), 0 },
- /*97*/ { "xchg", FALSE, LONG, op2(A, Ri), 0 },
- /*98*/ { "cbw", FALSE, SDEP, 0, "cwde" }, /* cbw/cwde */
- /*99*/ { "cwd", FALSE, SDEP, 0, "cdq" }, /* cwd/cdq */
- /*9a*/ { "lcall", FALSE, NONE, op1(OS), 0 },
- /*9b*/ { "wait", FALSE, NONE, 0, 0 },
- /*9c*/ { "pushf", FALSE, LONG, 0, 0 },
- /*9d*/ { "popf", FALSE, LONG, 0, 0 },
- /*9e*/ { "sahf", FALSE, NONE, 0, 0 },
- /*9f*/ { "lahf", FALSE, NONE, 0, 0 },
- /*a0*/ { "mov", FALSE, BYTE, op2(O, A), 0 },
- /*a1*/ { "mov", FALSE, LONG, op2(O, A), 0 },
- /*a2*/ { "mov", FALSE, BYTE, op2(A, O), 0 },
- /*a3*/ { "mov", FALSE, LONG, op2(A, O), 0 },
- /*a4*/ { "movs", FALSE, BYTE, op2(SI,DI), 0 },
- /*a5*/ { "movs", FALSE, LONG, op2(SI,DI), 0 },
- /*a6*/ { "cmps", FALSE, BYTE, op2(SI,DI), 0 },
- /*a7*/ { "cmps", FALSE, LONG, op2(SI,DI), 0 },
- /*a8*/ { "test", FALSE, BYTE, op2(I, A), 0 },
- /*a9*/ { "test", FALSE, LONG, op2(I, A), 0 },
- /*aa*/ { "stos", FALSE, BYTE, op1(DI), 0 },
- /*ab*/ { "stos", FALSE, LONG, op1(DI), 0 },
- /*ac*/ { "lods", FALSE, BYTE, op1(SI), 0 },
- /*ad*/ { "lods", FALSE, LONG, op1(SI), 0 },
- /*ae*/ { "scas", FALSE, BYTE, op1(DI), 0 },
- /*af*/ { "scas", FALSE, LONG, op1(DI), 0 },
- /*b0*/ { "mov", FALSE, BYTE, op2(I, Ri), 0 },
- /*b1*/ { "mov", FALSE, BYTE, op2(I, Ri), 0 },
- /*b2*/ { "mov", FALSE, BYTE, op2(I, Ri), 0 },
- /*b3*/ { "mov", FALSE, BYTE, op2(I, Ri), 0 },
- /*b4*/ { "mov", FALSE, BYTE, op2(I, Ri), 0 },
- /*b5*/ { "mov", FALSE, BYTE, op2(I, Ri), 0 },
- /*b6*/ { "mov", FALSE, BYTE, op2(I, Ri), 0 },
- /*b7*/ { "mov", FALSE, BYTE, op2(I, Ri), 0 },
- /*b8*/ { "mov", FALSE, LONG, op2(I, Ri), 0 },
- /*b9*/ { "mov", FALSE, LONG, op2(I, Ri), 0 },
- /*ba*/ { "mov", FALSE, LONG, op2(I, Ri), 0 },
- /*bb*/ { "mov", FALSE, LONG, op2(I, Ri), 0 },
- /*bc*/ { "mov", FALSE, LONG, op2(I, Ri), 0 },
- /*bd*/ { "mov", FALSE, LONG, op2(I, Ri), 0 },
- /*be*/ { "mov", FALSE, LONG, op2(I, Ri), 0 },
- /*bf*/ { "mov", FALSE, LONG, op2(I, Ri), 0 },
- /*c0*/ { "", TRUE, BYTE, op2(Ib, E), (const char *)db_Grp2 },
- /*c1*/ { "", TRUE, LONG, op2(Ib, E), (const char *)db_Grp2 },
- /*c2*/ { "ret", FALSE, NONE, op1(Iw), 0 },
- /*c3*/ { "ret", FALSE, NONE, 0, 0 },
- /*c4*/ { "les", TRUE, LONG, op2(E, R), 0 },
- /*c5*/ { "lds", TRUE, LONG, op2(E, R), 0 },
- /*c6*/ { "mov", TRUE, BYTE, op2(I, E), 0 },
- /*c7*/ { "mov", TRUE, LONG, op2(I, E), 0 },
- /*c8*/ { "enter", FALSE, NONE, op2(Iw, Ib), 0 },
- /*c9*/ { "leave", FALSE, NONE, 0, 0 },
- /*ca*/ { "lret", FALSE, NONE, op1(Iw), 0 },
- /*cb*/ { "lret", FALSE, NONE, 0, 0 },
- /*cc*/ { "int", FALSE, NONE, op1(o3), 0 },
- /*cd*/ { "int", FALSE, NONE, op1(Ib), 0 },
- /*ce*/ { "into", FALSE, NONE, 0, 0 },
- /*cf*/ { "iret", FALSE, NONE, 0, 0 },
- /*d0*/ { "", TRUE, BYTE, op2(o1, E), (const char *)db_Grp2 },
- /*d1*/ { "", TRUE, LONG, op2(o1, E), (const char *)db_Grp2 },
- /*d2*/ { "", TRUE, BYTE, op2(CL, E), (const char *)db_Grp2 },
- /*d3*/ { "", TRUE, LONG, op2(CL, E), (const char *)db_Grp2 },
- /*d4*/ { "aam", TRUE, NONE, 0, 0 },
- /*d5*/ { "aad", TRUE, NONE, 0, 0 },
- /*d6*/ { "", FALSE, NONE, 0, 0 },
- /*d7*/ { "xlat", FALSE, BYTE, op1(BX), 0 },
- /*d8*/ { "", TRUE, NONE, 0, (const char *)db_Esc8 },
- /*d9*/ { "", TRUE, NONE, 0, (const char *)db_Esc9 },
- /*da*/ { "", TRUE, NONE, 0, (const char *)db_Esca },
- /*db*/ { "", TRUE, NONE, 0, (const char *)db_Escb },
- /*dc*/ { "", TRUE, NONE, 0, (const char *)db_Escc },
- /*dd*/ { "", TRUE, NONE, 0, (const char *)db_Escd },
- /*de*/ { "", TRUE, NONE, 0, (const char *)db_Esce },
- /*df*/ { "", TRUE, NONE, 0, (const char *)db_Escf },
- /*e0*/ { "loopne",FALSE, NONE, op1(Db), 0 },
- /*e1*/ { "loope", FALSE, NONE, op1(Db), 0 },
- /*e2*/ { "loop", FALSE, NONE, op1(Db), 0 },
- /*e3*/ { "jcxz", FALSE, SDEP, op1(Db), "jecxz" },
- /*e4*/ { "in", FALSE, BYTE, op2(Ib, A), 0 },
- /*e5*/ { "in", FALSE, LONG, op2(Ib, A) , 0 },
- /*e6*/ { "out", FALSE, BYTE, op2(A, Ib), 0 },
- /*e7*/ { "out", FALSE, LONG, op2(A, Ib) , 0 },
- /*e8*/ { "call", FALSE, NONE, op1(Dl), 0 },
- /*e9*/ { "jmp", FALSE, NONE, op1(Dl), 0 },
- /*ea*/ { "ljmp", FALSE, NONE, op1(OS), 0 },
- /*eb*/ { "jmp", FALSE, NONE, op1(Db), 0 },
- /*ec*/ { "in", FALSE, BYTE, op2(DX, A), 0 },
- /*ed*/ { "in", FALSE, LONG, op2(DX, A) , 0 },
- /*ee*/ { "out", FALSE, BYTE, op2(A, DX), 0 },
- /*ef*/ { "out", FALSE, LONG, op2(A, DX) , 0 },
- /*f0*/ { "", FALSE, NONE, 0, 0 },
- /*f1*/ { "icebp", FALSE, NONE, 0, 0 },
- /*f2*/ { "", FALSE, NONE, 0, 0 },
- /*f3*/ { "", FALSE, NONE, 0, 0 },
- /*f4*/ { "hlt", FALSE, NONE, 0, 0 },
- /*f5*/ { "cmc", FALSE, NONE, 0, 0 },
- /*f6*/ { "", TRUE, BYTE, 0, (const char *)db_Grp3 },
- /*f7*/ { "", TRUE, LONG, 0, (const char *)db_Grp3 },
- /*f8*/ { "clc", FALSE, NONE, 0, 0 },
- /*f9*/ { "stc", FALSE, NONE, 0, 0 },
- /*fa*/ { "cli", FALSE, NONE, 0, 0 },
- /*fb*/ { "sti", FALSE, NONE, 0, 0 },
- /*fc*/ { "cld", FALSE, NONE, 0, 0 },
- /*fd*/ { "std", FALSE, NONE, 0, 0 },
- /*fe*/ { "", TRUE, NONE, 0, (const char *)db_Grp4 },
- /*ff*/ { "", TRUE, NONE, 0, (const char *)db_Grp5 },
- };
- static const struct inst db_bad_inst =
- { "???", FALSE, NONE, 0, 0 }
- ;
- #define f_mod(byte) ((byte)>>6)
- #define f_reg(byte) (((byte)>>3)&0x7)
- #define f_rm(byte) ((byte)&0x7)
- #define sib_ss(byte) ((byte)>>6)
- #define sib_index(byte) (((byte)>>3)&0x7)
- #define sib_base(byte) ((byte)&0x7)
- struct i_addr {
- int is_reg; /* if reg, reg number is in 'disp' */
- int disp;
- const char * base;
- const char * index;
- int ss;
- };
- static const char * const db_index_reg_16[8] = {
- "%bx,%si",
- "%bx,%di",
- "%bp,%si",
- "%bp,%di",
- "%si",
- "%di",
- "%bp",
- "%bx"
- };
- static const char * const db_reg[5][8] = {
- /*BYTE*/{ "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh" },
- /*WORD*/{ "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di" },
- /*LONG*/{ "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi" },
- /*QUAD*/{ "%mm0", "%mm1", "%mm2", "%mm3", "%mm4", "%mm5", "%mm6", "%mm7" },
- /*DQUA*/{ "%xmm0","%xmm1","%xmm2","%xmm3","%xmm4","%xmm5","%xmm6","%xmm7" }
- };
- static const char * const db_seg_reg[8] = {
- "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "", ""
- };
- /*
- * lengths for size attributes
- */
- static const int db_lengths[] = {
- 1, /* BYTE */
- 2, /* WORD */
- 4, /* LONG */
- 8, /* QUAD */
- 16, /* DQUA */
- 4, /* SNGL */
- 8, /* DBLR */
- 10, /* EXTR */
- };
- static unsigned int db_get_task_value( const ADDRESS64* addr,
- int size, int is_signed )
- {
- unsigned int result = 0;
- char buffer[4];
- if (size != 1 && size != 2 && size != 4)
- {
- dbg_printf("Illegal size specified\n");
- }
- else
- {
- dbg_read_memory(memory_to_linear_addr(addr), buffer, size);
- switch (size)
- {
- case 4:
- if (is_signed) result = (unsigned int) *(int *)buffer;
- else result = *(unsigned int *)buffer;
- break;
- case 2:
- if (is_signed) result = (unsigned int) *(short int *)buffer;
- else result = *(unsigned short int *)buffer;
- break;
- case 1:
- if (is_signed) result = (unsigned int) *(char *)buffer;
- else result = *(unsigned char *)buffer;
- break;
- }
- }
- return result;
- }
- #define get_value_inc(result, addr, size, is_signed) \
- result = db_get_task_value((addr), (size), (is_signed)); \
- if (!db_disasm_16) (addr)->Offset += (size); \
- else (addr)->Offset = ((addr)->Offset + (size)) & 0xffff;
- /*
- * Read address at location and return updated location.
- */
- static void db_read_address( ADDRESS64* addr, int short_addr, int regmodrm,
- struct i_addr *addrp )
- {
- int mod, rm, sib, index, disp;
- mod = f_mod(regmodrm);
- rm = f_rm(regmodrm);
- if (mod == 3) {
- addrp->is_reg = TRUE;
- addrp->disp = rm;
- return;
- }
- addrp->is_reg = FALSE;
- addrp->index = 0;
- if (short_addr) {
- addrp->index = 0;
- addrp->ss = 0;
- switch (mod) {
- case 0:
- if (rm == 6) {
- get_value_inc(disp, addr, 2, TRUE);
- addrp->disp = disp;
- addrp->base = 0;
- }
- else {
- addrp->disp = 0;
- addrp->base = db_index_reg_16[rm];
- }
- break;
- case 1:
- get_value_inc(disp, addr, 1, TRUE);
- addrp->disp = disp;
- addrp->base = db_index_reg_16[rm];
- break;
- case 2:
- get_value_inc(disp, addr, 2, TRUE);
- addrp->disp = disp;
- addrp->base = db_index_reg_16[rm];
- break;
- }
- }
- else {
- if (mod != 3 && rm == 4) {
- get_value_inc(sib, addr, 1, FALSE);
- rm = sib_base(sib);
- index = sib_index(sib);
- if (index != 4)
- addrp->index = db_reg[LONG][index];
- addrp->ss = sib_ss(sib);
- }
- switch (mod) {
- case 0:
- if (rm == 5) {
- get_value_inc(addrp->disp, addr, 4, FALSE);
- addrp->base = 0;
- }
- else {
- addrp->disp = 0;
- addrp->base = db_reg[LONG][rm];
- }
- break;
- case 1:
- get_value_inc(disp, addr, 1, TRUE);
- addrp->disp = disp;
- addrp->base = db_reg[LONG][rm];
- break;
- case 2:
- get_value_inc(disp, addr, 4, FALSE);
- addrp->disp = disp;
- addrp->base = db_reg[LONG][rm];
- break;
- }
- }
- }
- static void db_task_printsym(unsigned int addr, int size)
- {
- ADDRESS64 a;
- a.Mode = AddrModeFlat;
- a.Offset = addr;
- print_address(&a, TRUE);
- }
- static void db_print_address(const char *seg, int size, struct i_addr *addrp, int byref)
- {
- if (addrp->is_reg) {
- dbg_printf("%s", db_reg[size][addrp->disp]);
- return;
- }
- if (seg) {
- dbg_printf("%s:", seg);
- }
- if (addrp->base != 0 || addrp->index != 0) {
- dbg_printf("0x%x(", addrp->disp);
- if (addrp->base)
- dbg_printf("%s", addrp->base);
- if (addrp->index)
- dbg_printf(",%s,%d", addrp->index, 1<<addrp->ss);
- dbg_printf(")");
- }
- else {
- /* try to get destination of indirect call
- does not work for segmented addresses */
- if (!seg && byref) {
- void* a1;
- void* a2;
-
- dbg_printf("0x%x -> ", addrp->disp);
- if (!dbg_read_memory((void*)(INT_PTR)addrp->disp, &a1, sizeof(a1))) {
- dbg_printf("(invalid source)");
- } else if (!dbg_read_memory(a1, &a2, sizeof(a2))) {
- dbg_printf("(invalid destination)");
- } else {
- db_task_printsym((ULONG_PTR)a1, 0);
- }
- }
- else
- db_task_printsym(addrp->disp, size);
- }
- }
- /*
- * Disassemble floating-point ("escape") instruction
- * and return updated location.
- */
- static void db_disasm_esc( ADDRESS64* addr, int inst, int short_addr,
- int size, const char *seg )
- {
- int regmodrm;
- const struct finst *fp;
- int mod;
- struct i_addr address;
- const char * name;
- get_value_inc(regmodrm, addr, 1, FALSE);
- if( !db_display )
- {
- return;
- }
- fp = &db_Esc_inst[inst - 0xd8][f_reg(regmodrm)];
- mod = f_mod(regmodrm);
- if (mod != 3) {
- const char* p;
- /*
- * Normal address modes.
- */
- db_read_address( addr, short_addr, regmodrm, &address);
- dbg_printf("%s", fp->f_name);
- switch(fp->f_size) {
- case SNGL: p = "s"; break;
- case DBLR: p = "l"; break;
- case EXTR: p = "t"; break;
- case WORD: p = "s"; break;
- case LONG: p = "l"; break;
- case QUAD: p = "q"; break;
- default: p = ""; break;
- }
- dbg_printf("%s\t", p);
- db_print_address(seg, BYTE, &address, 0);
- }
- else {
- /*
- * 'reg-reg' - special formats
- */
- switch (fp->f_rrmode) {
- case op2(ST,STI):
- name = (fp->f_rrname) ? fp->f_rrname : fp->f_name;
- dbg_printf("%s\t%%st,%%st(%d)",name,f_rm(regmodrm));
- break;
- case op2(STI,ST):
- name = (fp->f_rrname) ? fp->f_rrname : fp->f_name;
- dbg_printf("%s\t%%st(%d),%%st",name, f_rm(regmodrm));
- break;
- case op1(STI):
- name = (fp->f_rrname) ? fp->f_rrname : fp->f_name;
- dbg_printf("%s\t%%st(%d)",name, f_rm(regmodrm));
- break;
- case op1(X):
- dbg_printf("%s", ((char * const*)fp->f_rrname)[f_rm(regmodrm)]);
- break;
- case op1(XA):
- dbg_printf("%s\t%%ax", ((char * const*)fp->f_rrname)[f_rm(regmodrm)]);
- break;
- default:
- dbg_printf("<bad instruction>");
- break;
- }
- }
- }
- /***********************************************************************
- * disasm_one_insn
- *
- * Disassemble instruction at 'addr'. addr is changed to point to the
- * start of the next instruction.
- */
- void be_i386_disasm_one_insn(ADDRESS64 *addr, int display)
- {
- int inst;
- int size;
- int short_addr;
- const char *seg;
- const struct inst *ip;
- const char *i_name;
- int i_size;
- int i_mode;
- int regmodrm = 0;
- BOOL first;
- int displ;
- int prefix;
- int imm;
- int len;
- struct i_addr address;
- /*
- * Set this so we can suppress the printout if we need to.
- */
- db_display = display;
- switch (addr->Mode)
- {
- case AddrModeReal:
- case AddrMode1616: db_disasm_16 = 1; break;
- default: db_disasm_16 = 0; break;
- }
- get_value_inc( inst, addr, 1, FALSE );
- if (db_disasm_16) {
- short_addr = TRUE;
- size = WORD;
- }
- else {
- short_addr = FALSE;
- size = LONG;
- }
- seg = 0;
- /*
- * Get prefixes
- */
- prefix = TRUE;
- do {
- switch (inst) {
- case 0x66: /* data16 */
- if (size == LONG)
- size = WORD;
- else
- size = LONG;
- break;
- case 0x67:
- short_addr = !short_addr;
- break;
- case 0x26:
- seg = "%es";
- break;
- case 0x36:
- seg = "%ss";
- break;
- case 0x2e:
- seg = "%cs";
- break;
- case 0x3e:
- seg = "%ds";
- break;
- case 0x64:
- seg = "%fs";
- break;
- case 0x65:
- seg = "%gs";
- break;
- case 0xf0:
- if( db_display )
- dbg_printf("lock ");
- break;
- case 0xf2:
- if( db_display )
- dbg_printf("repne ");
- break;
- case 0xf3:
- if( db_display )
- dbg_printf("repe "); /* XXX repe VS rep */
- break;
- default:
- prefix = FALSE;
- break;
- }
- if (prefix) {
- get_value_inc(inst, addr, 1, FALSE);
- }
- } while (prefix);
- if (inst >= 0xd8 && inst <= 0xdf)
- {
- db_disasm_esc( addr, inst, short_addr, size, seg);
- return;
- }
- if (inst == 0x0f) {
- get_value_inc(inst, addr, 1, FALSE);
- ip = db_inst_0f[inst>>4];
- if (ip == 0) {
- ip = &db_bad_inst;
- }
- else {
- ip = &ip[inst&0xf];
- }
- }
- else
- ip = &db_inst_table[inst];
- if (ip->i_has_modrm) {
- get_value_inc(regmodrm, addr, 1, FALSE);
- db_read_address( addr, short_addr, regmodrm, &address);
- }
- i_name = ip->i_name;
- i_size = ip->i_size;
- i_mode = ip->i_mode;
- if (ip->i_extra == (const char *)db_Grp1 ||
- ip->i_extra == (const char *)db_Grp2 ||
- ip->i_extra == (const char *)db_Grp6 ||
- ip->i_extra == (const char *)db_Grp7 ||
- ip->i_extra == (const char *)db_Grp8 ||
- ip->i_extra == (const char *)db_Grp10 ||
- ip->i_extra == (const char *)db_Grp11 ||
- ip->i_extra == (const char *)db_Grp12) {
- i_name = ((const char * const*)ip->i_extra)[f_reg(regmodrm)];
- }
- else if (ip->i_extra == (const char *)db_Grp3) {
- ip = (const struct inst *)ip->i_extra;
- ip = &ip[f_reg(regmodrm)];
- i_name = ip->i_name;
- i_mode = ip->i_mode;
- }
- else if (ip->i_extra == (const char *)db_Grp4 ||
- ip->i_extra == (const char *)db_Grp5) {
- ip = (const struct inst *)ip->i_extra;
- ip = &ip[f_reg(regmodrm)];
- i_name = ip->i_name;
- i_mode = ip->i_mode;
- i_size = ip->i_size;
- }
- if (i_size == SDEP) {
- if( db_display )
- {
- if (size == WORD)
- dbg_printf("%s", i_name);
- else
- dbg_printf("%s", ip->i_extra);
- }
- }
- else {
- if( db_display )
- {
- dbg_printf("%s", i_name);
- }
- if (i_size != NONE) {
- if (i_size == BYTE) {
- if( db_display )
- {
- dbg_printf("b");
- }
- size = BYTE;
- }
- else if (i_size == WORD) {
- if( db_display )
- {
- dbg_printf("w");
- }
- size = WORD;
- }
- else if (size == WORD)
- {
- if( db_display )
- {
- dbg_printf("w");
- }
- }
- else
- {
- if( db_display )
- {
- dbg_printf("l");
- }
- }
- }
- }
- if( db_display )
- {
- dbg_printf("\t");
- }
- for (first = TRUE;
- i_mode != 0;
- i_mode >>= 8, first = FALSE)
- {
- if (!first && db_display)
- dbg_printf(",");
- switch (i_mode & 0xFF) {
- case E:
- if( db_display )
- {
- db_print_address(seg, size, &address, 0);
- }
- break;
- case Eind:
- if( db_display )
- {
- dbg_printf("*");
- db_print_address(seg, size, &address, 1);
- }
- break;
- case Ew:
- if( db_display )
- {
- db_print_address(seg, WORD, &address, 0);
- }
- break;
- case Eb:
- if( db_display )
- {
- db_print_address(seg, BYTE, &address, 0);
- }
- break;
- case R:
- if( db_display )
- {
- dbg_printf("%s", db_reg[size][f_reg(regmodrm)]);
- }
- break;
- case MX:
- if( db_display )
- {
- dbg_printf("%%mm%d", f_reg(regmodrm));
- }
- break;
- case EMX:
- if( db_display )
- {
- db_print_address(seg, QUAD, &address, 0);
- }
- break;
- case XMM:
- if( db_display )
- {
- dbg_printf("%%xmm%d", f_reg(regmodrm));
- }
- break;
- case EXMM:
- if( db_display )
- {
- db_print_address(seg, DQUA, &address, 0);
- }
- break;
- case Rw:
- if( db_display )
- {
- dbg_printf("%s", db_reg[WORD][f_reg(regmodrm)]);
- }
- break;
- case Ri:
- if( db_display )
- {
- dbg_printf("%s", db_reg[size][f_rm(inst)]);
- }
- break;
- case S:
- if( db_display )
- {
- dbg_printf("%s", db_seg_reg[f_reg(regmodrm)]);
- }
- break;
- case Si:
- if( db_display )
- {
- dbg_printf("%s", db_seg_reg[f_reg(inst)]);
- }
- break;
- case A:
- if( db_display )
- {
- dbg_printf("%s", db_reg[size][0]); /* acc */
- }
- break;
- case BX:
- if( db_display )
- {
- if (seg)
- dbg_printf("%s:", seg);
- dbg_printf("(%s)", short_addr ? "%bx" : "%ebx");
- }
- break;
- case CL:
- if( db_display )
- {
- dbg_printf("%%cl");
- }
- break;
- case DX:
- if( db_display )
- {
- dbg_printf("%%dx");
- }
- break;
- case SI:
- if( db_display )
- {
- if (seg)
- dbg_printf("%s:", seg);
- dbg_printf("(%s)", short_addr ? "%si" : "%esi");
- }
- break;
- case DI:
- if( db_display )
- {
- dbg_printf("%%es:(%s)", short_addr ? "%di" : "%edi");
- }
- break;
- case CR:
- if( db_display )
- {
- dbg_printf("%%cr%d", f_reg(regmodrm));
- }
- break;
- case DR:
- if( db_display )
- {
- dbg_printf("%%dr%d", f_reg(regmodrm));
- }
- break;
- case TR:
- if( db_display )
- {
- dbg_printf("%%tr%d", f_reg(regmodrm));
- }
- break;
- case I:
- len = db_lengths[size];
- get_value_inc(imm, addr, len, FALSE);/* unsigned */
- if( db_display )
- {
- dbg_printf("$0x%x", imm);
- }
- break;
- case Is:
- len = db_lengths[size];
- get_value_inc(imm, addr, len, TRUE); /* signed */
- if( db_display )
- {
- dbg_printf("$%d", imm);
- }
- break;
- case Ib:
- get_value_inc(imm, addr, 1, FALSE); /* unsigned */
- if( db_display )
- {
- dbg_printf("$0x%x", imm);
- }
- break;
- case Ibs:
- get_value_inc(imm, addr, 1, TRUE); /* signed */
- if( db_display )
- {
- dbg_printf("$%d", imm);
- }
- break;
- case Iw:
- get_value_inc(imm, addr, 2, FALSE); /* unsigned */
- if( db_display )
- {
- dbg_printf("$0x%x", imm);
- }
- break;
- case Il:
- get_value_inc(imm, addr, 4, FALSE);
- if( db_display )
- {
- dbg_printf("$0x%x", imm);
- }
- break;
- case O:
- if (short_addr) {
- get_value_inc(displ, addr, 2, TRUE);
- }
- else {
- get_value_inc(displ, addr, 4, TRUE);
- }
- if( !db_display )
- {
- break;
- }
- if (seg)
- dbg_printf("%s:0x%x",seg, displ);
- else
- db_task_printsym(displ, short_addr ? WORD : LONG);
- break;
- case Db:
- get_value_inc(displ, addr, 1, TRUE);
- if( !db_display )
- {
- break;
- }
- if (size == WORD) {
- /* offset only affects low 16 bits */
- displ = (addr->Offset & 0xffff0000)
- | ((addr->Offset + displ) & 0xffff);
- }
- else displ += addr->Offset;
- db_task_printsym(displ, size);
- break;
- case Dl:
- if (size == WORD) {
- get_value_inc(displ, addr, 2, TRUE);
- /* Offset only affects low 16 bits */
- displ = (addr->Offset & 0xffff0000)
- | ((addr->Offset + displ) & 0xffff);
- }
- else {
- get_value_inc(displ, addr, 4, TRUE);
- displ += addr->Offset;
- }
- if( !db_display )
- {
- break;
- }
- db_task_printsym( displ, size );
- break;
- case o1:
- if( db_display )
- {
- dbg_printf("$1");
- }
- break;
- case o3:
- if( db_display )
- {
- dbg_printf("$3");
- }
- break;
- case OS:
- {
- ADDRESS64 address;
- get_value_inc( address.Offset, addr, /* offset */
- short_addr ? 2 : 4, FALSE );
- get_value_inc( address.Segment, addr, /* segment */
- 2, FALSE );
- dbg_curr_process->be_cpu->build_addr(dbg_curr_thread->handle,
- &dbg_context, &address, address.Segment, address.Offset);
- if( db_display )
- {
- print_address( &address, TRUE );
- }
- }
- break;
- }
- }
- }
- #endif /* __i386__ */
|