当前位置: 代码迷 >> 汇编语言 >> disasm操作数结构。来点建议意见解决思路
  详细解决方案

disasm操作数结构。来点建议意见解决思路

热度:3821   发布时间:2013-02-26 00:00:00.0
disasm操作数结构。来点建议意见
C/C++ code
    enum RegType    //    register type    {        regtNONE = 0,        regtGR8,            //    8 bit gerneral Register: AL, CL, ..DH, BH        regtGR16,            //    16 bit gerneral Register: AX, CX, ...SI, DI         regtGR32,            //    32 bit gerneral Register: EAX, ECX, ...ESI, EDI         regtSR,                //    segment register: ES, CS...        regtCR,                //    control register: CR0, CR1...        regtDR,                //    debug register: DR0, DR1        regtMM,                //    MM: MM0, MM1...        regtXMM,            //    XMM: XMM0, XMM1        regtGR,                //    gerneral register, not ensure size    };    struct RegGetting        {        byte regType:5;        byte regNum:3;    };    enum OprandType     {            oprtNONE = 0,                //    none oprand        oprtREGISTER,                //    as: eax        oprtDATA,                    //    as: ffffffff        oprtREGSSCALEDISP_MEM,        //    as: [eax], [fffff], [eax+fffff],[eax+ebx*4+ffff]        oprtDIRADDR,                //    as: 9090:90909090        oprtREGSPAIR_MEM,            //    as: es:[edi], prefixes segment will not be used    };    static const int MaxOprandsCount = 3;        //    each instruction's Max Oprands Count    union    OprandValue    {        RegGetting reg;        struct Data        {            byte dataBSize;            union            {                char dataB;                WORD dataW;                DWORD dataDW;            };        }data;        struct RegsScaleDisp_Mem        {            byte memBSize;            RegGetting baseReg;            RegGetting scaledReg;            byte scale;                    //    reg*(1<<scale)            Data disp;        }regsScaleDisp_Mem;        struct DirAddr        {            WORD ptr;            byte offsetBSize;            union            {                WORD offset16;                DWORD offset32;            };        }dirAddr;        struct RegsPair_Mem        {            byte memBSize;            byte srNum;                        //    segment register num            RegGetting offsetReg_Mem;        }regsPair;    };    struct Oprand    {        OprandType oprType;                        OprandValue oprValue;    };


------解决方案--------------------------------------------------------
there is a library call libdisasm http://bastard.sourceforge.net/libdisasm
------解决方案--------------------------------------------------------
如上,有开源的dasm,而且附带example。
  相关解决方案