📄 dasmcte.h
字号:
/*
* fichier DasmCte.h : fichier header
*
* descr : classe automate desassembleur
* fichier regroupant les constantes lie au language machine du x86
*
* projet : PEDasm
* rq : inclus dans dasmCode.cpp uniquement
*
* rq2:
*
* Ce programme est libre de droits. Il peut etre distribue et/ou modifie
* selon les termes de la licence 'GNU General Public License version 2'.
*
* Ce programme est distribue sans aucunes garanties, y compris d'utilite
* ni de risques encouru, quelle que soit son utilisation.
*
* lire le fichier licence.txt fourni ou bien ecrire a :
* the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* pour recevoir une copie de la licence.
*
* Copyright (C) 1997 - 1998 Nicolas Witczak <witczak@geocities.com>
*/
////////////////////////////////////////////////////////////////////
// prefixes
const unsigned int cteLockPrefix = 0xf0 ;
const unsigned int cteRepNENZPrefix = 0xf2 ;
const unsigned int cteRepPrefix = 0xf3 ;
const unsigned int cteCSSRegPrefix = 0x2e ;
const unsigned int cteSSSRegPrefix = 0x36 ;
const unsigned int cteDSSRegPrefix = 0x3e ;
const unsigned int cteESSRegPrefix = 0x26 ;
const unsigned int cteFSSRegPrefix = 0x64 ;
const unsigned int cteGSSRegPrefix = 0x65 ;
const unsigned int cteOpSzOvrPrefix = 0x66 ;
const unsigned int cteAdrSZOvrPrefix = 0x67 ;
////////////////////////////////////////////////////////////////////
// taille d'operande
const char* cteOperandQualif[5] =
{ "" , "byte ptr" , "word ptr" , "dword ptr" ,"qword ptr" } ;
////////////////////////////////////////////////////////////////////
// conditions
const char* cteConditions[16] =
{ "o" , "no" , "b" , "nb" , "e" , "ne" , "be" , "a" ,
"s" , "ns" , "p" , "np" , "l" , "nl" , "le" , "g" } ;
////////////////////////////////////////////////////////////////////
// prefix de repetition
const char* cteRep[4] =
{ "lock " , "" , "repnz ", "rep " } ;
const char* cteRepZ[4] =
{ "lock " , "" , "repnz ", "repz " } ;
////////////////////////////////////////////////////////////////////
// empacketage mmx
const char* cteMmxPack[4] =
{ "b" , "w" , "d" , "q" } ;
////////////////////////////////////////////////////////////////////
// registres
// 0 -> instruction non reconnu
/** registres d'usage generaux reg = [ taille ][code reg] */
const char* cteGenReg[4][8] =
{
{ 0, 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{ "al" , "cl" , "dl" , "bl" , "ah" , "ch" , "dh" , "bh" },
{ "ax" , "cx" , "dx" , "bx" , "sp" , "bp" , "si" , "di" },
{ "eax" , "ecx" , "edx" , "ebx" , "esp" , "ebp" , "esi" , "edi" }
};
/** registres de segment sreg2 et sreg3 */
const char* cteSegReg[8] =
{ "es" , "cs" , "ss" , "ds" , "fs" , "gs" , 0 , 0 } ;
/** registres de controle */
const char* cteCtrlReg[8] =
{ "cr0" , 0 , "cr2" , "cr3" , "cr4" , 0 , 0 , 0 } ;
/** registres de debug */
const char* cteDebReg[8] =
{ "dr0" , "dr1" , "dr2" , "dr3" , 0 , 0 , "dr6" , "dr7" } ;
/** registres de mmx */
const char* cteMmxReg[8] =
{ "mm0" , "mm1" , "mm2" , "mm3" , "mm4" , "mm5" , "mm6" , "mm7" } ;
/** registres fpu */
const char* cteFpuReg[8] =
{ "st(0)" , "st(1)" , "st(2)" , "st(3)" , "st(4)" , "st(5)" , "st(6)" , "st(7)" } ;
////////////////////////////////////////////////////////////////////
// definition des actions ss forme de masque
//
// format du mask :
// modxxxrm -> mod rm
// registre gen -> grg , g08 , g16 , g32
// empacketage mmx -> pp
// registre mmx -> xmm
// registre seg -> 2sg 3sg
// registre control / debug -> _cr / _dr
// registre fpu -> fpu
// registre eax,ax,al -> eax
// flags : s , w, d
// conditions tttn
// valeurs : immediat -> i08 , is8 , i16 , i32 , i00(taille par defaut)
// call c00 (tjs 32b)
// jump j08 , j16(inutilise) , j32
// adressage direct mem a32
// sep octet -> : absent apres rm ou donees
// oos / oas -> : override operand size ,override adresse size doit etre present
// nos / nas -> : override operand size ,override adresse size ne doit pas etre present
// fin reconnaissance -> \0
////////////////////////////////////////////////////////////////////
// instructions effectivement utilise
// initialise ds InitBanks() , jamais detruit
static SOPContext* pfnOPCodeMask ;
////////////////////////////////////////////////////////////////////
// instructions d'usage general
static SOPContext pfnOPCGeneral[] =
{
{ "0011 0111:" , "aaa" , 0 } ,
{ "1101 0101 : 0000 1010:" , "aad" , 0 } ,
{ "1101 0100 : 0000 1010:" , "aam" , 0 } ,
{ "0011 1111:" , "aas" , 0 } ,
{ "0001 00dw : 11 grg grg:" , "adc %1 , %0" , 0 } ,
{ "0001 00dw : mod grg rm" , "adc %p %1 , %0" , 0 } ,
{ "1000 00sw : 11 010 grg : i00" , "adc %0 , %1" , 0 } ,
{ "0001 010w eax : i00" , "adc %0 , %1" , 0 } ,
{ "1000 00sw : mod 010 rm i00" , "adc %p %0 , %1" , 0 } ,
{ "0000 00dw : 11 grg grg:" , "add %1 , %0" , 0 } ,
{ "0000 00dw : mod grg rm" , "add %p %1 , %0" , 0 } ,
{ "1000 00sw : 11 000 grg : i00" , "add %0 , %1" , 0 } ,
{ "0000 010w eax: i00" , "add %0 , %1" , 0 } ,
{ "1000 00sw : mod 000 rm i00" , "add %p %0 , %1" , 0 } ,
{ "0010 00dw : 11 grg grg:" , "and %1 , %0" , 0 } ,
{ "0010 00dw : mod grg rm" , "and %p %1 , %0" , 0 } ,
{ "1000 00sw : 11 100 grg: i00" , "and %0 , %1" , 0 } ,
{ "0010 010w eax: i00" , "and %0 , %1" , 0 } ,
{ "1000 00sw : mod 100 rm i00" , "and %p %0 , %1" , 0 } ,
{ "0110 0010 : mod grg rm" , "bound %0 , %1" , 0 } ,
{ "0000 1111 : 1011 1100 : 11 grg grg:" , "bsf %1 , %0" , 0 } ,
{ "0000 1111 : 1011 1100 : mod grg rm" , "bsf %p %1 , %0" , 0 } ,
{ "0000 1111 : 1011 1101 : 11 grg grg:" , "bsr %1 , %0" , 0 } ,
{ "0000 1111 : 1011 1101 : mod grg rm" , "bsr %p %1 , %0" , 0 } ,
{ "0000 1111 : 1100 1 grg:" , "bswap %0" , 0 } ,
{ "0000 1111 : 1011 1010 : 11 100 grg : i08" , "bt %0 , %1" , 0 } ,
{ "0000 1111 : 1011 1010 : mod 100 rm i08" , "bt %p %0 , %1" , 0 } ,
{ "0000 1111 : 1010 0011 : 11 grg grg:" , "bt %1 , %0" , 0 } ,
{ "0000 1111 : 1010 0011 : mod grg rm" , "bt %p %1 , %0" , 0 } ,
{ "0000 1111 : 1011 1010 : 11 111 grg : i08" , "btc %0 , %1" , 0 } ,
{ "0000 1111 : 1011 1010 : mod 111 rm i08" , "btc %p %0 , %1" , 0 } ,
{ "0000 1111 : 1011 1011 : 11 grg grg:" , "btc %1 , %0" , 0 } ,
{ "0000 1111 : 1011 1011 : mod grg rm" , "btc %p %1 , %0" , 0 } ,
{ "0000 1111 : 1011 1010 : 11 110 grg : i08" , "btr %0 , %1" , 0 } ,
{ "0000 1111 : 1011 1010 : mod 110 rm i08" , "btr %p %0 , %1" , 0 } ,
{ "0000 1111 : 1011 0011 : 11 grg grg:" , "btr %1 , %0" , 0 } ,
{ "0000 1111 : 1011 0011 : mod grg rm" , "btr %p %1 , %0" , 0 } ,
{ "0000 1111 : 1011 1010 : 11 101 grg : i08" , "bts %0 , %1" , 0 } ,
{ "0000 1111 : 1011 1010 : mod 101 rm i08" , "bts %p %0 , %1" , 0 } ,
{ "0000 1111 : 1010 1011 : 11 grg grg:" , "bts %1 , %0" , 0 } ,
{ "0000 1111 : 1010 1011 : mod grg rm" , "bts %p %1 , %0" , 0 } ,
{ "1110 1000:c32" , "call %0", 0 } , // call direct
{ "1111 1111:11 010 grg:" , "call %0", 0 } , // call indirect
{ "1111 1111:mod 010 rm" , "call %p %0", 0 } ,
{ "1001 1000:" , "cbw" , 0 } ,
{ "1001 1001:" , "cdq" , 0 } ,
{ "1111 1000:" , "clc" , 0 } ,
{ "1111 1100:" , "cld" , 0 } ,
{ "1111 1010:" , "cli" , 0 } ,
{ "1111 0101:" , "cmc" , 0 } ,
{ "0000 1111: 0100 tttn : 11 grg grg:" , "cmov%c %0 , %1" , 0 } ,
{ "0000 1111: 0100 tttn : mod grg rm" , "cmov%c %0 , %p %1" , 0 } ,
{ "0011 10dw : 11 grg grg:" , "cmp %1 , %0" , 0 } ,
{ "0011 10dw : mod grg rm" , "cmp %p %1 , %0" , 0 } ,
{ "1000 00sw : 11 111 grg : i00 " , "cmp %0 , %1" , 0 } ,
{ "0011 110w eax : i00" , "cmp %0 , %1" , 0 } ,
{ "1000 00sw : mod 111 rm i00" , "cmp %p %0 , %1" , 0 } ,
{ "1010 0110:" , "%rzcmpsb" , 0 } ,
{ "oas 1010 0111:" , "%rzcmpsw" , 0 } ,
{ "nas 1010 0111:" , "%rzcmpsd" , 0 } ,
{ "0000 1111 : 1011 000w : 11 grg grg:" , "cmpxchg %1 , %0" , 0 } ,
{ "0000 1111 : 1011 000w : mod grg rm" , "cmpxchg %p %1 , %0" , 0 } ,
{ "0000 1111 : 1100 0111 : a32" , "cmpxchg8b qword ptr %0" , 0 } ,
{ "0000 1111 : 1010 0010:" , "cpuid" , 0 } ,
{ "1001 1001:" , "cwd" , 0 } ,
{ "1001 1000:" , "cwde" , 0 } ,
{ "0010 0111:" , "daa" , 0 } ,
{ "0010 1111:" , "das" , 0 } ,
{ "1111 111w : 11 001 grg:" , "dec %0" , 0 } ,
{ "0100 1 grg:" , "dec %0" , 0 } ,
{ "1111 111w : mod 001 rm" , "dec %p %0" , 0 } ,
{ "1111 011w : 11 110 grg:" , "div %0" , 0 } ,
{ "1111 011w : mod 110 rm" , "div %p %0" , 0 } ,
{ "1100 1000 : i16 i08" , "enter %0 , %1" , 0 } ,
{ "1111 011w : 11 111 grg:" , "idiv %0" , 0 } ,
{ "1111 011w : mod 111 rm" , "idiv %p %0" , 0 } ,
{ "1111 011w : 11 101 grg:" , "imul %0" , 0 } ,
{ "1111 011w : mod 101 grg:" , "imul %p %0" , 0 } ,
{ "0000 1111 : 1010 1111 : 11 grg grg:" , "imul %0 , %1" , 0 } ,
{ "0000 1111 : 1010 1111 : mod grg rm" , "imul %0 , %p %1" , 0 } ,
{ "0110 10s1 : 11 grg grg: i00 " , "imul %0 , %1 , %2" , 0 } ,
{ "0110 10s1 : mod grg rm i00 " , "imul %0 , %p %1 , %2" , 0 } ,
{ "1111 111w : 11 000 grg:" , "inc %0" , 0 } ,
{ "0100 0 grg:" , "inc %0" , 0 } ,
{ "1111 111w : mod 000 rm" , "inc %p %0" , 0 } ,
{ "1100 1101 : i08" , "int %0" , 0 } ,
{ "1100 1100:" , "int 3" , 0 } ,
{ "1100 1110:" , "into" , 0 } ,
{ "1100 1111:" , "iret" , 0 } ,
{ "0111 tttn : j08" , "j%c %0" , 0 } ,
{ "0000 1111 : 1000 tttn : j32 " , "j%c %0" , 0 } ,
{ "oas 1110 0011 : j08" , "jcxz %0" , 0 } ,
{ "nas1110 0011 : j08" , "jecxz %0" , 0 } ,
{ "1110 1011 : j08" , "jmp %0" , 0 } ,
{ "1110 1001 : j32" , "jmp %0" , 0 } ,
{ "1111 1111 : 11 100 grg:" , "jmp %0" , 0 } ,
{ "1111 1111 : mod 100 rm" , "jmp %p %0" , 0 } ,
{ "1110 1010 : i32 i16 " , "jmp far %1 : %0" , 0 } ,
{ "1111 1111 : mod 101 rm" , "jmp far %p %0 " , 0 } ,
{ "1001 1111:" , "lahf" , 0 } ,
{ "1100 0101 : mod grg rm" , "lds %0" , 0 } ,
{ "1000 1101 : mod grg rm" , "lea %0 , %p %1" , 0 } ,
{ "1100 1001:" , "leave" , 0 } ,
{ "1100 0100 : mod grg rm" , "les %0 , %1" , 0 } ,
{ "0000 1111 : 1011 0100 : mod grg rm" , "lfs %0 , %1" , 0 } ,
{ "0000 1111 : 1011 0101 : mod grg rm" , "lgs %0 , %p %1" , 0 } ,
{ "1010 1100:" , "%r_lodsb" , 0 } ,
{ "oas1010 1101:" , "%r_lodsw" , 0 } ,
{ "nas1010 1101:" , "%r_lodsd" , 0 } ,
{ "1110 0010 : j08" , "loop %0" , 0 } ,
{ "1110 0001 : j08" , "loope %0" , 0 } ,
{ "0000 1111 : 1011 0010 : mod grg rm" , "lss %0 , %p %1" , 0 } ,
{ "1000 10dw:11 grg grg: " , "mov %1 , %0" , 0 } , // mov reg reg
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -