home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 2 / 2431 / 386opcodes.h next >
C/C++ Source or Header  |  1991-01-01  |  16KB  |  863 lines

  1. /*
  2.  * The main tables describing the instructions is essentially a copy
  3.  * of the "Opcode Map" chapter (Appendix A) of the Intel 80386
  4.  * Programmers Manual.  Usually, there is a capital letter, followed
  5.  * by a small letter.  The capital letter tell the addressing mode,
  6.  * and the small letter tells about the operand size.  Refer to 
  7.  * the Intel manual for details.
  8.  */
  9.  
  10. #define Eb OP_E, b_mode
  11. #define indirEb OP_indirE, b_mode
  12. #define Gb OP_G, b_mode
  13. #define Ev OP_E, v_mode
  14. #define indirEv OP_indirE, v_mode
  15. #define Ew OP_E, w_mode
  16. #define Ma OP_E, v_mode
  17. #define M OP_E, 0
  18. #define Mp OP_E, 0        /* ? */
  19. #define Gv OP_G, v_mode
  20. #define Gw OP_G, w_mode
  21. #define Rw OP_rm, w_mode
  22. #define Rd OP_rm, d_mode
  23. #define Ib OP_I, b_mode
  24. #define sIb OP_sI, b_mode    /* sign extened byte */
  25. #define Iv OP_I, v_mode
  26. #define Iw OP_I, w_mode
  27. #define Jb OP_J, b_mode
  28. #define Jv OP_J, v_mode
  29. #define ONE OP_ONE, 0
  30. #define Cd OP_C, d_mode
  31. #define Dd OP_D, d_mode
  32. #define Td OP_T, d_mode
  33.  
  34. #define eAX OP_REG, eAX_reg
  35. #define eBX OP_REG, eBX_reg
  36. #define eCX OP_REG, eCX_reg
  37. #define eDX OP_REG, eDX_reg
  38. #define eSP OP_REG, eSP_reg
  39. #define eBP OP_REG, eBP_reg
  40. #define eSI OP_REG, eSI_reg
  41. #define eDI OP_REG, eDI_reg
  42. #define AL OP_REG, al_reg
  43. #define CL OP_REG, cl_reg
  44. #define DL OP_REG, dl_reg
  45. #define BL OP_REG, bl_reg
  46. #define AH OP_REG, ah_reg
  47. #define CH OP_REG, ch_reg
  48. #define DH OP_REG, dh_reg
  49. #define BH OP_REG, bh_reg
  50. #define AX OP_REG, ax_reg
  51. #define DX OP_REG, dx_reg
  52. #define indirDX OP_REG, indir_dx_reg
  53.  
  54. #define Sw OP_SEG, w_mode
  55. #define Ap OP_DIR, lptr
  56. #define Av OP_DIR, v_mode
  57. #define Ob OP_OFF, b_mode
  58. #define Ov OP_OFF, v_mode
  59. #define Xb OP_DSSI, b_mode
  60. #define Xv OP_DSSI, v_mode
  61. #define Yb OP_ESDI, b_mode
  62. #define Yv OP_ESDI, v_mode
  63.  
  64. #define es OP_REG, es_reg
  65. #define ss OP_REG, ss_reg
  66. #define cs OP_REG, cs_reg
  67. #define ds OP_REG, ds_reg
  68. #define fs OP_REG, fs_reg
  69. #define gs OP_REG, gs_reg
  70.  
  71. int OP_E(), OP_indirE(), OP_G(), OP_I(), OP_sI(), OP_REG();
  72. int OP_J(), OP_SEG();
  73. int OP_DIR(), OP_OFF(), OP_DSSI(), OP_ESDI(), OP_ONE(), OP_C();
  74. int OP_D(), OP_T(), OP_rm();
  75.  
  76.  
  77. #define b_mode 1
  78. #define v_mode 2
  79. #define w_mode 3
  80. #define d_mode 4
  81.  
  82. #define es_reg 100
  83. #define cs_reg 101
  84. #define ss_reg 102
  85. #define ds_reg 103
  86. #define fs_reg 104
  87. #define gs_reg 105
  88. #define eAX_reg 107
  89. #define eCX_reg 108
  90. #define eDX_reg 109
  91. #define eBX_reg 110
  92. #define eSP_reg 111
  93. #define eBP_reg 112
  94. #define eSI_reg 113
  95. #define eDI_reg 114
  96.  
  97. #define lptr 115
  98.  
  99. #define al_reg 116
  100. #define cl_reg 117
  101. #define dl_reg 118
  102. #define bl_reg 119
  103. #define ah_reg 120
  104. #define ch_reg 121
  105. #define dh_reg 122
  106. #define bh_reg 123
  107.  
  108. #define ax_reg 124
  109. #define cx_reg 125
  110. #define dx_reg 126
  111. #define bx_reg 127
  112. #define sp_reg 128
  113. #define bp_reg 129
  114. #define si_reg 130
  115. #define di_reg 131
  116.  
  117. #define indir_dx_reg 150
  118.  
  119. #define GRP1b NULL, NULL, 0
  120. #define GRP1S NULL, NULL, 1
  121. #define GRP1Ss NULL, NULL, 2
  122. #define GRP2b NULL, NULL, 3
  123. #define GRP2S NULL, NULL, 4
  124. #define GRP2b_one NULL, NULL, 5
  125. #define GRP2S_one NULL, NULL, 6
  126. #define GRP2b_cl NULL, NULL, 7
  127. #define GRP2S_cl NULL, NULL, 8
  128. #define GRP3b NULL, NULL, 9
  129. #define GRP3S NULL, NULL, 10
  130. #define GRP4  NULL, NULL, 11
  131. #define GRP5  NULL, NULL, 12
  132. #define GRP6  NULL, NULL, 13
  133. #define GRP7 NULL, NULL, 14
  134. #define GRP8 NULL, NULL, 15
  135.  
  136. #define FLOATCODE 50
  137. #define FLOAT NULL, NULL, FLOATCODE
  138.  
  139. struct dis386 {
  140.     char *name;
  141.     int (*op1)();
  142.     int bytemode1;
  143.     int (*op2)();
  144.     int bytemode2;
  145.     int (*op3)();
  146.     int bytemode3;
  147. };
  148.  
  149. struct dis386 dis386[] = {
  150.     { "addb",    Eb, Gb }, /* 00 */
  151.     { "addS",    Ev, Gv },
  152.     { "addb",    Gb, Eb },
  153.     { "addS",    Gv, Ev },
  154.     { "addb",    AL, Ib },
  155.     { "addS",    eAX, Iv },
  156.     { "pushl",    es },
  157.     { "popl",    es },
  158.     { "orb",    Eb, Gb }, /* 08 */
  159.     { "orS",    Ev, Gv },
  160.     { "orb",    Gb, Eb },
  161.     { "orS",    Gv, Ev },
  162.     { "orb",    AL, Ib },
  163.     { "orS",    eAX, Iv },
  164.     { "pushl",    cs },
  165.     { "(bad)" },        /* 2-byte escape */
  166.  
  167.     { "adcb",    Eb, Gb }, /* 10 */
  168.     { "adcS",    Ev, Gv },
  169.     { "adcb",    Gb, Eb },
  170.     { "adcS",    Gv, Ev },
  171.     { "adcb",    AL, Ib },
  172.     { "adcS",    eAX, Iv },
  173.     { "pushl",    ss },
  174.     { "popl",    ss },
  175.     { "sbbb",    Eb, Gb }, /* 18 */
  176.     { "sbbS",    Ev, Gv },
  177.     { "sbbb",    Gb, Eb },
  178.     { "sbbS",    Gv, Ev },
  179.     { "sbbb",    AL, Ib },
  180.     { "sbbS",    eAX, Iv },
  181.     { "pushl",    ds },
  182.     { "popl",    ds },
  183.  
  184.     { "andb",    Eb, Gb }, /* 20 */
  185.     { "andS",    Ev, Gv },
  186.     { "andb",    Gb, Eb },
  187.     { "andS",    Gv, Ev },
  188.     { "andb",    AL, Ib },
  189.     { "andS",    eAX, Iv },
  190.     { "(bad)" },        /* (SEG=ES) */
  191.     { "daa" },
  192.     { "subb",    Eb, Gb }, /* 28 */
  193.     { "subS",    Ev, Gv },
  194.     { "subb",    Gb, Eb },
  195.     { "subS",    Gv, Ev },
  196.     { "subb",    AL, Ib },
  197.     { "subS",    eAX, Iv },
  198.     { "(bad)" },        /* (SEG=CS) */
  199.     { "das" },
  200.  
  201.     { "xorb",    Eb, Gb }, /* 30 */
  202.     { "xorS",    Ev, Gv },
  203.     { "xorb",    Gb, Eb },
  204.     { "xorS",    Gv, Ev },
  205.     { "xorb",    AL, Ib },
  206.     { "xorS",    eAX, Iv },
  207.     { "(bad)" },
  208.     { "aaa" },
  209.     { "cmpb",    Eb, Gb },
  210.     { "cmpS",    Ev, Gv },
  211.     { "cmpb",    Gb, Eb },
  212.     { "cmpS",    Gv, Ev },
  213.     { "cmpb",    AL, Ib },
  214.     { "cmpS",    eAX, Iv },
  215.     { "(bad)" },
  216.     { "aas" },
  217.     { "incS",    eAX },
  218.     { "incS",    eCX },
  219.     { "incS",    eDX },
  220.     { "incS",    eBX },
  221.     { "incS",    eSP },
  222.     { "incS",    eBP },
  223.     { "incS",    eSI },
  224.     { "incS",    eDI },
  225.     { "decS",    eAX },
  226.     { "decS",    eCX },
  227.     { "decS",    eDX },
  228.     { "decS",    eBX },
  229.     { "decS",    eSP },
  230.     { "decS",    eBP },
  231.     { "decS",    eSI },
  232.     { "decS",    eDI },
  233.     { "pushS",    eAX },
  234.     { "pushS",    eCX },
  235.     { "pushS",    eDX },
  236.     { "pushS",    eBX },
  237.     { "pushS",    eSP },
  238.     { "pushS",    eBP },
  239.     { "pushS",    eSI },
  240.     { "pushS",    eDI },
  241.     { "popS",    eAX },
  242.     { "popS",    eCX },
  243.     { "popS",    eDX },
  244.     { "popS",    eBX },
  245.     { "popS",    eSP },
  246.     { "popS",    eBP },
  247.     { "popS",    eSI },
  248.     { "popS",    eDI },
  249.     { "pusha" },
  250.     { "popa" },
  251.     { "boundS",    Gv, Ma },
  252.     { "arpl",    Ew, Gw },
  253.     { "(bad)" },
  254.     { "(bad)" },
  255.     { "(bad)" },
  256.     { "(bad)" },
  257.     { "pushS",    Iv },
  258.     { "imulS",    Gv, Ev, Iv },
  259.     { "pushl",    sIb },
  260.     { "imulS",    Gv, Ev, Ib },
  261.     { "insb",    Yb, indirDX },
  262.     { "insS",    Yv, indirDX },
  263.     { "outsb",    indirDX, Xb },
  264.     { "outsS",    indirDX, Xv },
  265.     { "jo",        Jb },
  266.     { "jno",    Jb },
  267.     { "jb",        Jb },
  268.     { "jae",    Jb },
  269.     { "je",        Jb },
  270.     { "jne",    Jb },
  271.     { "jbe",    Jb },
  272.     { "ja",        Jb },
  273.     { "js",        Jb },
  274.     { "jns",    Jb },
  275.     { "jp",        Jb },
  276.     { "jnp",    Jb },
  277.     { "jl",        Jb },
  278.     { "jnl",    Jb },
  279.     { "jle",    Jb },
  280.     { "jg",        Jb },
  281.     { GRP1b },
  282.     { GRP1S },
  283.     { "(bad)" },
  284.     { GRP1Ss },
  285.     { "testb",    Eb, Gb },
  286.     { "testS",    Ev, Gv },
  287.     { "xchgb",    Eb, Gb },
  288.     { "xchgS",    Ev, Gv },
  289.     { "movb",    Eb, Gb },
  290.     { "movS",    Ev, Gv },
  291.     { "movb",    Gb, Eb },
  292.     { "movS",    Gv, Ev },
  293.     { "movw",    Ew, Sw },
  294.     { "leaS",    Gv, M },
  295.     { "movw",    Sw, Ew },
  296.     { "popS",    Ev },
  297.     { "nop" },
  298.     { "xchgS",    eCX, eAX },
  299.     { "xchgS",    eDX, eAX },
  300.     { "xchgS",    eBX, eAX },
  301.     { "xchgS",    eSP, eAX },
  302.     { "xchgS",    eBP, eAX },
  303.     { "xchgS",    eSI, eAX },
  304.     { "xchgS",    eDI, eAX },
  305.     { "cwtl" },
  306.     { "cltd" },
  307.     { "lcall",    Ap },
  308.     { "(bad)" },
  309.     { "pushf" },
  310.     { "popf" },
  311.     { "sahf" },
  312.     { "lahf" },
  313.     { "movb",    AL, Ob },
  314.     { "movS",    eAX, Ov },
  315.     { "movb",    Ob, AL },
  316.     { "movS",    Ov, eAX },
  317.     { "movsb",    Yb, Xb },
  318.     { "movsS",    Yv, Xv },
  319.     { "cmpsb",    Yb, Xb },
  320.     { "cmpsS",    Yv, Xv },
  321.     { "testb",    AL, Ib },
  322.     { "testS",    eAX, Iv },
  323.     { "stosb",    Yb, AL },
  324.     { "stosS",    Yv, eAX },
  325.     { "lodsb",    AL, Xb },
  326.     { "lodsS",    eAX, Xv },
  327.     { "scasb",    AL, Xb },
  328.     { "scasS",    eAX, Xv },
  329.     { "movb",    AL, Ib },
  330.     { "movb",    CL, Ib },
  331.     { "movb",    DL, Ib },
  332.     { "movb",    BL, Ib },
  333.     { "movb",    AH, Ib },
  334.     { "movb",    CH, Ib },
  335.     { "movb",    DH, Ib },
  336.     { "movb",    BH, Ib },
  337.     { "movS",    eAX, Iv },
  338.     { "movS",    eCX, Iv },
  339.     { "movS",    eDX, Iv },
  340.     { "movS",    eBX, Iv },
  341.     { "movS",    eSP, Iv },
  342.     { "movS",    eBP, Iv },
  343.     { "movS",    eSI, Iv },
  344.     { "movS",    eDI, Iv },
  345.     { GRP2b },
  346.     { GRP2S },
  347.     { "ret",    Iw },
  348.     { "ret" },
  349.     { "lesS",    Gv, Mp },
  350.     { "ldsS",    Gv, Mp },
  351.     { "movb",    Eb, Ib },
  352.     { "movS",    Ev, Iv },
  353.     { "enter",    Iw, Ib },
  354.     { "leave" },
  355.     { "lret",    Iw },
  356.     { "lret" },
  357.     { "int3" },
  358.     { "int",    Ib },
  359.     { "into" },
  360.     { "iret" },
  361.     { GRP2b_one },
  362.     { GRP2S_one },
  363.     { GRP2b_cl },
  364.     { GRP2S_cl },
  365.     { "aam",    Ib },
  366.     { "aad",    Ib },
  367.     { "(bad)" },
  368.     { "xlat" },
  369.     { FLOAT },
  370.     { FLOAT },
  371.     { FLOAT },
  372.     { FLOAT },
  373.     { FLOAT },
  374.     { FLOAT },
  375.     { FLOAT },
  376.     { FLOAT },
  377.     { "loopne",    Jb },
  378.     { "loope",    Jb },
  379.     { "loop",    Jb },
  380.     { "jCcxz",    Jb },
  381.     { "inb",    AL, Ib },
  382.     { "inS",    eAX, Ib },
  383.     { "outb",    Ib, AL },
  384.     { "outS",    Ib, eAX },
  385.     { "call",    Av },
  386.     { "jmp",    Jv },
  387.     { "ljmp",    Ap },
  388.     { "jmp",    Jb },
  389.     { "inb",    AL, indirDX },
  390.     { "inS",    eAX, indirDX },
  391.     { "outb",    indirDX, AL },
  392.     { "outS",    indirDX, eAX },
  393.     { "(bad)" },
  394.     { "(bad)" },
  395.     { "(bad)" },
  396.     { "(bad)" },
  397.     { "hlt" },
  398.     { "cmc" },
  399.     { GRP3b },
  400.     { GRP3S },
  401.     { "clc" },
  402.     { "stc" },
  403.     { "cli" },
  404.     { "sti" },
  405.     { "cld" },
  406.     { "std" },
  407.     { GRP4 },
  408.     { GRP5 },
  409. };
  410.  
  411. struct dis386 dis386_twobyte[] = {
  412.     { GRP6 },
  413.     { GRP7 },
  414.     { "larS", Gv, Ew },
  415.     { "lslS", Gv, Ew },
  416.     { "(bad)" },
  417.     { "(bad)" },
  418.     { "clts" },
  419.     { "(bad)" },
  420.     { "(bad)" },
  421.     { "(bad)" },
  422.     { "(bad)" },
  423.     { "(bad)" },
  424.     { "(bad)" },
  425.     { "(bad)" },
  426.     { "(bad)" },
  427.     { "(bad)" },
  428.     { "(bad)" },
  429.     { "(bad)" },
  430.     { "(bad)" },
  431.     { "(bad)" },
  432.     { "(bad)" },
  433.     { "(bad)" },
  434.     { "(bad)" },
  435.     { "(bad)" },
  436.     { "(bad)" },
  437.     { "(bad)" },
  438.     { "(bad)" },
  439.     { "(bad)" },
  440.     { "(bad)" },
  441.     { "(bad)" },
  442.     { "(bad)" },
  443.     { "(bad)" },
  444.     { "movl", Rd, Cd },
  445.     { "movl", Rd, Dd },
  446.     { "movl", Cd, Rd },
  447.     { "movl", Dd, Rd },
  448.     { "movl", Rd, Td },
  449.     { "(bad)" },
  450.     { "movl", Td, Rd },
  451.     { "(bad)" },
  452.     { "(bad)" },
  453.     { "(bad)" },
  454.     { "(bad)" },
  455.     { "(bad)" },
  456.     { "(bad)" },
  457.     { "(bad)" },
  458.     { "(bad)" },
  459.     { "(bad)" },
  460.     { "(bad)" },
  461.     { "(bad)" },
  462.     { "(bad)" },
  463.     { "(bad)" },
  464.     { "(bad)" },
  465.     { "(bad)" },
  466.     { "(bad)" },
  467.     { "(bad)" },
  468.     { "(bad)" },
  469.     { "(bad)" },
  470.     { "(bad)" },
  471.     { "(bad)" },
  472.     { "(bad)" },
  473.     { "(bad)" },
  474.     { "(bad)" },
  475.     { "(bad)" },
  476.     { "(bad)" },
  477.     { "(bad)" },
  478.     { "(bad)" },
  479.     { "(bad)" },
  480.     { "(bad)" },
  481.     { "(bad)" },
  482.     { "(bad)" },
  483.     { "(bad)" },
  484.     { "(bad)" },
  485.     { "(bad)" },
  486.     { "(bad)" },
  487.     { "(bad)" },
  488.     { "(bad)" },
  489.     { "(bad)" },
  490.     { "(bad)" },
  491.     { "(bad)" },
  492.     { "(bad)" },
  493.     { "(bad)" },
  494.     { "(bad)" },
  495.     { "(bad)" },
  496.     { "(bad)" },
  497.     { "(bad)" },
  498.     { "(bad)" },
  499.     { "(bad)" },
  500.     { "(bad)" },
  501.     { "(bad)" },
  502.     { "(bad)" },
  503.     { "(bad)" },
  504.     { "(bad)" },
  505.     { "(bad)" },
  506.     { "(bad)" },
  507.     { "(bad)" },
  508.     { "(bad)" },
  509.     { "(bad)" },
  510.     { "(bad)" },
  511.     { "(bad)" },
  512.     { "(bad)" },
  513.     { "(bad)" },
  514.     { "(bad)" },
  515.     { "(bad)" },
  516.     { "(bad)" },
  517.     { "(bad)" },
  518.     { "(bad)" },
  519.     { "(bad)" },
  520.     { "(bad)" },
  521.     { "(bad)" },
  522.     { "(bad)" },
  523.     { "(bad)" },
  524.     { "(bad)" },
  525.     { "(bad)" },
  526.     { "(bad)" },
  527.     { "(bad)" },
  528.     { "(bad)" },
  529.     { "(bad)" },
  530.     { "(bad)" },
  531.     { "(bad)" },
  532.     { "(bad)" },
  533.     { "(bad)" },
  534.     { "(bad)" },
  535.     { "(bad)" },
  536.     { "(bad)" },
  537.     { "(bad)" },
  538.     { "(bad)" },
  539.     { "(bad)" },
  540.     { "jo", Jv },
  541.     { "jno", Jv },
  542.     { "jb", Jv },
  543.     { "jae", Jv },
  544.     { "je", Jv },
  545.     { "jne", Jv },
  546.     { "jbe", Jv },
  547.     { "ja", Jv },
  548.     { "js", Jv },
  549.     { "jns", Jv },
  550.     { "jp", Jv },
  551.     { "jnp", Jv },
  552.     { "jl", Jv },
  553.     { "jge", Jv },
  554.     { "jle", Jv },
  555.     { "jg", Jv },
  556.     { "seto", Eb },
  557.     { "setno", Eb },
  558.     { "setb", Eb },
  559.     { "setae", Eb },
  560.     { "sete", Eb },
  561.     { "setne", Eb },
  562.     { "setbe", Eb },
  563.     { "seta", Eb },
  564.     { "sets", Eb },
  565.     { "setns", Eb },
  566.     { "setp", Eb },
  567.     { "setnp", Eb },
  568.     { "setl", Eb },
  569.     { "setge", Eb },
  570.     { "setle", Eb },
  571.     { "setg", Eb },
  572.     { "pushl", fs },
  573.     { "popl", fs },
  574.     { "(bad)" },
  575.     { "btS", Ev, Gv },
  576.     { "shldS", Ev, Gv, Ib },
  577.     { "shldS", Ev, Gv, CL },
  578.     { "(bad)" },
  579.     { "(bad)" },
  580.     { "pushl", gs },
  581.     { "popl", gs },
  582.     { "(bad)" },
  583.     { "btsS", Ev, Gv },
  584.     { "shrdS", Ev, Gv, Ib },
  585.     { "shrdS", Ev, Gv, CL },
  586.     { "(bad)" },
  587.     { "imulS", Gv, Ev },
  588.     { "(bad)" },
  589.     { "(bad)" },
  590.     { "lssS", Gv, Mp },
  591.     { "btrS", Ev, Gv },
  592.     { "lfsS", Gv, Mp },
  593.     { "lgsS", Gv, Mp },
  594.     { "movzbS", Gv, Eb },
  595.     { "movzwS", Gv, Ew },
  596.     { "(bad)" },
  597.     { "(bad)" },
  598.     { GRP8 },
  599.     { "btcS", Ev, Gv },
  600.     { "bsfS", Gv, Ev },
  601.     { "bsrS", Gv, Ev },
  602.     { "movsbS", Gv, Eb },
  603.     { "movswS", Gv, Ew },
  604.     { "(bad)" },
  605.     { "(bad)" },
  606.     { "(bad)" },
  607.     { "(bad)" },
  608.     { "(bad)" },
  609.     { "(bad)" },
  610.     { "(bad)" },
  611.     { "(bad)" },
  612.     { "(bad)" },
  613.     { "(bad)" },
  614.     { "(bad)" },
  615.     { "(bad)" },
  616.     { "(bad)" },
  617.     { "(bad)" },
  618.     { "(bad)" },
  619.     { "(bad)" },
  620.     { "(bad)" },
  621.     { "(bad)" },
  622.     { "(bad)" },
  623.     { "(bad)" },
  624.     { "(bad)" },
  625.     { "(bad)" },
  626.     { "(bad)" },
  627.     { "(bad)" },
  628.     { "(bad)" },
  629.     { "(bad)" },
  630.     { "(bad)" },
  631.     { "(bad)" },
  632.     { "(bad)" },
  633.     { "(bad)" },
  634.     { "(bad)" },
  635.     { "(bad)" },
  636.     { "(bad)" },
  637.     { "(bad)" },
  638.     { "(bad)" },
  639.     { "(bad)" },
  640.     { "(bad)" },
  641.     { "(bad)" },
  642.     { "(bad)" },
  643.     { "(bad)" },
  644.     { "(bad)" },
  645.     { "(bad)" },
  646.     { "(bad)" },
  647.     { "(bad)" },
  648.     { "(bad)" },
  649.     { "(bad)" },
  650.     { "(bad)" },
  651.     { "(bad)" },
  652.     { "(bad)" },
  653.     { "(bad)" },
  654.     { "(bad)" },
  655.     { "(bad)" },
  656.     { "(bad)" },
  657.     { "(bad)" },
  658.     { "(bad)" },
  659.     { "(bad)" },
  660.     { "(bad)" },
  661.     { "(bad)" },
  662.     { "(bad)" },
  663.     { "(bad)" },
  664.     { "(bad)" },
  665.     { "(bad)" },
  666.     { "(bad)" },
  667.     { "(bad)" },  
  668. };
  669.  
  670.  
  671. static char *names32[]={
  672.     "%eax","%ecx","%edx","%ebx", "%esp","%ebp","%esi","%edi",
  673. };
  674. static char *names16[] = {
  675.     "%ax","%cx","%dx","%bx","%sp","%bp","%si","%di",
  676. };
  677. static char *names8[] = {
  678.     "%al","%cl","%dl","%bl","%ah","%ch","%dh","%bh",
  679. };
  680. static char *names_seg[] = {
  681.     "%es","%cs","%ss","%ds","%fs","%gs","%?","%?",
  682. };
  683. static char *names16_OP_E[] = {
  684.     "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di","%bp","%bx",
  685. };
  686.  
  687. struct dis386 grps[][8] = {
  688.     {
  689.         { "addb",    Eb, Ib },
  690.         { "orb",    Eb, Ib },
  691.         { "adcb",    Eb, Ib },
  692.         { "sbbb",    Eb, Ib },
  693.         { "andb",    Eb, Ib },
  694.         { "subb",    Eb, Ib },
  695.         { "xorb",    Eb, Ib },
  696.         { "cmpb",    Eb, Ib }
  697.     },
  698.     {
  699.         { "addS",    Ev, Iv },
  700.         { "orS",    Ev, Iv },
  701.         { "adcS",    Ev, Iv },
  702.         { "sbbS",    Ev, Iv },
  703.         { "andS",    Ev, Iv },
  704.         { "subS",    Ev, Iv },
  705.         { "xorS",    Ev, Iv },
  706.         { "cmpS",    Ev, Iv }
  707.     },
  708.     {
  709.         { "addS",    Ev, sIb },
  710.         { "orS",    Ev, sIb },
  711.         { "adcS",    Ev, sIb },
  712.         { "sbbS",    Ev, sIb },
  713.         { "andS",    Ev, sIb },
  714.         { "subS",    Ev, sIb },
  715.         { "xorS",    Ev, sIb },
  716.         { "cmpS",    Ev, sIb }
  717.     },
  718.     {
  719.         { "rolb",    Eb, Ib },
  720.         { "rorb",    Eb, Ib },
  721.         { "rclb",    Eb, Ib },
  722.         { "rcrb",    Eb, Ib },
  723.         { "shlb",    Eb, Ib },
  724.         { "shrb",    Eb, Ib },
  725.         { "(bad)"        },
  726.         { "sarb",    Eb, Ib },
  727.     },
  728.     {
  729.         { "rolS",    Ev, Ib },
  730.         { "rorS",    Ev, Ib },
  731.         { "rclS",    Ev, Ib },
  732.         { "rcrS",    Ev, Ib },
  733.         { "shlS",    Ev, Ib },
  734.         { "shrS",    Ev, Ib },
  735.         { "(bad)" },
  736.         { "sarS",    Ev, Ib },
  737.     },
  738.     {
  739.         { "rolb",    Eb },
  740.         { "rorb",    Eb },
  741.         { "rclb",    Eb },
  742.         { "rcrb",    Eb },
  743.         { "shlb",    Eb },
  744.         { "shrb",    Eb },
  745.         { "(bad)" },
  746.         { "sarb",    Eb },
  747.     },
  748.     {
  749.         { "rolS",    Ev },
  750.         { "rorS",    Ev },
  751.         { "rclS",    Ev },
  752.         { "rcrS",    Ev },
  753.         { "shlS",    Ev },
  754.         { "shrS",    Ev },
  755.         { "(bad)" },
  756.         { "sarS",    Ev },
  757.     },
  758.     {
  759.         { "rolb",    Eb, CL },
  760.         { "rorb",    Eb, CL },
  761.         { "rclb",    Eb, CL },
  762.         { "rcrb",    Eb, CL },
  763.         { "shlb",    Eb, CL },
  764.         { "shrb",    Eb, CL },
  765.         { "(bad)" },
  766.         { "sarb",    Eb, CL },
  767.     },
  768.     {
  769.         { "rolS",    Ev, CL },
  770.         { "rorS",    Ev, CL },
  771.         { "rclS",    Ev, CL },
  772.         { "rcrS",    Ev, CL },
  773.         { "shlS",    Ev, CL },
  774.         { "shrS",    Ev, CL },
  775.         { "(bad)" },
  776.         { "sarS",    Ev, CL }
  777.     },
  778.     {
  779.         { "testb",    Eb, Ib },
  780.         { "(bad)",    Eb },
  781.         { "notb",    Eb },
  782.         { "negb",    Eb },
  783.         { "mulb",    AL, Eb },
  784.         { "imulb",    AL, Eb },
  785.         { "divb",    AL, Eb },
  786.         { "idivb",    AL, Eb }
  787.     },
  788.     {
  789.         { "testS",    Ev, Iv },
  790.         { "(bad)" },
  791.         { "notS",    Ev },
  792.         { "negS",    Ev },
  793.         { "mulS",    eAX, Ev },
  794.         { "imulS",    eAX, Ev },
  795.         { "divS",    eAX, Ev },
  796.         { "idivS",    eAX, Ev },
  797.     },
  798.     {
  799.         { "incb", Eb },
  800.         { "decb", Eb },
  801.         { "(bad)" },
  802.         { "(bad)" },
  803.         { "(bad)" },
  804.         { "(bad)" },
  805.         { "(bad)" },
  806.         { "(bad)" },
  807.     },
  808.     {
  809.         { "incS",    Ev },
  810.         { "decS",    Ev },
  811.         { "call",    indirEv },
  812.         { "lcall",    indirEv },
  813.         { "jmp",    indirEv },
  814.         { "ljmp",    indirEv },
  815.         { "pushS",    Ev },
  816.         { "(bad)" },
  817.     },
  818.     {
  819.         { "sldt",    Ew },
  820.         { "str",    Ew },
  821.         { "lldt",    Ew },
  822.         { "ltr",    Ew },
  823.         { "verr",    Ew },
  824.         { "verw",    Ew },
  825.         { "(bad)" },
  826.         { "(bad)"     }
  827.     },
  828.     {
  829.         { "sgdt", Ew },
  830.         { "sidt", Ew },
  831.         { "lgdt", Ew },
  832.         { "lidt", Ew },
  833.         { "smsw", Ew },
  834.         { "(bad)" },
  835.         { "lmsw", Ew },
  836.         { "(bad)" },
  837.     },
  838.     {
  839.         { "(bad)" },
  840.         { "(bad)" },
  841.         { "(bad)" },
  842.         { "(bad)" },
  843.         { "btS",    Ev, Ib },
  844.         { "btsS",    Ev, Ib },
  845.         { "btrS",    Ev, Ib },
  846.         { "btcS",    Ev, Ib },
  847.     }
  848. };
  849.  
  850. #define PREFIX_REPZ 1
  851. #define PREFIX_REPNZ 2
  852. #define PREFIX_LOCK 4
  853. #define PREFIX_CS 8
  854. #define PREFIX_SS 0x10
  855. #define PREFIX_DS 0x20
  856. #define PREFIX_ES 0x40
  857. #define PREFIX_FS 0x80
  858. #define PREFIX_GS 0x100
  859. #define PREFIX_DATA 0x200
  860. #define PREFIX_ADR 0x400
  861. #define PREFIX_FWAIT 0x800
  862.  
  863.