- 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。