专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 汇编语言

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

发布时间:2010-06-14 15:30:33 文章来源:www.iduyao.cn 采编人员:星星草
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.html
------解决方案--------------------
如上,有开源的dasm,而且附带example。
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: