home *** CD-ROM | disk | FTP | other *** search
/ Programming Win32 Under the API / ProgrammingWin32UnderTheApiPatVillani.iso / pedasm.zip / DasmCte.h < prev    next >
Text File  |  1998-09-06  |  35KB  |  860 lines

  1. /*    
  2.  *        fichier DasmCte.h     : fichier header
  3.  *
  4.  *    descr : classe automate desassembleur
  5.  *    fichier regroupant les constantes lie au language machine du x86 
  6.  *
  7.  *    projet : PEDasm
  8.  *    rq : inclus dans dasmCode.cpp uniquement 
  9.  *
  10.  *    rq2:
  11.  *  
  12.  *    Ce programme est libre de droits. Il peut etre distribue et/ou modifie
  13.  *  selon les termes de la licence 'GNU General Public License version 2'.
  14.  *    
  15.  *    Ce programme est distribue sans aucunes garanties, y compris d'utilite 
  16.  *    ni de risques encouru, quelle que soit son utilisation.
  17.  *
  18.  *    lire le fichier licence.txt fourni ou bien ecrire a :
  19.  *    the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20.  *    pour recevoir une copie de la licence.
  21.  *      
  22.  *    Copyright (C) 1997 - 1998 Nicolas Witczak <witczak@geocities.com>
  23.  */
  24.  
  25.  
  26. ////////////////////////////////////////////////////////////////////
  27. // prefixes
  28.     const unsigned int cteLockPrefix    = 0xf0 ;
  29.     const unsigned int cteRepNENZPrefix = 0xf2 ;    
  30.     const unsigned int cteRepPrefix        = 0xf3 ;
  31.  
  32.     const unsigned int cteCSSRegPrefix = 0x2e ;
  33.     const unsigned int cteSSSRegPrefix = 0x36 ;
  34.     const unsigned int cteDSSRegPrefix = 0x3e ;
  35.     const unsigned int cteESSRegPrefix = 0x26 ;
  36.     const unsigned int cteFSSRegPrefix = 0x64 ;
  37.     const unsigned int cteGSSRegPrefix = 0x65 ;
  38.  
  39.     const unsigned int cteOpSzOvrPrefix = 0x66 ;
  40.     const unsigned int cteAdrSZOvrPrefix = 0x67 ;
  41.  
  42. ////////////////////////////////////////////////////////////////////
  43. // taille d'operande
  44. const char*        cteOperandQualif[5] = 
  45. {    "" , "byte ptr" , "word ptr" , "dword ptr" ,"qword ptr" } ;
  46.  
  47. ////////////////////////////////////////////////////////////////////
  48. // conditions
  49. const char*        cteConditions[16] = 
  50. {    "o" , "no" , "b" , "nb" , "e" , "ne" , "be" , "a" , 
  51.     "s" , "ns" , "p" , "np" , "l" , "nl" , "le" , "g" } ;
  52.  
  53. ////////////////////////////////////////////////////////////////////
  54. // prefix de repetition
  55. const char*        cteRep[4] =
  56. { "lock " , "" , "repnz ", "rep "    } ;
  57.  
  58. const char*        cteRepZ[4] =
  59. { "lock " , "" , "repnz ", "repz "    } ;
  60.  
  61. ////////////////////////////////////////////////////////////////////
  62. // empacketage mmx
  63. const char*        cteMmxPack[4] = 
  64. { "b" , "w" , "d" , "q"    } ;
  65.  
  66. ////////////////////////////////////////////////////////////////////
  67. // registres    
  68. // 0 -> instruction non reconnu
  69.  
  70. /** registres d'usage generaux reg = [ taille ][code reg] */
  71. const char*        cteGenReg[4][8] = 
  72. {
  73.     { 0, 0 , 0 , 0 , 0 , 0 , 0 , 0 },
  74.     { "al" , "cl" , "dl" , "bl" , "ah" , "ch" , "dh" , "bh" },
  75.     { "ax" , "cx" , "dx" , "bx" , "sp" , "bp" , "si" , "di"  },
  76.     { "eax" , "ecx" , "edx" , "ebx" , "esp" , "ebp" , "esi" , "edi" }
  77. };
  78.  
  79. /** registres de segment sreg2 et sreg3 */
  80. const char*        cteSegReg[8] = 
  81. {    "es" , "cs" , "ss" , "ds" , "fs" , "gs" , 0 , 0 } ;
  82.  
  83. /** registres de controle */
  84. const char*        cteCtrlReg[8] = 
  85. {    "cr0" , 0  , "cr2" , "cr3" , "cr4" , 0 , 0 , 0 } ;
  86.  
  87. /** registres de debug */
  88. const char*        cteDebReg[8] = 
  89. {    "dr0" , "dr1"  , "dr2" , "dr3" , 0 , 0 , "dr6" , "dr7" } ;
  90.  
  91. /** registres de mmx */
  92. const char*        cteMmxReg[8] = 
  93. {    "mm0" , "mm1"  , "mm2" , "mm3" , "mm4" , "mm5" , "mm6" , "mm7" } ;
  94.  
  95. /** registres fpu */
  96. const char*        cteFpuReg[8] = 
  97. {    "st(0)" , "st(1)"  , "st(2)" , "st(3)" , "st(4)" , "st(5)" , "st(6)" , "st(7)" } ;
  98.  
  99.  
  100. ////////////////////////////////////////////////////////////////////
  101. // definition des actions ss forme de masque
  102. // 
  103. // format du mask :
  104. //        modxxxrm        -> mod rm
  105. //        registre gen    -> grg , g08 , g16 , g32
  106. //        empacketage mmx -> pp 
  107. //        registre mmx    -> xmm
  108. //        registre seg    -> 2sg 3sg
  109. //        registre control / debug    -> _cr / _dr
  110. //        registre fpu    -> fpu
  111. //        registre eax,ax,al    -> eax
  112. //        flags : s , w, d
  113. //        conditions tttn
  114. //        valeurs :    immediat    -> i08 , is8 , i16 , i32 , i00(taille par defaut) 
  115. //                    call   c00 (tjs 32b) 
  116. //                    jump   j08 , j16(inutilise) , j32
  117. //                    adressage direct mem a32 
  118. //        sep octet        -> : absent apres rm ou donees
  119. //        oos / oas        -> : override operand size  ,override adresse size doit etre present
  120. //        nos / nas        -> : override operand size  ,override adresse size ne doit pas etre present
  121. //        fin reconnaissance -> \0
  122.  
  123.  
  124.     ////////////////////////////////////////////////////////////////////
  125.     // instructions effectivement utilise
  126.     // initialise ds InitBanks() , jamais detruit
  127. static SOPContext*    pfnOPCodeMask ;
  128.  
  129.     ////////////////////////////////////////////////////////////////////
  130.     // instructions d'usage general
  131. static SOPContext    pfnOPCGeneral[] = 
  132.     { "0011 0111:"                        , "aaa" , 0 } , 
  133.  
  134.     { "1101 0101 : 0000 1010:"            , "aad" , 0 } , 
  135.  
  136.     { "1101 0100 : 0000 1010:"            , "aam" , 0 } ,     
  137.  
  138.     { "0011 1111:"                        , "aas" , 0 } , 
  139.  
  140.     { "0001 00dw : 11 grg grg:"            , "adc %1 , %0" , 0 } , 
  141.     { "0001 00dw : mod grg rm"            , "adc %p %1 , %0" , 0 } , 
  142.     { "1000 00sw : 11 010 grg : i00"    , "adc %0 , %1" , 0 } , 
  143.     { "0001 010w eax : i00"                , "adc %0 , %1" , 0 } , 
  144.     { "1000 00sw : mod 010 rm i00"        , "adc %p %0 , %1" , 0 } , 
  145.  
  146.     { "0000 00dw : 11 grg grg:"            , "add %1 , %0" , 0 } , 
  147.     { "0000 00dw : mod grg rm"            , "add %p %1 , %0" , 0 } , 
  148.     { "1000 00sw : 11 000 grg : i00"    , "add %0 , %1" , 0 } , 
  149.     { "0000 010w eax: i00"                , "add %0 , %1" , 0 } , 
  150.     { "1000 00sw : mod 000 rm i00"        , "add %p  %0 , %1" , 0 } , 
  151.  
  152.     { "0010 00dw : 11 grg grg:"            , "and %1 , %0" , 0 } , 
  153.     { "0010 00dw : mod grg rm"            , "and %p %1 , %0" , 0 } , 
  154.     { "1000 00sw : 11 100 grg: i00"        , "and %0 , %1" , 0 } , 
  155.     { "0010 010w eax: i00"                , "and %0 , %1" , 0 } , 
  156.     { "1000 00sw : mod 100 rm i00"        , "and %p %0 , %1" , 0 } , 
  157.     
  158.     { "0110 0010 : mod grg rm"            , "bound %0 , %1" , 0 } , 
  159.  
  160.     { "0000 1111 : 1011 1100 : 11 grg grg:" , "bsf %1 , %0" , 0 } , 
  161.     { "0000 1111 : 1011 1100 : mod grg rm" , "bsf %p %1 , %0" , 0 } , 
  162.  
  163.     { "0000 1111 : 1011 1101 : 11 grg grg:" , "bsr %1 , %0" , 0 } , 
  164.     { "0000 1111 : 1011 1101 : mod grg rm" , "bsr %p %1 , %0" , 0 } , 
  165.  
  166.     { "0000 1111 : 1100 1 grg:"            , "bswap %0" , 0 } , 
  167.  
  168.     { "0000 1111 : 1011 1010 : 11 100 grg : i08"    , "bt %0 , %1" , 0 } , 
  169.     { "0000 1111 : 1011 1010 : mod 100 rm i08"        , "bt %p %0 , %1" , 0 } , 
  170.     { "0000 1111 : 1010 0011 : 11 grg grg:"            , "bt %1 , %0" , 0 } , 
  171.     { "0000 1111 : 1010 0011 : mod grg rm"            , "bt %p %1 , %0" , 0 } , 
  172.  
  173.     { "0000 1111 : 1011 1010 : 11 111 grg : i08"    , "btc %0 , %1" , 0 } , 
  174.     { "0000 1111 : 1011 1010 : mod 111 rm   i08"    , "btc %p %0 , %1" , 0 } , 
  175.     { "0000 1111 : 1011 1011 : 11 grg grg:"            , "btc %1 , %0" , 0 } , 
  176.     { "0000 1111 : 1011 1011 : mod grg rm"            , "btc %p %1 , %0" , 0 } , 
  177.  
  178.     { "0000 1111 : 1011 1010 : 11 110 grg : i08"    , "btr %0 , %1" , 0 } , 
  179.     { "0000 1111 : 1011 1010 : mod 110 rm i08"        , "btr %p %0 , %1" , 0 } , 
  180.     { "0000 1111 : 1011 0011 : 11 grg grg:"            , "btr %1 , %0" , 0 } , 
  181.     { "0000 1111 : 1011 0011 : mod grg rm"            , "btr %p %1 , %0" , 0 } , 
  182.     
  183.     { "0000 1111 : 1011 1010 : 11 101 grg : i08"    , "bts %0 , %1" , 0 } , 
  184.     { "0000 1111 : 1011 1010 : mod 101 rm i08"        , "bts %p %0 , %1" , 0 } , 
  185.     { "0000 1111 : 1010 1011 : 11 grg grg:"            , "bts %1 , %0" , 0 } , 
  186.     { "0000 1111 : 1010 1011 : mod grg rm"            , "bts %p %1 , %0" , 0 } , 
  187.  
  188.     { "1110 1000:c32"            , "call %0", 0 } ,        // call direct
  189.     { "1111 1111:11 010 grg:"    , "call %0", 0 } ,        // call indirect
  190.     { "1111 1111:mod 010 rm"    , "call %p %0", 0 } , 
  191.  
  192.     { "1001 1000:" , "cbw" , 0 } , 
  193.     { "1001 1001:" , "cdq" , 0 } , 
  194.     { "1111 1000:" , "clc" , 0 } , 
  195.     { "1111 1100:" , "cld" , 0 } , 
  196.     { "1111 1010:" , "cli" , 0 } , 
  197.     { "1111 0101:" , "cmc" , 0 } , 
  198.     
  199.     { "0000 1111: 0100 tttn : 11 grg grg:"        , "cmov%c %0 , %1" , 0 } , 
  200.     { "0000 1111: 0100 tttn : mod grg rm"        , "cmov%c %0 , %p %1" , 0 } , 
  201.     
  202.     { "0011 10dw : 11 grg grg:"                    , "cmp %1 , %0" , 0 } , 
  203.     { "0011 10dw : mod grg rm"                    , "cmp %p %1 , %0" , 0 } , 
  204.     { "1000 00sw : 11 111 grg : i00 "            , "cmp %0 , %1" , 0 } , 
  205.     { "0011 110w eax : i00"                        , "cmp %0 , %1" , 0 } , 
  206.     { "1000 00sw : mod 111 rm i00"                , "cmp %p %0 , %1" , 0 } , 
  207.     
  208.     { "1010 0110:"                                , "%rzcmpsb" , 0 } ,            
  209.     { "oas 1010 0111:"                            , "%rzcmpsw" , 0 } , 
  210.     { "nas 1010 0111:"                            , "%rzcmpsd" , 0 } , 
  211.     
  212.     { "0000 1111 : 1011 000w : 11 grg grg:"        , "cmpxchg %1 , %0" , 0 } , 
  213.     { "0000 1111 : 1011 000w : mod grg rm"        , "cmpxchg %p %1 , %0" , 0 } , 
  214.  
  215.     { "0000 1111 : 1100 0111 : a32"                , "cmpxchg8b qword ptr %0" , 0 } , 
  216.  
  217.     { "0000 1111 : 1010 0010:"                    , "cpuid" , 0 } , 
  218.     { "1001 1001:"                                , "cwd" , 0 } , 
  219.     { "1001 1000:"                                , "cwde" , 0 } , 
  220.     { "0010 0111:"                                , "daa" , 0 } , 
  221.     { "0010 1111:"                                , "das" , 0 } , 
  222.  
  223.     { "1111 111w : 11 001 grg:"                    , "dec %0" , 0 } , 
  224.     { "0100 1 grg:"                                , "dec %0" , 0 } , 
  225.     { "1111 111w : mod 001 rm"                    , "dec %p %0" , 0 } , 
  226.  
  227.     { "1111 011w : 11 110 grg:"                    , "div %0" , 0 } , 
  228.     { "1111 011w : mod 110 rm"                    , "div %p %0" , 0 } , 
  229.  
  230.     { "1100 1000 : i16 i08"                        , "enter %0 , %1" , 0 } , 
  231.     
  232.     { "1111 011w : 11 111 grg:"                    , "idiv %0" , 0 } , 
  233.     { "1111 011w : mod 111 rm"                    , "idiv %p %0" , 0 } , 
  234.     
  235.     { "1111 011w : 11 101 grg:"                    , "imul %0" , 0 } , 
  236.     { "1111 011w : mod 101 grg:"                , "imul %p %0" , 0 } , 
  237.     { "0000 1111 : 1010 1111 : 11 grg grg:"        , "imul %0 , %1" , 0 } , 
  238.     { "0000 1111 : 1010 1111 : mod grg rm"        , "imul %0 , %p %1" , 0 } , 
  239.     { "0110 10s1 : 11 grg grg: i00 "            , "imul %0 , %1 , %2" , 0 } , 
  240.     { "0110 10s1 : mod grg rm  i00 "            , "imul %0 , %p %1 , %2" , 0 } , 
  241.  
  242.     { "1111 111w : 11 000 grg:"    , "inc %0" , 0 } , 
  243.     { "0100 0 grg:"                , "inc %0" , 0 } , 
  244.     { "1111 111w : mod 000 rm"    , "inc %p %0" , 0 } , 
  245.     
  246.     { "1100 1101 : i08" , "int %0" , 0 } , 
  247.     { "1100 1100:"        , "int 3" , 0 } , 
  248.     
  249.     { "1100 1110:"                            , "into" , 0 } , 
  250.     { "1100 1111:"                            , "iret" , 0 } , 
  251.  
  252.     { "0111 tttn : j08"                        , "j%c %0" , 0 } , 
  253.     { "0000 1111 : 1000 tttn : j32 "        , "j%c %0" , 0 } , 
  254.  
  255.     { "oas 1110 0011 : j08"                    , "jcxz %0" , 0 } , 
  256.     { "nas1110 0011 : j08"                    , "jecxz %0" , 0 } , 
  257.  
  258.     { "1110 1011 : j08"            , "jmp %0" , 0 } , 
  259.     { "1110 1001 : j32"            , "jmp %0" , 0 } , 
  260.     { "1111 1111 : 11 100 grg:"    , "jmp %0" , 0 } , 
  261.     { "1111 1111 : mod 100 rm"    , "jmp %p %0" , 0 } , 
  262.  
  263.     { "1110 1010 : i32 i16 " , "jmp far %1 : %0" , 0 } , 
  264.     { "1111 1111 : mod 101 rm" , "jmp far %p %0 " , 0 } , 
  265.     
  266.     { "1001 1111:" , "lahf" , 0 } , 
  267.     
  268.     { "1100 0101 : mod grg rm"                , "lds %0" , 0 } , 
  269.     { "1000 1101 : mod grg rm"                , "lea %0 , %p %1" , 0 } , 
  270.  
  271.     { "1100 1001:"                            , "leave" , 0 } , 
  272.     { "1100 0100 : mod grg rm"                , "les %0 , %1" , 0 } , 
  273.     { "0000 1111 : 1011 0100 : mod grg rm"    , "lfs %0 , %1" , 0 } , 
  274.  
  275.     { "0000 1111 : 1011 0101 : mod grg rm"    , "lgs %0 , %p %1" , 0 } , 
  276.  
  277.     { "1010 1100:"        , "%r_lodsb" , 0 } , 
  278.     { "oas1010 1101:"    , "%r_lodsw" , 0 } , 
  279.     { "nas1010 1101:"    , "%r_lodsd" , 0 } , 
  280.  
  281.     { "1110 0010 : j08" , "loop %0" , 0 } , 
  282.     { "1110 0001 : j08" , "loope %0" , 0 } , 
  283.  
  284.     { "0000 1111 : 1011 0010 : mod grg rm" , "lss %0 , %p %1" , 0 } , 
  285.  
  286.     { "1000 10dw:11 grg grg: "        , "mov %1 , %0" , 0 } ,    // mov reg reg
  287.     { "1000 10dw:mod grg rm"        , "mov %p %1 , %0" , 0 } ,    // mov reg modm
  288.     { "1100 011w:11 000 grg:i00"    , "mov %0 , %1" , 0 } ,    // mov reg , imm
  289.     { "1100 011w:mod 000 rm i00"    , "mov %p %0 , %1" , 0 } ,    // mov rm , imm
  290.     { "1011 w grg:i00"                , "mov %0 , %1" , 0 } ,    // mov reg , imm alternate
  291.     
  292.     { "1010 00dw eax:a32"            , "mov %0 , %p %1" , 0 } ,    // mov eax , disp
  293.  
  294.     { "1000 11d0 : 11 3sg grg :"            , "mov %1 , %0" , 0 } , 
  295.     { "1000 11d0 : mod 3sg rm"                , "mov %1 , %0" , 0 } , 
  296.     
  297.     { "1010 0100:"        , "%r_movsb" , 0 } , 
  298.     { "oas 1010 0101:"    , "%r_movsw" , 0 } , 
  299.     { "nas 1010 0101:"    , "%r_movsd" , 0 } , 
  300.  
  301.     { "0000 1111 : 1011 1110 : 11 g32 g08:"    , "movsx %0 , %1" , 0 } , 
  302.     { "0000 1111 : 1011 1111 : 11 g32 g16:"    , "movsx %0 , %1" , 0 } , 
  303.     { "0000 1111 : 1011 1110 : mod g32 rm"    , "movsx %0 ,byte ptr %1" , 0 } , 
  304.     { "0000 1111 : 1011 1111 : mod g32 rm"    , "movsx %0 ,word ptr %1" , 0 } , 
  305.  
  306.     { "0000 1111 : 1011 0110 : 11 g32 g08:"    , "movzx %0 , %1" , 0 } , 
  307.     { "0000 1111 : 1011 0111 : 11 g32 g16:"    , "movzx %0 , %1" , 0 } , 
  308.     { "0000 1111 : 1011 0110 : mod g32 rm"    , "movzx %0 ,byte ptr %1" , 0 } , 
  309.     { "0000 1111 : 1011 0111 : mod g32 rm"    , "movzx %0 ,word ptr %1" , 0 } , 
  310.  
  311.     { "1111 011w : 11 100 grg:"        , "mul %0" , 0 } , 
  312.     { "1111 011w : mod 100 rm"        , "mul %p %0" , 0 } , 
  313.  
  314.     { "1111 011w : mod 011 grg:"    , "neg %0" , 0 } , 
  315.     { "1111 011w : mod 011 rm"        , "neg %p %0" , 0 } , 
  316.  
  317.     { "1001 0000:"                    , "nop" , 0 } , 
  318.  
  319.     { "1111 011w : 11 010 grg:" , "not %0" , 0 } , 
  320.     { "1111 011w : mod 010 rm"    , "not %p %0" , 0 } , 
  321.  
  322.     { "0000 10dw : 11 grg grg:"            , "or %1 , %0" , 0 } , 
  323.     { "0000 10dw : mod grg rm"            , "or %p %1 , %0" , 0 } , 
  324.     { "1000 00sw : 11 001 grg : i00"    , "or %0 , %1" , 0 } , 
  325.     { "0000 110w eax : i00 "            , "or %0 , %1" , 0 } , 
  326.     { "1000 00sw : mod 001 rm i00"        , "or %p %0 , %1" , 0 } , 
  327.  
  328.     { "1000 1111 : 11 000 grg:"        , "pop %0" , 0 } , 
  329.     { "0101 1 grg:"                    , "pop %0" , 0 } , 
  330.     { "1000 1111 : mod 000 rm"        , "pop %p %0" , 0 } , 
  331.  
  332.     { "0001 1111:"                    , "pop ds" , 0 } , 
  333.     { "0000 0111:"                    , "pop es" , 0 } , 
  334.     { "0001 0111:"                    , "pop ss" , 0 } , 
  335.     { "0000 1111 : 1010 0001 :"        , "pop fs" , 0 } , 
  336.     { "0000 1111 : 1010 1001 :"        , "pop gs" , 0 } , 
  337.     
  338.     { "oos 0110 0001:"                , "popa" , 0 } , 
  339.     { "nos 0110 0001:"                , "popad" , 0 } , 
  340.     { "oos 1001 1101:"                , "popf" , 0 } , 
  341.     { "nos 1001 1101:"                , "popfd" , 0 } , 
  342.  
  343.     { "1111 1111:11 110 grg:"        , "push %0" },    // push reg 
  344.     { "0101 0 grg:"                    , "push %0" },    // push reg     
  345.     { "1111 1111 : mod 110 rm"        , "push %p %0" },    // push mem
  346.     
  347.     { "oos 0110 10s0 : i00"            , "pushw %0" },
  348.     { "nos 0110 10s0 : i00"            , "pushd %0" },
  349.  
  350.     { "0001 1110:"                    , "push cs" , 0 } , 
  351.     { "0001 0110:"                    , "push ss" , 0 } , 
  352.     { "0001 1110:"                    , "push ds" , 0 } , 
  353.     { "0000 0110:"                    , "push es" , 0 } , 
  354.     { "0000 1111 : 1010 0000 :"        , "push fs" , 0 } , 
  355.     { "0000 1111 : 1010 1000 :"        , "push gs" , 0 } , 
  356.  
  357.     { "oos 0110 0000:"                , "pusha" , 0 } , 
  358.     { "nos 0110 0000:"                , "pushad" , 0 } , 
  359.     { "oos 1001 1100:"                , "pushf" , 0 } , 
  360.     { "nos 1001 1100:"                , "pushfd" , 0 } , 
  361.  
  362.     { "1101 000w : 11 010 grg:"        , "rcl %0 , 1" , 0 } , 
  363.     { "1101 000w : mod 010 rm"        , "rcl %p %0 , 1" , 0 } , 
  364.     { "1101 001w : 11 010 grg:"        , "rcl %0 , cl" , 0 } , 
  365.     { "1101 001w : mod 010 rm"        , "rcl %p %0 , cl" , 0 } , 
  366.     { "1100 000w : 11 010 grg :i08" , "rcl %0 , %1" , 0 } , 
  367.     { "1100 000w : mod 010 rm  i08"    , "rcl %p %0 , %1" , 0 } , 
  368.  
  369.     { "1101 000w : 11 011 grg:"        , "rcr %0 , 1" , 0 } , 
  370.     { "1101 000w : mod 011 rm"        , "rcr %p %0 , 1" , 0 } , 
  371.     { "1101 001w : 11 011 grg:"        , "rcr %0 , cl" , 0 } , 
  372.     { "1101 001w : mod 011 rm"        , "rcr %p %0 , cl" , 0 } , 
  373.     { "1100 000w : 11 011 grg :i08" , "rcr %0 , %1" , 0 } , 
  374.     { "1100 000w : mod 011 rm  i08"    , "rcr %p %0 , %1" , 0 } , 
  375.  
  376.     { "1100 0011 :"                    , "ret" , 0 } , 
  377.     { "1100 0010 : i16"                , "ret %0" , 0 } , 
  378.  
  379.     { "1100 1011 :"                    , "ret far" , 0 } , 
  380.     { "1100 1010 : i16"                , "ret far %0" , 0 } , 
  381.  
  382.     { "1101 000w : 11 000 grg:"        , "rol %0 , 1" , 0 } , 
  383.     { "1101 000w : mod 000 rm"        , "rol %p %0 , 1" , 0 } , 
  384.     { "1101 001w : 11 000 grg:"        , "rol %0 , cl" , 0 } , 
  385.     { "1101 001w : mod 000 rm"        , "rol %p %0 , cl" , 0 } , 
  386.     { "1100 000w : 11 000 grg :i08" , "rol %0 , %1" , 0 } , 
  387.     { "1100 000w : mod 000 rm  i08"    , "rol %p %0 , %1" , 0 } , 
  388.  
  389.     { "1101 000w : 11 001 grg:"        , "ror %0 , 1" , 0 } , 
  390.     { "1101 000w : mod 001 rm"        , "ror %p %0 , 1" , 0 } , 
  391.     { "1101 001w : 11 001 grg:"        , "ror %0 , cl" , 0 } , 
  392.     { "1101 001w : mod 001 rm"        , "ror %p %0 , cl" , 0 } , 
  393.     { "1100 000w : 11 001 grg :i08" , "ror %0 , %1" , 0 } , 
  394.     { "1100 000w : mod 001 rm  i08"    , "ror %p %0 , %1" , 0 } ,
  395.  
  396.     { "1001 1110 :"                    , "sahf" , 0 } , 
  397.  
  398.     { "1101 000w : 11 111 grg:"        , "sar %0 , 1" , 0 } , 
  399.     { "1101 000w : mod 111 rm"        , "sar %p %0 , 1" , 0 } , 
  400.     { "1101 001w : 11 111 grg:"        , "sar %0 , cl" , 0 } , 
  401.     { "1101 001w : mod 111 rm"        , "sar %p %0 , cl" , 0 } , 
  402.     { "1100 000w : 11 111 grg :i08" , "sar %0 , %1" , 0 } , 
  403.     { "1100 000w : mod 111 rm  i08"    , "sar %p %0 , %1" , 0 } ,
  404.     
  405.     { "0001 10dw : 11 grg grg:"        , "sbb %1 , %0" , 0 } , 
  406.     { "0001 10dw : mod grg rm"        , "sbb %1 , %0" , 0 } , 
  407.     { "1000 00sw : 11 011 grg: i00"    , "sbb %0 , %1" , 0 } , 
  408.     { "0001 110w eax : i00"            , "sbb %0 , %1" , 0 } , 
  409.     { "1000 00sw : mod 011 rm i00"    , "sbb %p %0 , %1" , 0 } , 
  410.     
  411.     { "1010 1110:"        , "%rzscasb" , 0 } , 
  412.     { "oas 1010 1111:"    , "%rzscasw" , 0 } , 
  413.     { "nas 1010 1111:"    , "%rzscasd" , 0 } , 
  414.  
  415.     { "0000 1111 : 1001 tttn : 11 000 g08:"    , "set%c %0" , 0 } , 
  416.     { "0000 1111 : 1001 tttn : mod 000 rm"    , "set%c byte ptr %0" , 0 } ,  
  417.  
  418.     { "1101 000w : 11 100 grg:"        , "shl %0 , 1" , 0 } , 
  419.     { "1101 000w : mod 100 rm"        , "shl %p %0 , 1" , 0 } , 
  420.     { "1101 001w : 11 100 grg:"        , "shl %0 , cl" , 0 } , 
  421.     { "1101 001w : mod 100 rm"        , "shl %p %0 , cl" , 0 } , 
  422.     { "1100 000w : 11 100 grg :i08" , "shl %0 , %1" , 0 } , 
  423.     { "1100 000w : mod 100 rm  i08"    , "shl %p %0 , %1" , 0 } ,
  424.  
  425.     { "0000 1111 : 1010 0100 : 11 grg grg : i08"    , "shld %1 , %0 , %2" , 0 } , 
  426.     { "0000 1111 : 1010 0100 : mod grg rm i08"        , "shld %p %1 , %0 , %2" , 0 } , 
  427.     { "0000 1111 : 1010 0101 : 11 grg grg:"            , "shld %1 , %0 , cl" , 0 } , 
  428.     { "0000 1111 : 1010 0101 : mod grg rm"            , "shld %p %1 , %0 , cl" , 0 } , 
  429.  
  430.     { "1101 000w : 11 101 grg:"        , "shr %0 , 1" , 0 } , 
  431.     { "1101 000w : mod 101 rm"        , "shr %p %0 , 1" , 0 } , 
  432.     { "1101 001w : 11 101 grg:"        , "shr %0 , cl" , 0 } , 
  433.     { "1101 001w : mod 101 rm"        , "shr %p %0 , cl" , 0 } , 
  434.     { "1100 000w : 11 101 grg :i08" , "shr %0 , %1" , 0 } , 
  435.     { "1100 000w : mod 101 rm  i08"    , "shr %p %0 , %1" , 0 } ,
  436.  
  437.     { "0000 1111 : 1010 1100 : 11 grg grg : i08"    , "shrd %1 , %0 , %2" , 0 } , 
  438.     { "0000 1111 : 1010 1100 : mod grg rm i08"        , "shrd %p %1 , %0 , %2" , 0 } , 
  439.     { "0000 1111 : 1010 1101 : 11 grg grg:"            , "shrd %1 , %0 , cl" , 0 } , 
  440.     { "0000 1111 : 1010 1101 : mod grg rm"            , "shrd %p %1 , %0 , cl" , 0 } , 
  441.  
  442.     { "1111 1001 :" , "stc" , 0 } , 
  443.     { "1111 1101 :" , "std" , 0 } , 
  444.     { "1111 1011 :" , "sti" , 0 } , 
  445.  
  446.     { "1010 1010 :"        , "%r_stosb" , 0 } , 
  447.     { "oas1010 1011 :"    , "%r_stosw" , 0 } , 
  448.     { "nas1010 1011 :"    , "%r_stosd" , 0 } , 
  449.  
  450.     { "0010 10dw : 11 grg grg:"        , "sub %1 , %0" , 0 } , 
  451.     { "0010 10dw : mod grg rm"        , "sub %p %1 , %0" , 0 } , 
  452.     { "1000 00sw : 11 101 grg: i00"    , "sub %0 , %1" , 0 } , 
  453.     { "0010 110w eax : i00"            , "sub %0 , %1" , 0 } , 
  454.     { "1000 00sw : mod 101 rm i00"    , "sub %p %0 , %1" , 0 } , 
  455.  
  456.     { "1000 010w : 11 grg grg:"        , "test %1 , %0" , 0 } , 
  457.     { "1000 010w : mod grg rm"        , "test %p %1 , %0" , 0 } , 
  458.     { "1111 011w : 11 000 grg: i00"    , "test %p %0 , %1" , 0 } , 
  459.     { "1010 100w eax: i00"            , "test %0 , %1" }, 
  460.     { "1111 011w : mod 000 rm i00"    , "test %p %0 , %1" , 0 } , 
  461.  
  462.     { "0000 1111 : 0000 1011 :"        , "ud2" , 0 } , 
  463.  
  464.     { "1001 1011 :" , "wait" , 0 } , 
  465.  
  466.     { "0000 1111 : 1100 000w : 11 grg grg:" , "xadd %1 , %0" , 0 } , 
  467.     { "0000 1111 : 1100 000w : mod grg rm" , "xadd %p %1 , %0" , 0 } , 
  468.  
  469.     { "1000 011w : 11 grg grg:"        , "xchg %1 , %0" , 0 } , 
  470.     { "1000 011w : mod grg rm"        , "xchg %p %1 , %0" , 0 } , 
  471.     { "1001 0 eax grg:"                , "xchg %0 , %1 " , 0 } , 
  472.     { "1101 0111:"                    , "xlat" },
  473.     { "0011 00dw : 11 grg grg:"        , "xor %1 , %0" , 0 } , 
  474.     { "0011 00dw : mod grg rm"        , "xor %p %1 , %0" , 0 } , 
  475.     { "1000 00sw : 11 110 grg: i00 ", "xor %0 , %1" , 0 } , 
  476.     { "0011 010w eax: i00"            , "xor %0 , %1" , 0 } , 
  477.     { "1000 00sw : mod 110 rm i00"    , "xor %p %0 , %1" , 0 } , 
  478.     { 0 , 0 , 0 } 
  479. };
  480.  
  481.     ////////////////////////////////////////////////////////////////////
  482.     // instructions fpu
  483. static SOPContext    pfnOPCFPU[] = 
  484.     { "11011 001 : 1111 0000:"                , "f2xm1" , 0 } , 
  485.     { "11011 001 : 1110 0001:"                , "fabs" , 0 } , 
  486.     
  487.     { "11011 000 : mod 000 rm"                , "fadd dword ptr %0" , 0 } , 
  488.     { "11011 100 : mod 000 rm"                , "fadd qword ptr %0" , 0 } , 
  489.     { "11011 000 : 11 000 fpu:"                , "fadd st(0) , %0" , 0 } , 
  490.     { "11011 100 : 11 000 fpu:"                , "fadd %0 , st(0)" , 0 } , 
  491.     
  492.     { "11011 110 : 11 000 fpu:"                , "faddp %0 , st(0)" , 0 } , 
  493.     { "11011 111 : mod 100 rm"                , "fbld" , 0 } , 
  494.     { "11011 111 : mod 110 rm"                , "fbstp" , 0 } , 
  495.     { "11011 001 : 1110 0000:"                , "fchs" , 0 } , 
  496.     { "11011 011 : 1110 0010:"                , "fclex" , 0 } , 
  497.  
  498.     { "11011 010 : 11 000 fpu:"                , "fcmovb st(0) , %0" , 0 } , 
  499.     { "11011 010 : 11 001 fpu:"                , "fcmove st(0) , %0" , 0 } , 
  500.     { "11011 010 : 11 010 fpu:"                , "fcmovbe st(0) , %0" , 0 } , 
  501.     { "11011 010 : 11 011 fpu:"                , "fcmovu st(0) , %0" , 0 } , 
  502.     { "11011 011 : 11 000 fpu:"                , "fcmovnb st(0) , %0" , 0 } , 
  503.     { "11011 011 : 11 001 fpu:"                , "fcmovne st(0) , %0" , 0 } , 
  504.     { "11011 011 : 11 010 fpu:"                , "fcmovnbe st(0) , %0" , 0 } , 
  505.     { "11011 011 : 11 011 fpu:"                , "fcmovnu st(0) , %0" , 0 } , 
  506.  
  507.     { "11011 000 : mod 010 rm"                , "fcom dword ptr %0" , 0 } , 
  508.     { "11011 100 : mod 010 rm"                , "fcom qword ptr %0" , 0 } , 
  509.     { "11011 000 : 11 010 fpu:"                , "fcom %0" , 0 } ,
  510.     
  511.     { "11011 000 : mod 011 rm"                , "fcomp dword ptr %0" , 0 } , 
  512.     { "11011 100 : mod 011 rm"                , "fcomp qword ptr %0" , 0 } , 
  513.     { "11011 000 : 11 011 fpu:"                , "fcomp %0" , 0 } , 
  514.  
  515.     { "11011 110 : 11 011 001:"                , "fcompp" , 0 } , 
  516.     { "11011 011 : 11 110 fpu:"                , "fcomi %0" , 0 } , 
  517.     { "11011 111 : 11 110 fpu:"                , "fcomip" , 0 } , 
  518.     { "11011 001 : 1111 1111:"                , "fcos" , 0 } , 
  519.     { "11011 001 : 1111 0110:"                , "fdecstp" , 0 } , 
  520.  
  521.     { "11011 000 : mod 110 rm"                , "fdiv dword ptr %0" , 0 } , 
  522.     { "11011 100 : mod 110 rm"                , "fdiv qword ptr %0" , 0 } ,     
  523.     { "11011 000 : 11110 fpu:"                , "fdiv st(0) , %0" , 0 } , 
  524.     { "11011 100 : 11111 fpu:"                , "fdiv %0 , st(0)" , 0 } , 
  525.     { "11011 110 : 1111 1 fpu:"                , "fdivp %0 , st(0)" , 0 } , 
  526.  
  527.     { "11011 000 : mod 111 rm"                , "fdivr dword ptr %0" , 0 } , 
  528.     { "11011 100 : mod 111 rm"                , "fdivr qword ptr %0" , 0 } , 
  529.     { "11011 000 : 11111 fpu:"                , "fdivr st(0) , %0" , 0 } , 
  530.     { "11011 100 : 11110 fpu:"                , "fdivr %0 , st(0)" , 0 } , 
  531.     { "11011 110 : 1111 0 fpu:"                , "fdivrp %0  , st(0)" , 0 } , 
  532.     
  533.     { "11011 101 : 1100 0 fpu:"                , "ffree %0" , 0 } , 
  534.     
  535.     { "11011 110 : mod 000 rm"                , "fiadd word ptr %0" , 0 } , 
  536.     { "11011 010 : mod 000 rm"                , "fiadd dword ptr %0" , 0 } , 
  537.  
  538.     { "11011 110 : mod 010 rm"                , "ficom word ptr %0" , 0 } , 
  539.     { "11011 010 : mod 010 rm"                , "ficom dword ptr %0" , 0 } , 
  540.  
  541.     { "11011 110 : mod 011 rm"                , "ficomp word ptr %0" , 0 } , 
  542.     { "11011 010 : mod 011 rm"                , "ficomp dword ptr %0" , 0 } , 
  543.  
  544.     { "11011 110 : mod 110 rm"                , "fidiv word ptr %0" , 0 } , 
  545.     { "11011 010 : mod 110 rm"                , "fidiv dword ptr %0" , 0 } , 
  546.     
  547.     { "11011 110 : mod 111 rm"                , "fidivr word ptr %0" , 0 } , 
  548.     { "11011 010 : mod 111 rm"                , "fidivr dword ptr %0" , 0 } , 
  549.  
  550.     { "11011 111 : mod 000 rm"                , "fild word ptr %0 " , 0 } , 
  551.     { "11011 011 : mod 000 rm"                , "fild dword ptr %0 " , 0 } , 
  552.     { "11011 111 : mod 101 rm"                , "fild qword ptr %0 " , 0 } , 
  553.     
  554.     { "11011 110 : mod 001 rm"                , "fimul word ptr %0" , 0 } , 
  555.     { "11011 010 : mod 001 rm"                , "fimul dword ptr %0" , 0 } , 
  556.  
  557.     { "11011 001 : 1111 0111:"                , "fincstp" , 0 } , 
  558.     { "10011011 : 11011011 : 11100011:"        , "finit" , 0 } , 
  559.     { "11011011 : 11100011:"                , "fninit" , 0 } , 
  560.     
  561.     { "11011 111 : mod 010 rm"                , "fist word ptr %0" , 0 } , 
  562.     { "11011 011 : mod 010 rm"                , "fist dword ptr %0" , 0 } , 
  563.     
  564.     { "11011 111 : mod 011 rm"                , "fistp word ptr %0" , 0 } , 
  565.     { "11011 011 : mod 011 rm"                , "fistp dword ptr %0" , 0 } , 
  566.     { "11011 111 : mod 111 rm"                , "fistp qword ptr %0" , 0 } , 
  567.     
  568.     { "11011 110 : mod 100 rm"                , "fisub word ptr %0" , 0 } , 
  569.     { "11011 010 : mod 100 rm"                , "fisub dword ptr %0" , 0 } , 
  570.  
  571.     { "11011 110 : mod 101 rm"                , "fisubr word ptr %0" , 0 } , 
  572.     { "11011 010 : mod 101 rm"                , "fisubr dword ptr %0" , 0 } , 
  573.  
  574.     { "11011 001 : mod 000 rm"                , "fld dword ptr %0" , 0 } , 
  575.     { "11011 101 : mod 000 rm"                , "fld qword ptr %0" , 0 } , 
  576.     { "11011 011 : mod 101 rm"                , "fld tbyte ptr %0" , 0 } , // a voir
  577.     { "11011 001 : 11 000 fpu:"                , "fld %0" },
  578.              
  579.     { "11011 001 : 1110 1000:"                , "fld1" , 0 } , 
  580.     { "11011 001 : mod 101 rm"                , "fldcw %0" , 0 } , 
  581.     { "11011 001 : mod 100 rm"                , "fldenv %0" , 0 } , 
  582.     { "11011 001 : 1110 1010:"                , "fldl2e" , 0 } , 
  583.     { "11011 001 : 1110 1001:"                , "fldl2t" , 0 } , 
  584.     { "11011 001 : 1110 1100:"                , "fldlg2" , 0 } , 
  585.     { "11011 001 : 1110 1101:"                , "fldln2" , 0 } , 
  586.     { "11011 001 : 1110 1011:"                , "fldpi" , 0 } , 
  587.     { "11011 001 : 1110 1110:"                , "fldz" , 0 } , 
  588.  
  589.     { "11011 000 : mod 001 rm"                , "fmul dword ptr %0" , 0 } , 
  590.     { "11011 100 : mod 001 rm"                , "fmul qword ptr %0" , 0 } , 
  591.     { "11011 000 : 11 001 fpu:"                , "fmul st(0) , %0" , 0 } , 
  592.     { "11011 100 : 11 001 fpu:"                , "fmul %0 , st(0)" , 0 } , 
  593.     { "11011 110 : 11 001 fpu:"                , "fmulp %0 , st(0)" , 0 } , 
  594.  
  595.     { "11011 001 : 1101 0000:"                , "fnop" , 0 } , 
  596.     { "11011 001 : 1111 0011:"                , "fpatan" , 0 } , 
  597.     { "11011 001 : 1111 1000:"                , "fprem" , 0 } , 
  598.     { "11011 001 : 1111 0101:"                , "fprem1" , 0 } , 
  599.     { "11011 001 : 1111 0010:"                , "fptan" , 0 } , 
  600.     { "11011 001 : 1111 1100:"                , "frndint" , 0 } , 
  601.     { "11011 101 : mod 100 rm"                , "frstor %0" , 0 } , 
  602.     { "11011 101 : mod 110 rm"                , "fsave %0" , 0 } , 
  603.     { "11011 001 : 1111 1101:"                , "fscale" , 0 } , 
  604.     { "11011 001 : 1111 1110:"                , "fsin" , 0 } , 
  605.     { "11011 001 : 1111 1011:"                , "fsincos" , 0 } , 
  606.     { "11011 001 : 1111 1010:"                , "fsqrt" , 0 } , 
  607.     
  608.     { "11011 001 : mod 010 rm"                , "fst dword ptr %0" , 0 } , 
  609.     { "11011 101 : mod 010 rm"                , "fst qword ptr %0" , 0 } , 
  610.     { "11011 101 : 11 010 fpu:"                , "fst %0" , 0 } , 
  611.  
  612.     { "11011 001 : mod 111 rm"                , "fstcw %0" , 0 } , 
  613.     { "11011 001 : mod 110 rm"                , "fstenv %0" , 0 } , 
  614.     
  615.     { "11011 001 : mod 011 rm"                , "fstp dword ptr %0" , 0 } , 
  616.     { "11011 101 : mod 011 rm"                , "fstp qword ptr %0" , 0 } , 
  617.     { "11011 011 : mod 111 rm"                , "fstp tbyte ptr %0" , 0 } , // a voir
  618.     { "11011 101 : 11 011 fpu:"                , "fstp %0" , 0 } , 
  619.  
  620.     { "11011 111 : 1110 0000:"                , "fstsw ax" , 0 } , 
  621.     { "11011 101 : mod 111 rm"                , "fstsw word ptr %0" , 0 } , 
  622.  
  623.     { "11011 000 : mod 100 rm"                , "fsub dword ptr %0" , 0 } , 
  624.     { "11011 100 : mod 100 rm"                , "fsub qword ptr %0" , 0 } ,     
  625.     { "11011 000 : 11100 fpu:"                , "fsub st(0) , %0" , 0 } , 
  626.     { "11011 100 : 11101 fpu:"                , "fsub %0 , st(0)" , 0 } , 
  627.     { "11011 110 : 11101 fpu:"                , "fsubp %0 , st(0)" , 0 } , 
  628.  
  629.     { "11011 000 : mod 101 rm"                , "fsubr dword ptr %0" , 0 } , 
  630.     { "11011 100 : mod 101 rm"                , "fsubr qword ptr %0" , 0 } , 
  631.     { "11011 000 : 11101 fpu:"                , "fsubr st(0) , %0" , 0 } , 
  632.     { "11011 100 : 11100 fpu:"                , "fsubr %0 , st(0)" , 0 } , 
  633.     { "11011 110 : 11100 fpu:"                , "fsubrp %0  , st(0)" , 0 } ,     
  634.         
  635.     { "11011 001 : 1110 0100:"                , "ftst" , 0 } , 
  636.     { "11011 101 : 1110 0 fpu:"                , "fucom %0" , 0 } , 
  637.     { "11011 101 : 1110 1 fpu:"                , "fucomp %0" , 0 } , 
  638.     { "11011 010 : 1110 1001:"                , "fucompp" , 0 } , 
  639.     { "11011 011 : 11 101 fpu:"                , "fucomi" , 0 } , 
  640.     { "11011 111 : 11 101 fpu:"                , "fucomip" , 0 } , 
  641.     { "11011 001 : 1110 0101:"                , "fxam" , 0 } , 
  642.     { "11011 001 : 1100 1fpu:"                , "fxch %0" , 0 } , 
  643.     { "11011 001 : 1111 0100:"                , "fxtract" , 0 } , 
  644.     { "11011 001 : 1111 0001:"                , "fyl2x" , 0 } , 
  645.     { "11011 001 : 1111 1001:"                , "fyl2xp1" , 0 } , 
  646.     { "1001 1011:"                            , "fwait" , 0 } , 
  647.     { 0 , 0 , 0 } 
  648. };
  649.  
  650.     ////////////////////////////////////////////////////////////////////
  651.     // instructions privilegiees 
  652. static SOPContext    pfnOPCPrivileged[] = 
  653. {
  654.     { "0110 0011 : 11 g16 g16:"            , "arpl %1 , %0" , 0 } , 
  655.     { "0110 0011 : mod g16 rm"            , "arpl %1 , %0" , 0 } , 
  656.  
  657.     { "0000 1111 : 0000 0110 :" , "clts" , 0 } , 
  658.  
  659.     { "1111 0100:"                                , "hlt" , 0 } , 
  660.  
  661.     { "1110 010w eax : i08" , "in %0 , %1" , 0 } , 
  662.     { "1110 110w eax : "    , "in %0 , dx" , 0 } , 
  663.  
  664.     { "0110 1100:"            , "%r_insb" , 0 } , 
  665.     { "oas 0110 1101:"        , "%r_insw" , 0 } , 
  666.     { "nas 0110 1101:"        , "%r_insd" , 0 } , 
  667.  
  668.     { "0000 1111 : 0000 1000:"                , "invd" , 0 } , 
  669.     { "0000 1111 : 0000 0001 : mod 111 rm"    , "invlpg %p %0" , 0 } , 
  670.  
  671.     { "0000 1111 : 0000 0010 : 11 grg grg:" , "lar %0 , %1" , 0 } , 
  672.     { "0000 1111 : 0000 0010 : mod grg rm" , "lar %0 ,%p  %1 " , 0 } , 
  673.  
  674.     { "0000 1111 : 0000 0001 : mod 010 rm"    , "lgdt %0" , 0 } ,
  675.     { "0000 1111 : 0000 0001 : mod 011 rm"    , "lidt %0" , 0 } ,
  676.  
  677.     { "0000 1111 : 0000 0000 : 11 010 grg:"    , "lldt %0" , 0 } , 
  678.     { "0000 1111 : 0000 0000 : mod 010 rm"  , "lldt %p %0" , 0 } , 
  679.  
  680.     { "0000 1111 : 0000 0001 : 11 110 grg:"    , "lmsw %0" , 0 } , 
  681.     { "0000 1111 : 0000 0001 : mod 110 rm"    , "lmsw %p %0" , 0 } , 
  682.     
  683.     { "1111 0000:"                            , "lock" , 0 } , 
  684.  
  685.     { "0000 1111 : 0000 0011 : 11 grg grg:" , "lsl %0 , %1" , 0 } , 
  686.     { "0000 1111 : 0000 0011 : mod grg rm" , "lsl %0 , %p %1" , 0 } , 
  687.  
  688.     { "0000 1111 : 0000 0000 : 11 011 grg:" , "ltr %0" , 0 } , 
  689.     { "0000 1111 : 0000 0000 : mod 011 rm" , "ltr %p %0" , 0 } , 
  690.  
  691.     { "0000 1111 : 0010 00d0 : 11 _cr grg:" , "mov %1 , %0" , 0 } ,  
  692.     { "0000 1111 : 0010 00d1 : 11 _dr grg:"    , "mov %1 , %0" , 0 } , 
  693.  
  694.     { "1110 011w eax : i08" , "out %1 , %0" , 0 } , 
  695.     { "1110 111w eax : "    , "out dx , %0" , 0 } , 
  696.     
  697.     { "0110 1110:"        , "%r_outsb" , 0 } , 
  698.     { "oas 0110 1111:"    , "%r_outsw" , 0 } , 
  699.     { "nas 0110 1111:"    , "%r_outsd" , 0 } , 
  700.  
  701.     { "0000 1111 : 0011 0010 :"        , "rdmsr" , 0 } , 
  702.     { "0000 1111 : 0011 0011 :"        , "rdpmc" , 0 } , 
  703.     { "0000 1111 : 0011 0001 :"        , "rdtsc" , 0 } , 
  704.  
  705.     { "0000 1111 : 0000 0001 : mod 000 rm"    , "sgdt %p %0" , 0 } ,
  706.  
  707.     { "0000 1111 : 0000 0000 : 11 000 grg:" , "sldt %0" , 0 } , 
  708.     { "0000 1111 : 0000 0000 : mod 000 rm" , "sldt %0" , 0 } , 
  709.  
  710.     { "0000 1111 : 1010 1010: "        , "rsm" , 0 } , 
  711.  
  712.     { "0000 1111 : 0000 0000 : 11 001 grg:" , "str %0" , 0 } , 
  713.     { "0000 1111 : 0000 0000 : mod 001 rm" , "str %0" , 0 } , 
  714.  
  715.     { "0000 1111 : 0000 0001 : mod 001 rm" , "sidt %0" , 0 } , 
  716.  
  717.     { "0000 1111 : 0000 0001 : 11 100 grg:" , "smsw %0" , 0 } , 
  718.     { "0000 1111 : 0000 0001 : mod 100 rm" , "smsw %0" , 0 } , 
  719.     
  720.     { "0000 1111 : 0000 1001 :" , "wbinvd" , 0 } , 
  721.  
  722.     { "0000 1111 : 0000 0000 : 11 100 grg:"        , "verr %0" , 0 } , 
  723.     { "0000 1111 : 0000 0000 : mod 100 rm"        , "verr %p %0" , 0 } , 
  724.     { "0000 1111 : 0000 0000 : 11 101 grg:"        , "verw %0" , 0 } , 
  725.     { "0000 1111 : 0000 0000 : mod 101 rm"        , "verw %p %0" , 0 } , 
  726.  
  727.     { "0000 1111 : 0011 0000 :" , "wrmsr" , 0 } , 
  728.  
  729.     { 0 , 0 , 0 } 
  730. };
  731.  
  732.     ////////////////////////////////////////////////////////////////////
  733.     // instructions mmx
  734. static SOPContext    pfnOPCMmx[] = 
  735.     { "0000 1111 : 01110111: "                    , "emms" , 0  } ,
  736.  
  737.     { "0000 1111 : 011d1110: 11 xmm grg:"        , "movd %0 , %1" , 0 } , 
  738.     { "0000 1111 : 011d1110: mod xmm rm"        , "movd %0 , %1" , 0 } , 
  739.  
  740.     { "0000 1111 : 011d1111: 11 xmm grg:"        , "movq %0 , %1" , 0 } , 
  741.     { "0000 1111 : 011d1111: mod xmm rm"        , "movq %0 , %1" , 0 } , 
  742.     
  743.     { "0000 1111 : 01101011: 11 xmm xmm:"        , "packssdw %0 , %1" , 0 } , 
  744.     { "0000 1111 : 01101011: mod xmm rm"        , "packssdw %0 , %1" , 0 } ,
  745.  
  746.     { "0000 1111 : 01100011: 11 xmm xmm:"        , "packsswb %0 , %1" , 0 } , 
  747.     { "0000 1111 : 01100011: mod xmm rm"        , "packsswb %0 , %1" , 0 } ,
  748.  
  749.     { "0000 1111 : 01100111: 11 xmm xmm:"        , "packuswb %0 , %1" , 0 } , 
  750.     { "0000 1111 : 01100111: mod xmm rm"        , "packuswb %0 , %1" , 0 } ,
  751.     
  752.     { "0000 1111 : 111111pp: 11 xmm xmm:"        , "padd%g %0 , %1" , 0 } , 
  753.     { "0000 1111 : 111111pp: mod xmm rm"        , "padd%g %0 , %1" , 0 } ,
  754.  
  755.     { "0000 1111 : 111011pp: 11 xmm xmm:"        , "padds%g %0 , %1" , 0 } , 
  756.     { "0000 1111 : 111011pp: mod xmm rm"        , "padds%g %0 , %1" , 0 } ,
  757.  
  758.     { "0000 1111 : 110111pp: 11 xmm xmm:"        , "paddus%g %0 , %1" , 0 } , 
  759.     { "0000 1111 : 110111pp: mod xmm rm"        , "paddus%g %0 , %1" , 0 } ,
  760.  
  761.     { "0000 1111 : 11011011: 11 xmm xmm:"        , "pand %0 , %1" , 0 } , 
  762.     { "0000 1111 : 11011011: mod xmm rm"        , "pand %0 , %1" , 0 } ,
  763.  
  764.     { "0000 1111 : 11011111: 11 xmm xmm:"        , "pandn %0 , %1" , 0 } , 
  765.     { "0000 1111 : 11011111: mod xmm rm"        , "pandn %0 , %1" , 0 } ,
  766.  
  767.     { "0000 1111 : 011101pp: 11 xmm xmm:"        , "pcmpeq%g %0 , %1" , 0 } , 
  768.     { "0000 1111 : 011101pp: mod xmm rm"        , "pcmpeq%g %0 , %1" , 0 } ,
  769.  
  770.     { "0000 1111 : 011001pp: 11 xmm xmm:"        , "pcmpgt%g %0 , %1" , 0 } , 
  771.     { "0000 1111 : 011001pp: mod xmm rm"        , "pcmpgt%g %0 , %1" , 0 } ,
  772.  
  773.     { "0000 1111 : 11110101: 11 xmm xmm:"        , "pmadd %0 , %1" , 0 } , 
  774.     { "0000 1111 : 11011111: mod xmm rm"        , "pmadd, %1" , 0 } ,
  775.  
  776.     { "0000 1111 : 11100101: 11 xmm xmm:"        , "pmulh %0 , %1" , 0 } , 
  777.     { "0000 1111 : 11100101: mod xmm rm"        , "pmulh %0 , %1" , 0 } ,
  778.  
  779.     { "0000 1111 : 11010101: 11 xmm xmm:"        , "pmull %0 , %1" , 0 } , 
  780.     { "0000 1111 : 11010101: mod xmm rm"        , "pmull %0 , %1" , 0 } ,
  781.  
  782.     { "0000 1111 : 11101011: 11 xmm xmm:"        , "por %0 , %1" , 0 } , 
  783.     { "0000 1111 : 11101011: mod xmm rm"        , "por %0 , %1" , 0 } ,
  784.  
  785.     { "0000 1111 : 111100pp: 11 xmm xmm:"        , "psll%g %0 , %1" , 0 } , 
  786.     { "0000 1111 : 111100pp: mod xmm rm"        , "psll%g %0 , %1" , 0 } ,
  787.     { "0000 1111 : 011100pp: 11 100 xmm : i08"    , "psll%g %0 , %1" , 0 } ,
  788.  
  789.     { "0000 1111 : 111100pp: 11 xmm xmm:"        , "psra%g %0 , %1" , 0 } , 
  790.     { "0000 1111 : 111100pp: mod xmm rm"        , "psra%g %0 , %1" , 0 } ,
  791.     { "0000 1111 : 011100pp: 11 100 xmm : i08"    , "psra%g %0 , %1" , 0 } ,
  792.  
  793.     { "0000 1111 : 111100pp: 11 xmm xmm:"        , "psrl%g %0 , %1" , 0 } , 
  794.     { "0000 1111 : 111100pp: mod xmm rm"        , "psrl%g %0 , %1" , 0 } ,
  795.     { "0000 1111 : 011100pp: 11 100 xmm : i08"    , "psrl%g %0 , %1" , 0 } ,
  796.  
  797.     { "0000 1111 : 111110pp: 11 xmm xmm:"        , "psub%g %0 , %1" , 0 } , 
  798.     { "0000 1111 : 111110pp: mod xmm rm"        , "psub%g %0 , %1" , 0 } ,
  799.  
  800.     { "0000 1111 : 111010pp: 11 xmm xmm:"        , "psubs%g %0 , %1" , 0 } , 
  801.     { "0000 1111 : 111010pp: mod xmm rm"        , "psubs%g %0 , %1" , 0 } ,
  802.  
  803.     { "0000 1111 : 110110pp: 11 xmm xmm:"        , "psubus%g %0 , %1" , 0 } , 
  804.     { "0000 1111 : 110110pp: mod xmm rm"        , "psubus%g %0 , %1" , 0 } ,
  805.  
  806.     { "0000 1111 : 011010pp: 11 xmm xmm:"        , "punpckh%g %0 , %1" , 0 } , 
  807.     { "0000 1111 : 011010pp: mod xmm rm"        , "punpckh%g %0 , %1" , 0 } ,
  808.  
  809.     { "0000 1111 : 011000pp: 11 xmm xmm:"        , "punpckl%g %0 , %1" , 0 } , 
  810.     { "0000 1111 : 011000pp: mod xmm rm"        , "punpckl%g %0 , %1" , 0 } ,
  811.  
  812.     { "0000 1111 : 11101111: 11 xmm xmm:"        , "pxor %0 , %1" , 0 } , 
  813.     { "0000 1111 : 11101111: mod xmm rm"        , "pxor %0 , %1" , 0 } ,
  814.  
  815.     { 0 , 0 , 0 } 
  816. };
  817.  
  818. ////////////////////////////////////////////////////////////////////
  819. // definition de tout les banks
  820. struct SBank 
  821. {
  822.     /** { 0 , 0 , 0 } tab de motif d'instructions */
  823.     SOPContext*        m_pData ;
  824.     
  825.     /** nom du bank tq ds la ligne de command */
  826.     const char* m_pszName ; 
  827.  
  828.     /** == true si utilise */
  829.     bool m_bIsDefault ;
  830.  
  831.     /** op de comparaison */
  832.     bool operator==( const SBank& other )
  833.     {    return ( strcmp( m_pszName , other.m_pszName ) == 0 ); }
  834. };
  835.  
  836. /** bank list ( par ordre de proba d'utilisation decroissante !)*/
  837. static SBank  pAllBanks[] = 
  838.     { pfnOPCGeneral , "user" , true } , 
  839.     { pfnOPCFPU , "fpu" , true } ,
  840.     { pfnOPCMmx , "mmx" , false } ,
  841.     { pfnOPCPrivileged , "system" , false } 
  842. };
  843.  
  844.  
  845. ////////////////////////////////////////////////////////////////////
  846. // divers flags
  847.  
  848. ////////////////////////////////////////////////////////////////////
  849. // decoupage typique d'un octet en 3 parties (2,3,3)
  850. inline void ByteSplit3( BYTE in , BYTE& outHigh , BYTE& outMed , BYTE& outLow )
  851. {
  852.     outLow = in & BIN_CTE(0,0,0,0,0,1,1,1) ;
  853.     outMed = ( in & BIN_CTE(0,0,1,1,1,0,0,0) ) >> 3 ;
  854.     outHigh = ( in & BIN_CTE(1,1,0,0,0,0,0,0) ) >> 6 ;
  855. }
  856.