|
|
1.1 root 1: /********************************** module *********************************/
2: /* */
3: /* disasmtb */
4: /* disassembler for CodeView */
5: /* */
6: /***************************************************************************/
7: /* */
8: /* @ Purpose: */
9: /* */
10: /* @ Functions included: */
11: /* */
12: /* */
13: /* @ Author: Gerd Immeyer @ Version: */
14: /* */
15: /* @ Creation Date: 10.19.89 @ Modification Date: */
16: /* */
17: /***************************************************************************/
18:
19:
20:
21: /* Strings: Operand mnemonics, Segment overrides, etc. for disasm */
22:
23: char dszAAA[] = "aaa";
24: char dszAAD[] = "aad";
25: char dszAAM[] = "aam";
26: char dszAAS[] = "aas";
27: char dszADC[] = "adc";
28: char dszADD[] = "add";
29: char dszADDRPRFX[] = "";
30: char dszAND[] = "and";
31: char dszARPL[] = "arpl";
32: char dszBOUND[] = "bound";
33: char dszBSF[] = "bsf";
34: char dszBSR[] = "bsr";
35: char dszBST[] = "bst";
36: char dszBSWAP[] = "bswap";
37: char dszBT[] = "bt";
38: char dszBTC[] = "btc";
39: char dszBTR[] = "btr";
40: char dszBTS[] = "bts";
41: char dszCALL[] = "call";
42: char dszCBW[] = "cbw";
43: char dszCDQ[] = "cdq";
44: char dszCLC[] = "clc";
45: char dszCLD[] = "cld";
46: char dszCLI[] = "cli";
47: char dszCLTS[] = "clts";
48: char dszCMC[] = "cmc";
49: char dszCMP[] = "cmp";
50: char dszCMPS[] = "cmps";
51: char dszCMPSB[] = "cmpsb";
52: char dszCMPSD[] = "cmpsd";
53: char dszCMPSW[] = "cmpsw";
54: char dszCMPXCHG[] = "cmpxchg";
55: char dszCMPXCHG8B[] = "cmpxchg8b";
56: char dszCPUID[] = "cpuid";
57: char dszCS_[] = "cs:";
58: char dszCWD[] = "cwd";
59: char dszCWDE[] = "cwde";
60: char dszDAA[] = "daa";
61: char dszDAS[] = "das";
62: char dszDEC[] = "dec";
63: char dszDIV[] = "div";
64: char dszDS_[] = "ds:";
65: char dszENTER[] = "enter";
66: char dszES_[] = "es:";
67: char dszF2XM1[] = "f2xm1";
68: char dszFABS[] = "fabs";
69: char dszFADD[] = "fadd";
70: char dszFADDP[] = "faddp";
71: char dszFBLD[] = "fbld";
72: char dszFBSTP[] = "fbstp";
73: char dszFCHS[] = "fchs";
74: char dszFCLEX[] = "fclex";
75: char dszFCOM[] = "fcom";
76: char dszFCOMP[] = "fcomp";
77: char dszFCOMPP[] = "fcompp";
78: char dszFCOS[] = "fcos";
79: char dszFDECSTP[] = "fdecstp";
80: char dszFDISI[] = "fdisi";
81: char dszFDIV[] = "fdiv";
82: char dszFDIVP[] = "fdivp";
83: char dszFDIVR[] = "fdivr";
84: char dszFDIVRP[] = "fdivrp";
85: char dszFENI[] = "feni";
86: char dszFFREE[] = "ffree";
87: char dszFIADD[] = "fiadd";
88: char dszFICOM[] = "ficom";
89: char dszFICOMP[] = "ficomp";
90: char dszFIDIV[] = "fidiv";
91: char dszFIDIVR[] = "fidivr";
92: char dszFILD[] = "fild";
93: char dszFIMUL[] = "fimul";
94: char dszFINCSTP[] = "fincstp";
95: char dszFINIT[] = "finit";
96: char dszFIST[] = "fist";
97: char dszFISTP[] = "fistp";
98: char dszFISUB[] = "fisub";
99: char dszFISUBR[] = "fisubr";
100: char dszFLD[] = "fld";
101: char dszFLD1[] = "fld1";
102: char dszFLDCW[] = "fldcw";
103: char dszFLDENV[] = "fldenv";
104: char dszFLDL2E[] = "fldl2e";
105: char dszFLDL2T[] = "fldl2t";
106: char dszFLDLG2[] = "fldlg2";
107: char dszFLDLN2[] = "fldln2";
108: char dszFLDPI[] = "fldpi";
109: char dszFLDZ[] = "fldz";
110: char dszFMUL[] = "fmul";
111: char dszFMULP[] = "fmulp";
112: char dszFNCLEX[] = "fnclex";
113: char dszFNDISI[] = "fndisi";
114: char dszFNENI[] = "fneni";
115: char dszFNINIT[] = "fninit";
116: char dszFNOP[] = "fnop";
117: char dszFNSAVE[] = "fnsave";
118: char dszFNSTCW[] = "fnstcw";
119: char dszFNSTENV[] = "fnstenv";
120: char dszFNSTSW[] = "fnstsw";
121: char dszFNSTSWAX[] = "fnstswax";
122: char dszFPATAN[] = "fpatan";
123: char dszFPREM[] = "fprem";
124: char dszFPREM1[] = "fprem1";
125: char dszFPTAN[] = "fptan";
126: char dszFRNDINT[] = "frndint";
127: char dszFRSTOR[] = "frstor";
128: char dszFSAVE[] = "fsave";
129: char dszFSCALE[] = "fscale";
130: char dszFSETPM[] = "fsetpm";
131: char dszFSIN[] = "fsin";
132: char dszFSINCOS[] = "fsincos";
133: char dszFSQRT[] = "fsqrt";
134: char dszFST[] = "fst";
135: char dszFSTCW[] = "fstcw";
136: char dszFSTENV[] = "fstenv";
137: char dszFSTP[] = "fstp";
138: char dszFSTSW[] = "fstsw";
139: char dszFSTSWAX[] = "fstswax";
140: char dszFSUB[] = "fsub";
141: char dszFSUBP[] = "fsubp";
142: char dszFSUBR[] = "fsubr";
143: char dszFSUBRP[] = "fsubrp";
144: char dszFS_[] = "fs:";
145: char dszFTST[] = "ftst";
146: char dszFUCOM[] = "fucom";
147: char dszFUCOMP[] = "fucomp";
148: char dszFUCOMPP[] = "fucompp";
149: char dszFWAIT[] = "fwait";
150: char dszFXAM[] = "fxam";
151: char dszFXCH[] = "fxch";
152: char dszFXTRACT[] = "fxtract";
153: char dszFYL2X[] = "fyl2x";
154: char dszFYL2XP1[] = "fyl2xp1";
155: char dszGS_[] = "gs:";
156: char dszHLT[] = "hlt";
157: char dszIBTS[] = "ibts";
158: char dszIDIV[] = "idiv";
159: char dszIMUL[] = "imul";
160: char dszIN[] = "in";
161: char dszINC[] = "inc";
162: char dszINS[] = "ins";
163: char dszINSB[] = "insb";
164: char dszINSD[] = "insd";
165: char dszINSW[] = "insw";
166: char dszINT[] = "int";
167: char dszINTO[] = "into";
168: char dszIRET[] = "iret";
169: char dszIRETD[] = "iretd";
170: char dszJA[] = "ja";
171: char dszJAE[] = "jae";
172: char dszJB[] = "jb";
173: char dszJBE[] = "jbe";
174: char dszJC[] = "jc";
175: char dszJCXZ[] = "jcxz";
176: char dszJE[] = "je";
177: char dszJECXZ[] = "jecxz";
178: char dszJG[] = "jg";
179: char dszJGE[] = "jge";
180: char dszJL[] = "jl";
181: char dszJLE[] = "jle";
182: char dszJMP[] = "jmp";
183: char dszJNA[] = "jna";
184: char dszJNAE[] = "jnae";
185: char dszJNB[] = "jnb";
186: char dszJNBE[] = "jnbe";
187: char dszJNC[] = "jnc";
188: char dszJNE[] = "jne";
189: char dszJNG[] = "jng";
190: char dszJNGE[] = "jnge";
191: char dszJNL[] = "jnl";
192: char dszJNLE[] = "jnle";
193: char dszJNO[] = "jno";
194: char dszJNP[] = "jnp";
195: char dszJNS[] = "jns";
196: char dszJNZ[] = "jnz";
197: char dszJO[] = "jo";
198: char dszJP[] = "jp";
199: char dszJPE[] = "jpe";
200: char dszJPO[] = "jpo";
201: char dszJS[] = "js";
202: char dszJZ[] = "jz";
203: char dszLAHF[] = "lahf";
204: char dszLAR[] = "lar";
205: char dszLDS[] = "lds";
206: char dszLEA[] = "lea";
207: char dszLEAVE[] = "leave";
208: char dszLES[] = "les";
209: char dszLFS[] = "lfs";
210: char dszLGDT[] = "lgdt";
211: char dszLGS[] = "lgs";
212: char dszLIDT[] = "lidt";
213: char dszLLDT[] = "lldt";
214: char dszLMSW[] = "lmsw";
215: char dszLOADALL[] = "loadall";
216: char dszLOCK[] = "lock";
217: char dszLODS[] = "lods";
218: char dszLODSB[] = "lodsb";
219: char dszLODSD[] = "lodsd";
220: char dszLODSW[] = "lodsw";
221: char dszLOOP[] = "loop";
222: char dszLOOPE[] = "loope";
223: char dszLOOPNE[] = "loopne";
224: char dszLOOPNZ[] = "loopnz";
225: char dszLOOPZ[] = "loopz";
226: char dszLSL[] = "lsl";
227: char dszLSS[] = "lss";
228: char dszLTR[] = "ltr";
229: char dszMOV[] = "mov";
230: char dszMOVS[] = "movs";
231: char dszMOVSB[] = "movsb";
232: char dszMOVSD[] = "movsd";
233: char dszMOVSW[] = "movsw";
234: char dszMOVSX[] = "movsx";
235: char dszMOVZX[] = "movzx";
236: char dszMUL[] = "mul";
237: char dszNEG[] = "neg";
238: char dszNOP[] = "nop";
239: char dszNOT[] = "not";
240: char dszOPPRFX[] = "";
241: char dszOR[] = "or";
242: char dszOUT[] = "out";
243: char dszOUTS[] = "outs";
244: char dszOUTSB[] = "outsb";
245: char dszOUTSD[] = "outsd";
246: char dszOUTSW[] = "outsw";
247: char dszPOP[] = "pop";
248: char dszPOPA[] = "popa";
249: char dszPOPAD[] = "popad";
250: char dszPOPF[] = "popf";
251: char dszPOPFD[] = "popfd";
252: char dszPUSH[] = "push";
253: char dszPUSHA[] = "pusha";
254: char dszPUSHAD[] = "pushad";
255: char dszPUSHF[] = "pushf";
256: char dszPUSHFD[] = "pushfd";
257: char dszRCL[] = "rcl";
258: char dszRCR[] = "rcr";
259: char dszRDTSC[] = "rdtsc";
260: char dszRDMSR[] = "rdmsr";
261: char dszREP[] = "rep ";
262: char dszREPE[] = "repe";
263: char dszREPNE[] = "repne ";
264: char dszREPNZ[] = "repnz";
265: char dszREPZ[] = "repz";
266: char dszRET[] = "ret";
267: char dszRETF[] = "retf";
268: char dszRETN[] = "retn";
269: char dszROL[] = "rol";
270: char dszROR[] = "ror";
271: char dszRSM[] = "rsm";
272: char dszSAHF[] = "sahf";
273: char dszSAL[] = "sal";
274: char dszSAR[] = "sar";
275: char dszSBB[] = "sbb";
276: char dszSCAS[] = "scas";
277: char dszSCASB[] = "scasb";
278: char dszSCASD[] = "scasd";
279: char dszSCASW[] = "scasw";
280: char dszSETA[] = "seta";
281: char dszSETAE[] = "setae";
282: char dszSETB[] = "setb";
283: char dszSETBE[] = "setbe";
284: char dszSETC[] = "setc";
285: char dszSETE[] = "sete";
286: char dszSETG[] = "setg";
287: char dszSETGE[] = "setge";
288: char dszSETL[] = "setl";
289: char dszSETLE[] = "setle";
290: char dszSETNA[] = "setna";
291: char dszSETNAE[] = "setnae";
292: char dszSETNB[] = "setnb";
293: char dszSETNBE[] = "setnbe";
294: char dszSETNC[] = "setnc";
295: char dszSETNE[] = "setne";
296: char dszSETNG[] = "setng";
297: char dszSETNGE[] = "setnge";
298: char dszSETNL[] = "setnl";
299: char dszSETNLE[] = "setnle";
300: char dszSETNO[] = "setno";
301: char dszSETNP[] = "setnp";
302: char dszSETNS[] = "setns";
303: char dszSETNZ[] = "setnz";
304: char dszSETO[] = "seto";
305: char dszSETP[] = "setp";
306: char dszSETPE[] = "setpe";
307: char dszSETPO[] = "setpo";
308: char dszSETS[] = "sets";
309: char dszSETZ[] = "setz";
310: char dszSGDT[] = "sgdt";
311: char dszSHL[] = "shl";
312: char dszSHLD[] = "shld";
313: char dszSHR[] = "shr";
314: char dszSHRD[] = "shrd";
315: char dszSIDT[] = "sidt";
316: char dszSLDT[] = "sldt";
317: char dszSMSW[] = "smsw";
318: char dszSS_[] = "ss:";
319: char dszSTC[] = "stc";
320: char dszSTD[] = "std";
321: char dszSTI[] = "sti";
322: char dszSTOS[] = "stos";
323: char dszSTOSB[] = "stosb";
324: char dszSTOSD[] = "stosd";
325: char dszSTOSW[] = "stosw";
326: char dszSTR[] = "str";
327: char dszSUB[] = "sub";
328: char dszTEST[] = "test";
329: char dszVERR[] = "verr";
330: char dszVERW[] = "verw";
331: char dszWAIT[] = "wait";
332: char dszWRMSR[] = "wrmsr";
333: char dszXADD[] = "xadd";
334: char dszXBTS[] = "xbts";
335: char dszXCHG[] = "xchg";
336: char dszXLAT[] = "xlat";
337: char dszXOR[] = "xor";
338: char dszRESERVED[] = "???";
339: char dszMULTI[] = "";
340: char dszDB[] = "db";
341:
342: #define MRM 0x40
343: #define COM 0x80
344: #define END 0xc0
345:
346: /* Enumeration of valid actions that can be included in the action table */
347:
348: enum oprtyp { ADDRP, ADR_OVR, ALSTR, ALT, AXSTR, BOREG,
349: BREG, BRSTR, xBYTE, CHR, CREG, xDWORD,
350: EDWORD, EGROUPT, FARPTR, GROUP, GROUPT, IB,
351: IST, IST_ST, IV, IW, LMODRM, MODRM,
352: NOP, OFFS, OPC0F, OPR_OVR, QWORD, REL16,
353: REL8, REP, SEG_OVR, SREG2, SREG3, ST_IST,
354: STROP, TTBYTE, UBYTE, VAR, VOREG, VREG,
355: xWORD, WREG, WRSTR
356: };
357:
358: /* Enumeration of indices into the action table for instruction classes */
359:
360: #define O_DoDB 0
361: #define O_NoOperands 0
362: #define O_NoOpAlt5 O_NoOperands+1
363: #define O_NoOpAlt4 O_NoOpAlt5+2
364: #define O_NoOpAlt3 O_NoOpAlt4+2
365: #define O_NoOpAlt1 O_NoOpAlt3+2
366: #define O_NoOpAlt0 O_NoOpAlt1+2
367: #define O_NoOpStrSI O_NoOpAlt0+2
368: #define O_NoOpStrDI O_NoOpStrSI+2
369: #define O_NoOpStrSIDI O_NoOpStrDI+2
370: #define O_bModrm_Reg O_NoOpStrSIDI+2
371: #define O_vModrm_Reg O_bModrm_Reg+3
372: #define O_Modrm_Reg O_vModrm_Reg+3
373: #define O_bReg_Modrm O_Modrm_Reg+3
374: #define O_fReg_Modrm O_bReg_Modrm+3
375: #define O_Reg_Modrm O_fReg_Modrm+3
376: #define O_AL_Ib O_Reg_Modrm+3
377: #define O_AX_Iv O_AL_Ib+2
378: #define O_sReg2 O_AX_Iv+2
379: #define O_oReg O_sReg2+1
380: #define O_DoBound O_oReg+1
381: #define O_Iv O_DoBound+3
382: #define O_wModrm_Reg O_Iv+1
383: #define O_Ib O_wModrm_Reg+3
384: #define O_Imulb O_Ib+1
385: #define O_Imul O_Imulb+4
386: #define O_Rel8 O_Imul+4
387: #define O_bModrm_Ib O_Rel8+1
388: #define O_Modrm_Ib O_bModrm_Ib+3
389: #define O_Modrm_Iv O_Modrm_Ib+3
390: #define O_Modrm_sReg3 O_Modrm_Iv+3
391: #define O_sReg3_Modrm O_Modrm_sReg3+3
392: #define O_Modrm O_sReg3_Modrm+3
393: #define O_FarPtr O_Modrm+2
394: #define O_AL_Offs O_FarPtr+1
395: #define O_Offs_AL O_AL_Offs+2
396: #define O_AX_Offs O_Offs_AL+2
397: #define O_Offs_AX O_AX_Offs+2
398: #define O_oReg_Ib O_Offs_AX+2
399: #define O_oReg_Iv O_oReg_Ib+2
400: #define O_Iw O_oReg_Iv+2
401: #define O_Enter O_Iw+1
402: #define O_Ubyte_AL O_Enter+2
403: #define O_Ubyte_AX O_Ubyte_AL+2
404: #define O_AL_Ubyte O_Ubyte_AX+2
405: #define O_AX_Ubyte O_AL_Ubyte+2
406: #define O_DoInAL O_AX_Ubyte+2
407: #define O_DoInAX O_DoInAL+3
408: #define O_DoOutAL O_DoInAX+3
409: #define O_DoOutAX O_DoOutAL+3
410: #define O_Rel16 O_DoOutAX+3
411: #define O_ADR_OVERRIDE O_Rel16+1
412: #define O_OPR_OVERRIDE O_ADR_OVERRIDE+1
413: #define O_SEG_OVERRIDE O_OPR_OVERRIDE+1
414: #define O_DoInt3 O_SEG_OVERRIDE+1
415:
416: #if (O_DoInt3 != 115)
417: #error "operand table has been modified!"
418: #endif
419: /* #define O_DoInt O_DoInt3+2 */
420:
421: #define O_DoInt 117
422: #define O_OPC0F O_DoInt+1
423: #define O_GROUP11 O_OPC0F+1
424: #define O_GROUP13 O_GROUP11+5
425: #define O_GROUP12 O_GROUP13+5
426: #define O_GROUP21 O_GROUP12+5
427: #define O_GROUP22 O_GROUP21+5
428: #define O_GROUP23 O_GROUP22+5
429: #define O_GROUP24 O_GROUP23+6
430: #define O_GROUP25 O_GROUP24+6
431: #define O_GROUP26 O_GROUP25+6
432: #define O_GROUP4 O_GROUP26+6
433: #define O_GROUP6 O_GROUP4+4
434: #define O_GROUP8 O_GROUP6+4
435: #define O_GROUP31 O_GROUP8+5
436: #define O_GROUP32 O_GROUP31+3
437: #define O_GROUP5 O_GROUP32+3
438: #define O_GROUP7 O_GROUP5+3
439: #define O_x87_ESC O_GROUP7+3
440: #define O_bModrm O_x87_ESC+2
441: #define O_wModrm O_bModrm+2
442: #define O_dModrm O_wModrm+2
443: #define O_fModrm O_dModrm+2
444: #define O_vModrm O_fModrm+2
445: #define O_vModrm_Iv O_vModrm+2
446: #define O_Reg_bModrm O_vModrm_Iv+3
447: #define O_Reg_wModrm O_Reg_bModrm+3
448: #define O_Modrm_Reg_Ib O_Reg_wModrm+3
449: #define O_Modrm_Reg_CL O_Modrm_Reg_Ib+4
450: #define O_ST_iST O_Modrm_Reg_CL+5
451: #define O_iST O_ST_iST+2
452: #define O_iST_ST O_iST+2
453: #define O_qModrm O_iST_ST+2
454: #define O_tModrm O_qModrm+2
455: #define O_DoRep O_tModrm+2
456: #define O_Modrm_CReg O_DoRep+1
457: #define O_CReg_Modrm O_Modrm_CReg+3
458: #define O_AX_oReg O_CReg_Modrm+3
459: #define O_length O_AX_oReg+3
460:
461: #if( O_length > 255 )
462: #error "operand table too large!"
463: #endif
464:
465:
466: /* The action table: range of lists of actions to be taken for each possible */
467: /* instruction class. */
468:
469: static unsigned char actiontbl[] = {
470: /* NoOperands */ NOP+END,
471: /* NoOpAlt5 */ ALT+END, 5,
472: /* NoOpAlt4 */ ALT+END, 4,
473: /* NoOpAlt3 */ ALT+END, 3,
474: /* NoOpAlt1 */ ALT+END, 1,
475: /* NoOpAlt0 */ ALT+END, 0,
476: /* NoOpStrSI */ STROP+END, 1,
477: /* NoOpStrDI */ STROP+END, 2,
478: /* NoOpStrSIDI */ STROP+END, 3,
479: /* bModrm_Reg */ xBYTE+MRM, MODRM+COM, BREG+END,
480: /* vModrm_Reg */ VAR+MRM, LMODRM+COM, BREG+END,
481: /* Modrm_Reg */ VAR+MRM, MODRM+COM, VREG+END,
482: /* bReg_Modrm */ xBYTE+MRM, BREG+COM, MODRM+END,
483: /* fReg_Modrm */ FARPTR+MRM,VREG+COM, MODRM+END,
484: /* Reg_Modrm */ VAR+MRM, VREG+COM, MODRM+END,
485: /* AL_Ib */ ALSTR+COM, IB+END,
486: /* AX_Iv */ AXSTR+COM, IV+END,
487: /* sReg2 */ SREG2+END,
488: /* oReg */ VOREG+END,
489: /* DoBound */ VAR+MRM, VREG+COM, MODRM+END,
490: /* Iv */ IV+END,
491: /* wModrm_Reg */ xWORD+MRM, LMODRM+COM, WREG+END,
492: /* Ib */ IB+END,
493: /* Imulb */ VAR+MRM, VREG+COM, MODRM+COM, IB+END,
494: /* Imul */ VAR+MRM, VREG+COM, MODRM+COM, IV+END,
495: /* REL8 */ REL8+END,
496: /* bModrm_Ib */ xBYTE+MRM, LMODRM+COM, IB+END,
497: /* Modrm_Ib */ VAR+MRM, LMODRM+COM, IB+END,
498: /* Modrm_Iv */ VAR+MRM, LMODRM+COM, IV+END,
499: /* Modrm_sReg3 */ xWORD+MRM, MODRM+COM, SREG3+END,
500: /* sReg3_Modrm */ xWORD+MRM, SREG3+COM, MODRM+END,
501: /* Modrm */ VAR+MRM, MODRM+END,
502: /* FarPtr */ ADDRP+END,
503: /* AL_Offs */ ALSTR+COM, OFFS+END,
504: /* Offs_AL */ OFFS+COM, ALSTR+END,
505: /* AX_Offs */ AXSTR+COM, OFFS+END,
506: /* Offs_AX */ OFFS+COM, AXSTR+END,
507: /* oReg_Ib */ BOREG+COM, IB+END,
508: /* oReg_Iv */ VOREG+COM, IV+END,
509: /* Iw */ IW+END,
510: /* enter */ IW+COM, IB+END,
511: /* Ubyte_AL */ UBYTE+COM, ALSTR+END,
512: /* Ubyte_AX */ UBYTE+COM, AXSTR+END,
513: /* AL_Ubyte */ ALSTR+COM, UBYTE+END,
514: /* AX_Ubyte */ AXSTR+COM, UBYTE+END,
515: /* DoInAL */ ALSTR+COM, WRSTR+END, 2,
516: /* DoInAX */ AXSTR+COM, WRSTR+END, 2,
517: /* DoOutAL */ WRSTR+COM, 2, ALSTR+END,
518: /* DoOutAX */ WRSTR+COM, 2, AXSTR+END,
519: /* REL16 */ REL16+END,
520: /* ADR_OVERRIDE*/ ADR_OVR,
521: /* OPR_OVERRIDE*/ OPR_OVR,
522: /* SEG_OVERRIDE*/ SEG_OVR,
523: /* DoInt3 */ CHR+END, '3',
524: /* DoInt */ UBYTE+END,
525: /* Opcode0F */ OPC0F,
526: /* group1_1 */ xBYTE+MRM, GROUP, 0, LMODRM+COM, IB+END,
527: /* group1_3 */ VAR+MRM, GROUP, 0, LMODRM+COM, IB+END,
528: /* group1_2 */ VAR+MRM, GROUP, 0, LMODRM+COM, IV+END,
529: /* group2_1 */ xBYTE+MRM, GROUP, 1, LMODRM+COM, IB+END,
530: /* group2_2 */ VAR+MRM, GROUP, 1, LMODRM+COM, IB+END,
531: /* group2_3 */ xBYTE+MRM, GROUP, 1, LMODRM+COM, CHR+END, '1',
532: /* group2_4 */ VAR+MRM, GROUP, 1, LMODRM+COM, CHR+END, '1',
533: /* group2_5 */ xBYTE+MRM, GROUP, 1, LMODRM+COM, BRSTR+END, 1,
534: /* group2_6 */ VAR+MRM, GROUP, 1, LMODRM+COM, BRSTR+END, 1,
535: /* group4 */ xBYTE+MRM, GROUP, 2, LMODRM+END,
536: /* group6 */ xWORD+MRM, GROUP, 3, LMODRM+END,
537: /* group8 */ xWORD+MRM, GROUP, 4, LMODRM+COM, IB+END,
538: /* group3_1 */ xBYTE+MRM, GROUPT, 20,
539: /* group3_2 */ VAR+MRM, GROUPT, 21,
540: /* group5 */ VAR+MRM, GROUPT, 22,
541: /* group7 */ NOP+MRM, GROUPT, 23,
542: /* x87_ESC */ NOP+MRM, EGROUPT,
543: /* bModrm */ xBYTE+MRM, LMODRM+END,
544: /* wModrm */ xWORD+MRM, LMODRM+END,
545: /* dModrm */ xDWORD+MRM,LMODRM+END,
546: /* fModrm */ FARPTR+MRM,LMODRM+END,
547: /* vModrm */ VAR+MRM, LMODRM+END,
548: /* vModrm_Iv */ VAR+MRM, LMODRM+COM, IV+END,
549: /* reg_bModrm */ xBYTE+MRM, VREG+COM, LMODRM+END,
550: /* reg_wModrm */ xWORD+MRM, VREG+COM, LMODRM+END,
551: /* Modrm_Reg_Ib*/ VAR+MRM, MODRM+COM, VREG+COM, IB+END,
552: /* Modrm_Reg_CL*/ VAR+MRM, MODRM+COM, VREG+COM, BRSTR+END, 1,
553: /* ST_iST */ NOP+MRM, ST_IST+END,
554: /* iST */ NOP+MRM, IST+END,
555: /* iST_ST */ NOP+MRM, IST_ST+END,
556: /* qModrm */ QWORD+MRM, LMODRM+END,
557: /* tModrm */ TTBYTE+MRM, LMODRM+END,
558: /* REP */ REP,
559: /* Modrm_CReg */ EDWORD+MRM,MODRM+COM, CREG+END,
560: /* CReg_Modrm */ EDWORD+MRM,CREG+COM, MODRM+END,
561: /* AX_oReg */ AXSTR+COM, VOREG+END
562: };
563:
564: #if defined(_M_IX86)
565: #define BUILDING_ON_X86 1
566: #else
567: #define BUILDING_ON_X86 0
568: #endif
569:
570: #if BUILDING_ON_X86 == 1
571: #pragma pack(1)
572: #endif
573:
574: typedef struct Tdistbl{
575: char *instruct;
576: unsigned char opr;
577: } Tdistbl;
578:
579: #if BUILDING_ON_X86 == 1
580: #pragma pack()
581: #endif
582:
583: /* List of ordered pairs for each instruction: */
584: /* (pointer to string literal mnemonic, */
585: /* instruction class index for action table) */
586:
587: static Tdistbl distbl[] = {
588: dszADD, O_bModrm_Reg, /* 00 ADD mem/reg, reg (byte) */
589: dszADD, O_Modrm_Reg, /* 01 ADD mem/reg, reg (word) */
590: dszADD, O_bReg_Modrm, /* 02 ADD reg, mem/reg (byte) */
591: dszADD, O_Reg_Modrm, /* 03 ADD reg, mem/reg (word) */
592: dszADD, O_AL_Ib, /* 04 ADD AL, I */
593: dszADD, O_AX_Iv, /* 05 ADD AX, I */
594: dszPUSH, O_sReg2, /* 06 PUSH ES */
595: dszPOP, O_sReg2, /* 07 POP ES */
596: dszOR, O_bModrm_Reg, /* 08 OR mem/reg, reg (byte) */
597: dszOR, O_Modrm_Reg, /* 09 OR mem/reg, reg (word) */
598: dszOR, O_bReg_Modrm, /* 0A OR reg, mem/reg (byte) */
599: dszOR, O_Reg_Modrm, /* 0B OR reg, mem/reg (word) */
600: dszOR, O_AL_Ib, /* 0C OR AL, I */
601: dszOR, O_AX_Iv, /* 0D OR AX, I */
602: dszPUSH, O_sReg2, /* 0E PUSH CS */
603: dszMULTI, O_OPC0F, /* 0F CLTS & protection ctl(286) */
604: dszADC, O_bModrm_Reg, /* 10 ADC mem/reg, reg (byte) */
605: dszADC, O_Modrm_Reg, /* 11 ADC mem/reg, reg (word) */
606: dszADC, O_bReg_Modrm, /* 12 ADC reg, mem/reg (byte) */
607: dszADC, O_Reg_Modrm, /* 13 ADC reg, mem/reg (word) */
608: dszADC, O_AL_Ib, /* 14 ADC AL, I */
609: dszADC, O_AX_Iv, /* 15 ADC AX, I */
610: dszPUSH, O_sReg2, /* 16 PUSH SS */
611: dszPOP, O_sReg2, /* 17 POP SS */
612: dszSBB, O_bModrm_Reg, /* 18 SBB mem/reg, reg (byte) */
613: dszSBB, O_Modrm_Reg, /* 19 SBB mem/reg, reg (word) */
614: dszSBB, O_bReg_Modrm, /* 1A SBB reg, mem/reg (byte) */
615: dszSBB, O_Reg_Modrm, /* 1B SBB reg, mem/reg (word) */
616: dszSBB, O_AL_Ib, /* 1C SBB AL, I */
617: dszSBB, O_AX_Iv, /* 1D SBB AX, I */
618: dszPUSH, O_sReg2, /* 1E PUSH DS */
619: dszPOP, O_sReg2, /* 1F POP DS */
620: dszAND, O_bModrm_Reg, /* 20 AND mem/reg, reg (byte) */
621: dszAND, O_Modrm_Reg, /* 21 AND mem/reg, reg (word) */
622: dszAND, O_bReg_Modrm, /* 22 AND reg, mem/reg (byte) */
623: dszAND, O_Reg_Modrm, /* 23 AND reg, mem/reg (word) */
624: dszAND, O_AL_Ib, /* 24 AND AL, I */
625: dszAND, O_AX_Iv, /* 25 AND AX, I */
626: dszES_, O_SEG_OVERRIDE, /* 26 SEG ES: */
627: dszDAA, O_NoOperands, /* 27 DAA */
628: dszSUB, O_bModrm_Reg, /* 28 SUB mem/reg, reg (byte) */
629: dszSUB, O_Modrm_Reg, /* 29 SUB mem/reg, reg (word) */
630: dszSUB, O_bReg_Modrm, /* 2A SUB reg, mem/reg (byte) */
631: dszSUB, O_Reg_Modrm, /* 2B SUB reg, mem/reg (word) */
632: dszSUB, O_AL_Ib, /* 2C SUB AL, I */
633: dszSUB, O_AX_Iv, /* 2D SUB AX, I */
634: dszCS_, O_SEG_OVERRIDE, /* 2E SEG CS: */
635: dszDAS, O_NoOperands, /* 2F DAS */
636: dszXOR, O_bModrm_Reg, /* 30 XOR mem/reg, reg (byte) */
637: dszXOR, O_Modrm_Reg, /* 31 XOR mem/reg, reg (word) */
638: dszXOR, O_bReg_Modrm, /* 32 XOR reg, mem/reg (byte) */
639: dszXOR, O_Reg_Modrm, /* 33 XOR reg, mem/reg (word) */
640: dszXOR, O_AL_Ib, /* 34 XOR AL, I */
641: dszXOR, O_AX_Iv, /* 35 XOR AX, I */
642: dszSS_, O_SEG_OVERRIDE, /* 36 SEG SS: */
643: dszAAA, O_NoOperands, /* 37 AAA */
644: dszCMP, O_bModrm_Reg, /* 38 CMP mem/reg, reg (byte) */
645: dszCMP, O_Modrm_Reg, /* 39 CMP mem/reg, reg (word) */
646: dszCMP, O_bReg_Modrm, /* 3A CMP reg, mem/reg (byte) */
647: dszCMP, O_Reg_Modrm, /* 3B CMP reg, mem/reg (word) */
648: dszCMP, O_AL_Ib, /* 3C CMP AL, I */
649: dszCMP, O_AX_Iv, /* 3D CMP AX, I */
650: dszDS_, O_SEG_OVERRIDE, /* 3E SEG DS: */
651: dszAAS, O_NoOperands, /* 3F AAS */
652: dszINC, O_oReg, /* 40 INC AX */
653: dszINC, O_oReg, /* 41 INC CX */
654: dszINC, O_oReg, /* 42 INC DX */
655: dszINC, O_oReg, /* 43 INC BX */
656: dszINC, O_oReg, /* 44 INC SP */
657: dszINC, O_oReg, /* 45 INC BP */
658: dszINC, O_oReg, /* 46 INC SI */
659: dszINC, O_oReg, /* 47 INC DI */
660: dszDEC, O_oReg, /* 48 DEC AX */
661: dszDEC, O_oReg, /* 49 DEC CX */
662: dszDEC, O_oReg, /* 4A DEC DX */
663: dszDEC, O_oReg, /* 4B DEC BX */
664: dszDEC, O_oReg, /* 4C DEC SP */
665: dszDEC, O_oReg, /* 4D DEC BP */
666: dszDEC, O_oReg, /* 4E DEC SI */
667: dszDEC, O_oReg, /* 4F DEC DI */
668: dszPUSH, O_oReg, /* 50 PUSH AX */
669: dszPUSH, O_oReg, /* 51 PUSH CX */
670: dszPUSH, O_oReg, /* 52 PUSH DX */
671: dszPUSH, O_oReg, /* 53 PUSH BX */
672: dszPUSH, O_oReg, /* 54 PUSH SP */
673: dszPUSH, O_oReg, /* 55 PUSH BP */
674: dszPUSH, O_oReg, /* 56 PUSH SI */
675: dszPUSH, O_oReg, /* 57 PUSH DI */
676: dszPOP, O_oReg, /* 58 POP AX */
677: dszPOP, O_oReg, /* 59 POP CX */
678: dszPOP, O_oReg, /* 5A POP DX */
679: dszPOP, O_oReg, /* 5B POP BX */
680: dszPOP, O_oReg, /* 5C POP SP */
681: dszPOP, O_oReg, /* 5D POP BP */
682: dszPOP, O_oReg, /* 5E POP SI */
683: dszPOP, O_oReg, /* 5F POP DI */
684: dszPUSHA, O_NoOpAlt5, /* 60 PUSHA (286) / PUSHAD (386) */
685: dszPOPA, O_NoOpAlt4, /* 61 POPA (286) / POPAD (286) */
686: dszBOUND, O_DoBound, /* 62 BOUND reg, Modrm (286) */
687: dszARPL, O_Modrm_Reg, /* 63 ARPL Modrm, reg (286) */
688: dszFS_, O_SEG_OVERRIDE, /* 64 */
689: dszGS_, O_SEG_OVERRIDE, /* 65 */
690: dszOPPRFX,O_OPR_OVERRIDE, /* 66 */
691: dszADDRPRFX,O_ADR_OVERRIDE, /* 67 */
692: dszPUSH, O_Iv, /* 68 PUSH word (286) */
693: dszIMUL, O_Imul, /* 69 IMUL (286) */
694: dszPUSH, O_Ib, /* 6A PUSH byte (286) */
695: dszIMUL, O_Imulb, /* 6B IMUL (286) */
696: dszINSB, O_NoOperands, /* 6C INSB (286) */
697: dszINSW, O_NoOpAlt3, /* 6D INSW (286) / INSD (386) */
698: dszOUTSB, O_NoOperands, /* 6E OUTSB (286) */
699: dszOUTSW, O_NoOpAlt4, /* 6F OUTSW (286) / OUTSD (386) */
700: dszJO, O_Rel8, /* 70 JO */
701: dszJNO, O_Rel8, /* 71 JNO */
702: dszJB, O_Rel8, /* 72 JB or JNAE or JC */
703: dszJNB, O_Rel8, /* 73 JNB or JAE or JNC */
704: dszJZ, O_Rel8, /* 74 JE or JZ */
705: dszJNZ, O_Rel8, /* 75 JNE or JNZ */
706: dszJBE, O_Rel8, /* 76 JBE or JNA */
707: dszJA, O_Rel8, /* 77 JNBE or JA */
708: dszJS, O_Rel8, /* 78 JS */
709: dszJNS, O_Rel8, /* 79 JNS */
710: dszJPE, O_Rel8, /* 7A JP or JPE */
711: dszJPO, O_Rel8, /* 7B JNP or JPO */
712: dszJL, O_Rel8, /* 7C JL or JNGE */
713: dszJGE, O_Rel8, /* 7D JNL or JGE */
714: dszJLE, O_Rel8, /* 7E JLE or JNG */
715: dszJG, O_Rel8, /* 7F JNLE or JG */
716: dszMULTI, O_GROUP11, /* 80 */
717: dszMULTI, O_GROUP12, /* 81 */
718: dszRESERVED, O_DoDB, /* 82 */
719: dszMULTI, O_GROUP13, /* 83 */
720: dszTEST, O_bModrm_Reg, /* 84 TEST reg, mem/reg (byte) */
721: dszTEST, O_Modrm_Reg, /* 85 TEST reg, mem/reg (word) */
722: dszXCHG, O_bModrm_Reg, /* 86 XCHG reg, mem/reg (byte) */
723: dszXCHG, O_Modrm_Reg, /* 87 XCHG reg, mem/reg (word) */
724: dszMOV, O_bModrm_Reg, /* 88 MOV mem/reg, reg (byte) */
725: dszMOV, O_Modrm_Reg, /* 89 MOV mem/reg, reg (word) */
726: dszMOV, O_bReg_Modrm, /* 8A MOV reg, mem/reg (byte) */
727: dszMOV, O_Reg_Modrm, /* 8B MOV reg, mem/reg (word) */
728: dszMOV, O_Modrm_sReg3, /* 8C MOV mem/reg, segreg */
729: dszLEA, O_Reg_Modrm, /* 8D LEA reg, mem */
730: dszMOV, O_sReg3_Modrm, /* 8E MOV segreg, mem/reg */
731: dszPOP, O_Modrm, /* 8F POP mem/reg */
732: dszNOP, O_NoOperands, /* 90 NOP */
733: dszXCHG, O_AX_oReg, /* 91 XCHG AX,CX */
734: dszXCHG, O_AX_oReg, /* 92 XCHG AX,DX */
735: dszXCHG, O_AX_oReg, /* 93 XCHG AX,BX */
736: dszXCHG, O_AX_oReg, /* 94 XCHG AX,SP */
737: dszXCHG, O_AX_oReg, /* 95 XCHG AX,BP */
738: dszXCHG, O_AX_oReg, /* 96 XCHG AX,SI */
739: dszXCHG, O_AX_oReg, /* 97 XCHG AX,DI */
740: dszCBW, O_NoOpAlt0, /* 98 CBW / CWDE (386) */
741: dszCWD, O_NoOpAlt1, /* 99 CWD / CDQ (386) */
742: dszCALL, O_FarPtr, /* 9A CALL seg:off */
743: dszWAIT, O_NoOperands, /* 9B WAIT */
744: dszPUSHF, O_NoOpAlt5, /* 9C PUSHF / PUSHFD (386) */
745: dszPOPF, O_NoOpAlt4, /* 9D POPF / POPFD (386) */
746: dszSAHF, O_NoOperands, /* 9E SAHF */
747: dszLAHF, O_NoOperands, /* 9F LAHF */
748: dszMOV, O_AL_Offs, /* A0 MOV AL, mem */
749: dszMOV, O_AX_Offs, /* A1 MOV AX, mem */
750: dszMOV, O_Offs_AL, /* A2 MOV mem, AL */
751: dszMOV, O_Offs_AX, /* A3 MOV mem, AX */
752: dszMOVSB, O_NoOpStrSIDI, /* A4 MOVSB */
753: dszMOVSW, O_NoOpStrSIDI, /* A5 MOVSW / MOVSD (386) */
754: dszCMPSB, O_NoOpStrSIDI, /* A6 CMPSB */
755: dszCMPSW, O_NoOpStrSIDI, /* A7 CMPSW / CMPSD (386) */
756: dszTEST, O_AL_Ib, /* A8 TEST AL, I */
757: dszTEST, O_AX_Iv, /* A9 TEST AX, I */
758: dszSTOSB, O_NoOpStrDI, /* AA STOSB */
759: dszSTOSW, O_NoOpStrDI, /* AB STOSW / STOSD (386) */
760: dszLODSB, O_NoOpStrSI, /* AC LODSB */
761: dszLODSW, O_NoOpStrSI, /* AD LODSW / LODSD (386) */
762: dszSCASB, O_NoOpStrDI, /* AE SCASB */
763: dszSCASW, O_NoOpStrDI, /* AF SCASW / SCASD (386) */
764: dszMOV, O_oReg_Ib, /* B0 MOV AL, I */
765: dszMOV, O_oReg_Ib, /* B1 MOV CL, I */
766: dszMOV, O_oReg_Ib, /* B2 MOV DL, I */
767: dszMOV, O_oReg_Ib, /* B3 MOV BL, I */
768: dszMOV, O_oReg_Ib, /* B4 MOV AH, I */
769: dszMOV, O_oReg_Ib, /* B5 MOV CH, I */
770: dszMOV, O_oReg_Ib, /* B6 MOV DH, I */
771: dszMOV, O_oReg_Ib, /* B7 MOV BH, I */
772: dszMOV, O_oReg_Iv, /* B8 MOV AX, I */
773: dszMOV, O_oReg_Iv, /* B9 MOV CX, I */
774: dszMOV, O_oReg_Iv, /* BA MOV DX, I */
775: dszMOV, O_oReg_Iv, /* BB MOV BX, I */
776: dszMOV, O_oReg_Iv, /* BC MOV SP, I */
777: dszMOV, O_oReg_Iv, /* BD MOV BP, I */
778: dszMOV, O_oReg_Iv, /* BE MOV SI, I */
779: dszMOV, O_oReg_Iv, /* BF MOV DI, I */
780: dszMULTI, O_GROUP21, /* C0 shifts & rotates (286) */
781: dszMULTI, O_GROUP22, /* C1 shifts & rotates (286) */
782: dszRET, O_Iw, /* C2 RET Rel16 */
783: dszRET, O_NoOperands, /* C3 RET */
784: dszLES, O_fReg_Modrm, /* C4 LES reg, mem */
785: dszLDS, O_fReg_Modrm, /* C5 LDS reg, mem */
786: dszMOV, O_bModrm_Ib, /* C6 MOV mem/reg, I(byte) */
787: dszMOV, O_Modrm_Iv, /* C7 MOV mem/reg, I(word) */
788: dszENTER, O_Enter, /* C8 ENTER (286) */
789: dszLEAVE, O_NoOperands, /* C9 LEAVE (286) */
790: dszRETF, O_Iw, /* CA RETF I(word) */
791: dszRETF, O_NoOperands, /* CB RETF */
792: dszINT, O_DoInt3, /* CC INT 3 */
793: dszINT, O_DoInt, /* CD INT */
794: dszINTO, O_NoOperands, /* CE INTO */
795: dszIRET, O_NoOpAlt4, /* CF IRET / IRETD (386) */
796: dszMULTI, O_GROUP23, /* D0 shifts & rotates,1 (byte) */
797: dszMULTI, O_GROUP24, /* D1 shifts & rotates,1 (word) */
798: dszMULTI, O_GROUP25, /* D2 shifts & rotates,CL (byte) */
799: dszMULTI, O_GROUP26, /* D3 shifts & rotates,CL (word) */
800: dszAAM, O_Ib, /* D4 AAM */
801: dszAAD, O_Ib, /* D5 AAD */
802: dszRESERVED, O_DoDB, /* D6 */
803: dszXLAT, O_NoOperands, /* D7 XLAT */
804: dszMULTI, O_x87_ESC, /* D8 ESC */
805: dszMULTI, O_x87_ESC, /* D9 ESC */
806: dszMULTI, O_x87_ESC, /* DA ESC */
807: dszMULTI, O_x87_ESC, /* DB ESC */
808: dszMULTI, O_x87_ESC, /* DC ESC */
809: dszMULTI, O_x87_ESC, /* DD ESC */
810: dszMULTI, O_x87_ESC, /* DE ESC */
811: dszMULTI, O_x87_ESC, /* DF ESC */
812: dszLOOPNE,O_Rel8, /* E0 LOOPNE or LOOPNZ */
813: dszLOOPE, O_Rel8, /* E1 LOOPE or LOOPZ */
814: dszLOOP, O_Rel8, /* E2 LOOP */
815: dszJCXZ, O_Rel8, /* E3 JCXZ / JECXZ (386) */
816: dszIN, O_AL_Ubyte, /* E4 IN AL, I */
817: dszIN, O_AX_Ubyte, /* E5 IN AX, I */
818: dszOUT, O_Ubyte_AL, /* E6 OUT I, AL */
819: dszOUT, O_Ubyte_AX, /* E7 OUT I, AX */
820: dszCALL, O_Rel16, /* E8 CALL Rel16 */
821: dszJMP, O_Rel16, /* E9 JMP Rel16 */
822: dszJMP, O_FarPtr, /* EA JMP seg:off */
823: dszJMP, O_Rel8, /* EB JMP Rel8 */
824: dszIN, O_DoInAL, /* EC IN AL, DX */
825: dszIN, O_DoInAX, /* ED IN AX, DX */
826: dszOUT, O_DoOutAL, /* EE OUT DX, AL */
827: dszOUT, O_DoOutAX, /* EF OUT DX, AX */
828: dszLOCK, O_DoRep, /* F0 LOCK */
829: dszRESERVED, O_DoDB, /* F1 */
830: dszREPNE, O_DoRep, /* F2 REPNE or REPNZ */
831: dszREP, O_DoRep, /* F3 REP or REPE or REPZ */
832: dszHLT, O_NoOperands, /* F4 HLT */
833: dszCMC, O_NoOperands, /* F5 CMC */
834: dszMULTI, O_GROUP31, /* F6 TEST, NOT, NEG, MUL, IMUL, */
835: dszMULTI, O_GROUP32, /* F7 DIv, IDIv F6=Byte F7=Word */
836: dszCLC, O_NoOperands, /* F8 CLC */
837: dszSTC, O_NoOperands, /* F9 STC */
838: dszCLI, O_NoOperands, /* FA CLI */
839: dszSTI, O_NoOperands, /* FB STI */
840: dszCLD, O_NoOperands, /* FC CLD */
841: dszSTD, O_NoOperands, /* FD STD */
842: dszMULTI, O_GROUP4, /* FE INC, DEC mem/reg (byte) */
843: dszMULTI, O_GROUP5, /* FF INC, DEC, CALL, JMP, PUSH */
844:
845: dszMULTI, O_GROUP6, /* 0 MULTI */
846: dszMULTI, O_GROUP7, /* 1 MULTI */
847: dszLAR, O_Reg_Modrm, /* 2 LAR */
848: dszLSL, O_Reg_Modrm, /* 3 LSL */
849: dszRESERVED, O_DoDB, /* 4 */
850: dszLOADALL, O_NoOperands, /* 5 LOADALL */
851: dszCLTS, O_NoOperands, /* 6 CLTS */
852: dszMOV, O_Modrm_CReg, /* 20 MOV Rd,Cd */
853: dszMOV, O_Modrm_CReg, /* 21 MOV Rd,Dd */
854: dszMOV, O_CReg_Modrm, /* 22 MOV Cd,Rd */
855: dszMOV, O_CReg_Modrm, /* 23 MOV Dd,Rd */
856: dszMOV, O_Modrm_CReg, /* 24 MOV Rd,Td */
857: dszRESERVED, O_DoDB, /* 25 */
858: dszMOV, O_CReg_Modrm, /* 26 MOV Td,Rd */
859:
860: dszWRMSR, O_NoOperands, /* 30 WRMSR */
861: dszRDTSC, O_NoOperands, /* 31 RDTSC */
862: dszRDMSR, O_NoOperands, /* 32 RDMSR */
863:
864: dszSETNL, O_bModrm, /* 7D SETNL */
865: dszRESERVED, O_DoDB, /* 7E */
866: dszRESERVED, O_DoDB, /* 7F */
867: dszJO, O_Rel16, /* 80 JO */
868: dszJNO, O_Rel16, /* 81 JNO */
869: dszJB, O_Rel16, /* 82 JB */
870: dszJNB, O_Rel16, /* 83 JNB */
871: dszJE, O_Rel16, /* 84 JE */
872: dszJNE, O_Rel16, /* 85 JNE */
873: dszJBE, O_Rel16, /* 86 JBE */
874: dszJNBE, O_Rel16, /* 87 JNBE */
875: dszJS, O_Rel16, /* 88 JS */
876: dszJNS, O_Rel16, /* 89 JNS */
877: dszJP, O_Rel16, /* 8A JP */
878: dszJNP, O_Rel16, /* 8B JNP */
879: dszJL, O_Rel16, /* 8C JL */
880: dszJNL, O_Rel16, /* 8D JNL */
881: dszJLE, O_Rel16, /* 8E JLE */
882: dszJNLE, O_Rel16, /* 8F JNLE */
883: dszSETO, O_bModrm, /* 90 SETO */
884: dszSETNO, O_bModrm, /* 91 SETNO */
885: dszSETB, O_bModrm, /* 92 SETB */
886: dszSETNB, O_bModrm, /* 93 SETNB */
887: dszSETE, O_bModrm, /* 94 SETE */
888: dszSETNE, O_bModrm, /* 95 SETNE */
889: dszSETBE, O_bModrm, /* 96 SETBE */
890: dszSETA, O_bModrm, /* 97 SETNBE */
891: dszSETS, O_bModrm, /* 98 SETS */
892: dszSETNS, O_bModrm, /* 99 SETNS */
893: dszSETP, O_bModrm, /* 9A SETP */
894: dszSETNP, O_bModrm, /* 9B SETNP */
895: dszSETL, O_bModrm, /* 9C SETL */
896: dszSETGE, O_bModrm, /* 9D SETGE */
897: dszSETLE, O_bModrm, /* 9E SETLE */
898: dszSETNLE,O_bModrm, /* 9F SETNLE */
899: dszPUSH, O_sReg2, /* A0 PUSH FS */
900: dszPOP, O_sReg2, /* A1 POP FS */
901: dszCPUID, O_NoOperands, /* A2 CPUID */
902: dszBT, O_Modrm_Reg, /* A3 BT */
903: dszSHLD, O_Modrm_Reg_Ib, /* A4 SHLD */
904: dszSHLD, O_Modrm_Reg_CL, /* A5 SHLD */
905: dszCMPXCHG,O_bModrm_Reg, /* A6 XBTS */
906: dszCMPXCHG,O_Modrm_Reg, /* A7 IBTS */
907: dszPUSH, O_sReg2, /* A8 PUSH GS */
908: dszPOP, O_sReg2, /* A9 POP GS */
909: dszRSM, O_NoOperands, /* AA RSM */
910: dszBTS, O_vModrm_Reg, /* AB BTS */
911: dszSHRD, O_Modrm_Reg_Ib, /* AC SHRD */
912: dszSHRD, O_Modrm_Reg_CL, /* AD SHRD */
913: dszRESERVED, O_DoDB, /* AE */
914: dszIMUL, O_Reg_Modrm, /* AF IMUL */
915: dszRESERVED, O_DoDB, /* B0 */
916: dszRESERVED, O_DoDB, /* B1 */
917: dszLSS, O_fReg_Modrm, /* B2 LSS */
918: dszBTR, O_Modrm_Reg, /* B3 BTR */
919: dszLFS, O_fReg_Modrm, /* B4 LFS */
920: dszLGS, O_fReg_Modrm, /* B5 LGS */
921: dszMOVZX, O_Reg_bModrm, /* B6 MOVZX */
922: dszMOVZX, O_Reg_wModrm, /* B7 MOVZX */
923: dszRESERVED, O_DoDB, /* B8 */
924: dszRESERVED, O_DoDB, /* B9 */
925: dszMULTI, O_GROUP8, /* BA MULTI */
926: dszBTC, O_Modrm_Reg, /* BB BTC */
927: dszBSF, O_Reg_Modrm, /* BC BSF */
928: dszBSR, O_Reg_Modrm, /* BD BSR */
929: dszMOVSX, O_Reg_bModrm, /* BE MOVSX */
930: dszMOVSX, O_Reg_wModrm, /* BF MOVSX */
931: dszXADD, O_bModrm_Reg, /* C0 XADD */
932: dszXADD, O_Modrm_Reg, /* C1 XADD */
933: dszRESERVED, O_DoDB, /* C2 */
934: dszRESERVED, O_DoDB, /* C3 */
935: dszRESERVED, O_DoDB, /* C4 */
936: dszRESERVED, O_DoDB, /* C5 */
937: dszRESERVED, O_DoDB, /* C6 */
938: dszCMPXCHG8B, O_qModrm, /* C7 CMPXCHG8B */
939: dszBSWAP, O_oReg, /* C8 BSWAP */
940: dszBSWAP, O_oReg, /* C9 BSWAP */
941: dszBSWAP, O_oReg, /* CA BSWAP */
942: dszBSWAP, O_oReg, /* CB BSWAP */
943: dszBSWAP, O_oReg, /* CC BSWAP */
944: dszBSWAP, O_oReg, /* CD BSWAP */
945: dszBSWAP, O_oReg, /* CE BSWAP */
946: dszBSWAP, O_oReg /* CF BSWAP */
947: };
948:
949: /* Auxilary lists of mnemonics for groups of two byte instructions: */
950: /* All of the instructions within each of these groups are of the same */
951: /* class, so only the mnemonic string is needed, the index into the */
952: /* action table is implicit. */
953:
954: static char *group[][8] = {
955:
956: /* 00 */ {dszADD, dszOR, dszADC, dszSBB, /* group 1 */
957: dszAND, dszSUB, dszXOR, dszCMP},
958:
959: /* 01 */ {dszROL, dszROR, dszRCL, dszRCR, /* group 2 */
960: dszSHL, dszSHR, dszRESERVED, dszSAR},
961:
962: /* 02 */ {dszINC, dszDEC, dszRESERVED, dszRESERVED, /* group 4 */
963: dszRESERVED, dszRESERVED, dszRESERVED, dszRESERVED},
964:
965: /* 03 */ {dszSLDT, dszSTR, dszLLDT, dszLTR, /* group 6 */
966: dszVERR, dszVERW, dszRESERVED, dszRESERVED},
967:
968: /* 04 */ {dszRESERVED, dszRESERVED, dszRESERVED, dszRESERVED, /* group 8 */
969: dszBT, dszBTS, dszBTR, dszBTC}
970:
971: };
972:
973: /* Auxilary orderd pairs for groups of two byte instructions structured */
974: /* the same was as distbl above. */
975:
976: static Tdistbl groupt[][8] = {
977:
978: /* 00 00 x87-D8-1 */
979: { dszFADD, O_dModrm, /* D8-0 FADD */
980: dszFMUL, O_dModrm, /* D8-1 FMUL */
981: dszFCOM, O_dModrm, /* D8-2 FCOM */
982: dszFCOMP, O_dModrm, /* D8-3 FCOMP */
983: dszFSUB, O_dModrm, /* D8-4 FSUB */
984: dszFSUBR, O_dModrm, /* D8-5 FSUBR */
985: dszFDIV, O_dModrm, /* D8-6 FDIV */
986: dszFDIVR, O_dModrm }, /* D8-7 FDIVR */
987:
988: /* 01 x87-D8-2 */
989: { dszFADD, O_ST_iST, /* D8-0 FADD */
990: dszFMUL, O_ST_iST, /* D8-1 FMUL */
991: dszFCOM, O_iST, /* D8-2 FCOM */
992: dszFCOMP, O_iST, /* D8-3 FCOMP */
993: dszFSUB, O_ST_iST, /* D8-4 FSUB */
994: dszFSUBR, O_ST_iST, /* D8-5 FSUBR */
995: dszFDIV, O_ST_iST, /* D8-6 FDIV */
996: dszFDIVR, O_ST_iST }, /* D8-7 FDIVR */
997:
998: /* 02 01 x87-D9-1 */
999: { dszFLD, O_dModrm, /* D9-0 FLD */
1000: dszRESERVED, O_DoDB, /* D9-1 */
1001: dszFST, O_dModrm, /* D9-2 FST */
1002: dszFSTP, O_dModrm, /* D9-3 FSTP */
1003: dszFLDENV, O_Modrm, /* D9-4 FLDENV */
1004: dszFLDCW, O_Modrm, /* D9-5 FLDCW */
1005: dszFSTENV, O_Modrm, /* D9-6 FSTENV */
1006: dszFSTCW, O_Modrm }, /* D9-7 FSTCW */
1007:
1008: /* 03 01 x87-D9-2 TTT=0,1,2,3 */
1009: { dszFLD, O_iST, /* D9-0 FLD */
1010: dszFXCH, O_iST, /* D9-1 FXCH */
1011: dszFNOP, O_NoOperands, /* D9-2 FNOP */
1012: dszFSTP, O_iST, /* D9-3 FSTP */
1013: dszRESERVED, O_DoDB, /* D9-4 */
1014: dszRESERVED, O_DoDB, /* D9-5 */
1015: dszRESERVED, O_DoDB, /* D9-6 */
1016: dszRESERVED, O_DoDB }, /* D9-7 */
1017:
1018: /* 04 02 x89-DA-1 */
1019: { dszFIADD, O_dModrm, /* DA-0 FIADD */
1020: dszFIMUL, O_dModrm, /* DA-1 FIMUL */
1021: dszFICOM, O_dModrm, /* DA-2 FICOM */
1022: dszFICOMP, O_dModrm, /* DA-3 FICOMP */
1023: dszFISUB, O_dModrm, /* DA-4 FISUB */
1024: dszFISUBR, O_dModrm, /* DA-5 FISUBR */
1025: dszFIDIV, O_dModrm, /* DA-6 FIDIV */
1026: dszFIDIVR, O_dModrm }, /* DA-7 FIDIVR */
1027:
1028: /* 05 x87-DA-2 */
1029: { dszRESERVED, O_DoDB, /* DA-0 */
1030: dszRESERVED, O_DoDB, /* DA-1 */
1031: dszRESERVED, O_DoDB, /* DA-2 */
1032: dszRESERVED, O_DoDB, /* DA-3 */
1033: dszRESERVED, O_DoDB, /* DA-4 */
1034: dszFUCOMPP, O_NoOperands, /* DA-5 */
1035: dszRESERVED, O_DoDB, /* DA-6 */
1036: dszRESERVED, O_DoDB }, /* DA-7 */
1037:
1038: /* 06 03 x87-DB-1 */
1039: { dszFILD, O_dModrm, /* DB-0 FILD */
1040: dszRESERVED, O_DoDB, /* DB-1 */
1041: dszFIST, O_dModrm, /* DB-2 FIST */
1042: dszFISTP, O_dModrm, /* DB-3 FISTP */
1043: dszRESERVED, O_DoDB, /* DB-4 */
1044: dszFLD, O_tModrm, /* DB-5 FLD */
1045: dszRESERVED, O_DoDB, /* DB-6 */
1046: dszFSTP, O_tModrm }, /* DB-7 FSTP */
1047:
1048: /* 07 x87-DB-2 ttt=4 */
1049: { dszFENI, O_NoOperands, /* DB-0 FENI */
1050: dszFDISI, O_NoOperands, /* DB-1 FDISI */
1051: dszFCLEX, O_NoOperands, /* DB-2 FCLEX */
1052: dszFINIT, O_NoOperands, /* DB-3 FINIT */
1053: dszFSETPM, O_DoDB, /* DB-4 FSETPM */
1054: dszRESERVED, O_DoDB, /* DB-5 */
1055: dszRESERVED, O_DoDB, /* DB-6 */
1056: dszRESERVED, O_DoDB }, /* DB-7 */
1057:
1058: /* 08 04 x87-DC-1 */
1059: { dszFADD, O_qModrm, /* DC-0 FADD */
1060: dszFMUL, O_qModrm, /* DC-1 FMUL */
1061: dszFCOM, O_qModrm, /* DC-2 FCOM */
1062: dszFCOMP, O_qModrm, /* DC-3 FCOMP */
1063: dszFSUB, O_qModrm, /* DC-4 FSUB */
1064: dszFSUBR, O_qModrm, /* DC-5 FSUBR */
1065: dszFDIV, O_qModrm, /* DC-6 FDIV */
1066: dszFDIVR, O_qModrm }, /* DC-7 FDIVR */
1067:
1068: /* 09 x87-DC-2 */
1069: { dszFADD, O_iST_ST, /* DC-0 FADD */
1070: dszFMUL, O_iST_ST, /* DC-1 FMUL */
1071: dszFCOM, O_iST, /* DC-2 FCOM */
1072: dszFCOMP, O_iST, /* DC-3 FCOMP */
1073: dszFSUB, O_iST_ST, /* DC-4 FSUB */
1074: dszFSUBR, O_iST_ST, /* DC-5 FSUBR */
1075: dszFDIV, O_iST_ST, /* DC-6 FDIVR */
1076: dszFDIVR, O_iST_ST }, /* DC-7 FDIV */
1077:
1078: /* 10 05 x87-DD-1 */
1079: { dszFLD, O_qModrm, /* DD-0 FLD */
1080: dszRESERVED, O_DoDB, /* DD-1 */
1081: dszFST, O_qModrm, /* DD-2 FST */
1082: dszFSTP, O_qModrm, /* DD-3 FSTP */
1083: dszFRSTOR, O_Modrm, /* DD-4 FRSTOR */
1084: dszRESERVED, O_DoDB, /* DD-5 */
1085: dszFSAVE, O_Modrm, /* DD-6 FSAVE */
1086: dszFSTSW, O_Modrm }, /* DD-7 FSTSW */
1087:
1088: /* 11 x87-DD-2 */
1089: { dszFFREE, O_iST, /* DD-0 FFREE */
1090: dszFXCH, O_iST, /* DD-1 FXCH */
1091: dszFST, O_iST, /* DD-2 FST */
1092: dszFSTP, O_iST, /* DD-3 FSTP */
1093: dszFUCOM, O_iST, /* DD-4 FUCOM */
1094: dszFUCOMP, O_iST, /* DD-5 FUCOMP */
1095: dszRESERVED, O_DoDB, /* DD-6 */
1096: dszRESERVED, O_DoDB }, /* DD-7 */
1097:
1098: /* 12 06 x87-DE-1 */
1099: { dszFIADD, O_wModrm, /* DE-0 FIADD */
1100: dszFIMUL, O_wModrm, /* DE-1 FIMUL */
1101: dszFICOM, O_wModrm, /* DE-2 FICOM */
1102: dszFICOMP, O_wModrm, /* DE-3 FICOMP */
1103: dszFISUB, O_wModrm, /* DE-4 FISUB */
1104: dszFISUBR, O_wModrm, /* DE-5 FISUBR */
1105: dszFIDIV, O_wModrm, /* DE-6 FIDIV */
1106: dszFIDIVR, O_wModrm }, /* DE-7 FIDIVR */
1107:
1108: /* 13 x87-DE-2 */
1109: { dszFADDP, O_iST_ST, /* DE-0 FADDP */
1110: dszFMULP, O_iST_ST, /* DE-1 FMULP */
1111: dszFCOMP, O_iST, /* DE-2 FCOMP */
1112: dszFCOMPP, O_NoOperands, /* DE-3 FCOMPP */
1113: dszFSUBP, O_iST_ST, /* DE-4 FSUBP */
1114: dszFSUBRP, O_iST_ST, /* DE-5 FSUBRP */
1115: dszFDIVP, O_iST_ST, /* DE-6 FDIVP */
1116: dszFDIVRP, O_iST_ST }, /* DE-7 FDIVRP */
1117:
1118: /* 14 07 x87-DF-1 */
1119: { dszFILD, O_wModrm, /* DF-0 FILD */
1120: dszRESERVED, O_DoDB, /* DF-1 */
1121: dszFIST, O_wModrm, /* DF-2 FIST */
1122: dszFISTP, O_wModrm, /* DF-3 FISTP */
1123: dszFBLD, O_tModrm, /* DF-4 FBLD */
1124: dszFILD, O_qModrm, /* DF-5 FILD */
1125: dszFBSTP, O_tModrm, /* DF-6 FBSTP */
1126: dszFISTP, O_qModrm }, /* DF-7 FISTP */
1127:
1128: /* 15 x87-DF-2 */
1129: { dszFFREE, O_iST, /* DF-0 FFREE */
1130: dszFXCH, O_iST, /* DF-1 FXCH */
1131: dszFST, O_iST, /* DF-2 FST */
1132: dszFSTP, O_iST, /* DF-3 FSTP */
1133: dszFSTSW, O_NoOperands, /* DF-4 FSTSW */
1134: dszRESERVED, O_DoDB, /* DF-5 */
1135: dszRESERVED, O_DoDB, /* DF-6 */
1136: dszRESERVED, O_DoDB }, /* DF-7 */
1137:
1138: /* 16 01 x87-D9 Mod=3 TTT=4 */
1139: { dszFCHS, O_NoOperands, /* D9-0 FCHS */
1140: dszFABS, O_NoOperands, /* D9-1 FABS */
1141: dszRESERVED, O_DoDB, /* D9-2 */
1142: dszRESERVED, O_DoDB, /* D9-3 */
1143: dszFTST, O_NoOperands, /* D9-4 FTST */
1144: dszFXAM, O_NoOperands, /* D9-5 FXAM */
1145: dszRESERVED, O_DoDB, /* D9-6 */
1146: dszRESERVED, O_DoDB }, /* D9-7 */
1147:
1148: /* 17 01 x87-D9 Mod=3 TTT=5 */
1149: { dszFLD1, O_NoOperands, /* D9-0 FLD1 */
1150: dszFLDL2T, O_NoOperands, /* D9-1 FLDL2T */
1151: dszFLDL2E, O_NoOperands, /* D9-2 FLDL2E */
1152: dszFLDPI, O_NoOperands, /* D9-3 FLDPI */
1153: dszFLDLG2, O_NoOperands, /* D9-4 FLDLG2 */
1154: dszFLDLN2, O_NoOperands, /* D9-5 FLDLN2 */
1155: dszFLDZ, O_NoOperands, /* D9-6 FLDZ */
1156: dszRESERVED, O_DoDB }, /* D9-7 */
1157:
1158: /* 18 01 x87-D9 Mod=3 TTT=6 */
1159: { dszF2XM1, O_NoOperands, /* D9-0 F2XM1 */
1160: dszFYL2X, O_NoOperands, /* D9-1 FYL2X */
1161: dszFPTAN, O_NoOperands, /* D9-2 FPTAN */
1162: dszFPATAN, O_NoOperands, /* D9-3 FPATAN */
1163: dszFXTRACT, O_NoOperands, /* D9-4 FXTRACT */
1164: dszFPREM1, O_NoOperands, /* D9-5 FPREM1 */
1165: dszFDECSTP, O_NoOperands, /* D9-6 FDECSTP */
1166: dszFINCSTP, O_NoOperands }, /* D9-7 FINCSTP */
1167:
1168: /* 19 01 x87-D9 Mod=3 TTT=7 */
1169: { dszFPREM, O_NoOperands, /* D9-0 FPREM */
1170: dszFYL2XP1, O_NoOperands, /* D9-1 FYL2XP1 */
1171: dszFSQRT, O_NoOperands, /* D9-2 FSQRT */
1172: dszFSINCOS, O_NoOperands, /* D9-3 FSINCOS */
1173: dszFRNDINT, O_NoOperands, /* D9-4 FRNDINT */
1174: dszFSCALE, O_NoOperands, /* D9-5 FSCALE */
1175: dszFSIN, O_NoOperands, /* D9-6 FSIN */
1176: dszFCOS, O_NoOperands }, /* D9-7 FCOS */
1177:
1178: /* 20 group 3 */
1179: { dszTEST, O_bModrm_Ib, /* F6-0 TEST */
1180: dszRESERVED, O_DoDB, /* F6-1 */
1181: dszNOT, O_bModrm, /* F6-2 NOT */
1182: dszNEG, O_bModrm, /* F6-3 NEG */
1183: dszMUL, O_bModrm, /* F6-4 MUL */
1184: dszIMUL, O_bModrm, /* F6-5 IMUL */
1185: dszDIV, O_bModrm, /* F6-6 DIV */
1186: dszIDIV, O_bModrm }, /* F6-7 IDIV */
1187:
1188: /* 21 group 3 */
1189: { dszTEST, O_vModrm_Iv, /* F7-0 TEST */
1190: dszRESERVED, O_DoDB, /* F7-1 */
1191: dszNOT, O_vModrm, /* F7-2 NOT */
1192: dszNEG, O_vModrm, /* F7-3 NEG */
1193: dszMUL, O_vModrm, /* F7-4 MUL */
1194: dszIMUL, O_vModrm, /* F7-5 IMUL */
1195: dszDIV, O_vModrm, /* F7-6 DIV */
1196: dszIDIV, O_vModrm }, /* F7-7 IDIV */
1197:
1198: /* 22 group 5 */
1199: { dszINC, O_vModrm, /* FF-0 INC */
1200: dszDEC, O_vModrm, /* FF-1 DEC */
1201: dszCALL, O_vModrm, /* FF-2 CALL */
1202: dszCALL, O_fModrm, /* FF-3 CALL */
1203: dszJMP, O_vModrm, /* FF-4 JMP */
1204: dszJMP, O_fModrm, /* FF-5 JMP */
1205: dszPUSH, O_vModrm, /* FF-6 PUSH */
1206: dszRESERVED, O_DoDB }, /* FF-7 */
1207:
1208: /* 23 group 7 */
1209: { dszSGDT, O_Modrm, /* 0F-0 SGDT */
1210: dszSIDT, O_Modrm, /* 0F-1 SIDT */
1211: dszLGDT, O_Modrm, /* 0F-2 LGDT */
1212: dszLIDT, O_Modrm, /* 0F-3 LIDT */
1213: dszSMSW, O_wModrm, /* 0F-4 MSW */
1214: dszRESERVED, O_DoDB, /* 0F-5 */
1215: dszLMSW, O_wModrm, /* 0F-6 LMSW */
1216: dszRESERVED, O_DoDB } /* 0F-7 */
1217:
1218: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.