Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1472 lines
73 KiB

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