VirtualBox

Changeset 8336

Show
Ignore:
Timestamp:
04/23/08 18:03:03 (9 months ago)
Author:
vboxsync
Message:

More disassembler updates

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/include/VBox/dis.h

    r8333 r8336  
    145145#define USE_DISPLACEMENT16              RT_BIT_64(15) 
    146146#define USE_DISPLACEMENT32              RT_BIT_64(16) 
    147 #define USE_IMMEDIATE8                  RT_BIT_64(17) 
    148 #define USE_IMMEDIATE8_REL              RT_BIT_64(18) 
    149 #define USE_IMMEDIATE16                 RT_BIT_64(19) 
    150 #define USE_IMMEDIATE16_REL             RT_BIT_64(20) 
    151 #define USE_IMMEDIATE32                 RT_BIT_64(21) 
    152 #define USE_IMMEDIATE32_REL             RT_BIT_64(22) 
    153 #define USE_IMMEDIATE64                 RT_BIT_64(23) 
    154 #define USE_IMMEDIATE_ADDR_0_32         RT_BIT_64(24) 
    155 #define USE_IMMEDIATE_ADDR_16_32        RT_BIT_64(25) 
    156 #define USE_IMMEDIATE_ADDR_0_16         RT_BIT_64(26) 
    157 #define USE_IMMEDIATE_ADDR_16_16        RT_BIT_64(27) 
     147#define USE_DISPLACEMENT64              RT_BIT_64(17) 
     148#define USE_IMMEDIATE8                  RT_BIT_64(18) 
     149#define USE_IMMEDIATE8_REL              RT_BIT_64(19) 
     150#define USE_IMMEDIATE16                 RT_BIT_64(20) 
     151#define USE_IMMEDIATE16_REL             RT_BIT_64(21) 
     152#define USE_IMMEDIATE32                 RT_BIT_64(22) 
     153#define USE_IMMEDIATE32_REL             RT_BIT_64(23) 
     154#define USE_IMMEDIATE64                 RT_BIT_64(24) 
     155#define USE_IMMEDIATE_ADDR_0_32         RT_BIT_64(25) 
     156#define USE_IMMEDIATE_ADDR_16_32        RT_BIT_64(26) 
     157#define USE_IMMEDIATE_ADDR_0_16         RT_BIT_64(27) 
     158#define USE_IMMEDIATE_ADDR_16_16        RT_BIT_64(28) 
    158159/** DS:ESI */ 
    159 #define USE_POINTER_DS_BASED            RT_BIT_64(28
     160#define USE_POINTER_DS_BASED            RT_BIT_64(29
    160161/** ES:EDI */ 
    161 #define USE_POINTER_ES_BASED            RT_BIT_64(29
    162 #define USE_IMMEDIATE16_SX8             RT_BIT_64(30
    163 #define USE_IMMEDIATE32_SX8             RT_BIT_64(31
     162#define USE_POINTER_ES_BASED            RT_BIT_64(30
     163#define USE_IMMEDIATE16_SX8             RT_BIT_64(31
     164#define USE_IMMEDIATE32_SX8             RT_BIT_64(32
    164165 
    165166#define USE_IMMEDIATE                   (USE_IMMEDIATE8|USE_IMMEDIATE16|USE_IMMEDIATE32|USE_IMMEDIATE64|USE_IMMEDIATE8_REL|USE_IMMEDIATE16_REL|USE_IMMEDIATE32_REL|USE_IMMEDIATE_ADDR_0_32|USE_IMMEDIATE_ADDR_16_32|USE_IMMEDIATE_ADDR_0_16|USE_IMMEDIATE_ADDR_16_16|USE_IMMEDIATE16_SX8|USE_IMMEDIATE32_SX8) 
     
    335336 
    336337    int32_t         disp8, disp16, disp32; 
    337  
    338338    uint32_t        size; 
    339339 
     340    int64_t         disp64; 
    340341    uint64_t        flags; 
    341342 
  • trunk/include/VBox/disopcode.h

    r8299 r8336  
    616616#define OP_PARM_REG_ESI         7 
    617617#define OP_PARM_REG_EDI         8 
     618#define OP_PARM_REG_GEN32_END   OP_PARM_REG_EDI 
    618619 
    619620#define OP_PARM_REG_ES          9 
     
    624625#define OP_PARM_REG_FS          13 
    625626#define OP_PARM_REG_GS          14 
     627#define OP_PARM_REG_SEG_END     OP_PARM_REG_GS 
    626628 
    627629#define OP_PARM_REG_AX          15 
     
    634636#define OP_PARM_REG_SI          21 
    635637#define OP_PARM_REG_DI          22 
     638#define OP_PARM_REG_GEN16_END   OP_PARM_REG_DI 
    636639 
    637640#define OP_PARM_REG_AL          23 
     
    644647#define OP_PARM_REG_DH          29 
    645648#define OP_PARM_REG_BH          30 
     649#define OP_PARM_REG_GEN8_END    OP_PARM_REG_BH 
    646650 
    647651#define OP_PARM_REGFP_0         31 
     
    654658#define OP_PARM_REGFP_6         37 
    655659#define OP_PARM_REGFP_7         38 
     660#define OP_PARM_REG_FP_END      OP_PARM_REGFP_7 
    656661 
    657662#define OP_PARM_NTA             39 
     
    697702#define OP_PARM_REG_R14         114 
    698703#define OP_PARM_REG_R15         115 
     704#define OP_PARM_REG_GEN64_END   OP_PARM_REG_R15 
    699705 
    700706 
  • trunk/src/VBox/Disassembler/DisasmCore.cpp

    r8333 r8336  
    12221222    } 
    12231223    else 
     1224    if (pCpu->addrmode == CPUMODE_64BIT) 
     1225    { 
     1226        Assert(OP_PARM_VSUBTYPE(pParam->param) != OP_PARM_p); 
     1227        /* near 64 bits pointer */ 
     1228        /* 
     1229         * Note: used only in "mov al|ax|eax, [Addr]" and "mov [Addr], al|ax|eax" 
     1230         * so we treat it like displacement. 
     1231         */ 
     1232        pParam->disp64 = DISReadQWord(pCpu, lpszCodeBlock); 
     1233        pParam->flags |= USE_DISPLACEMENT64; 
     1234 
     1235        disasmAddStringF(pParam->szParam, sizeof(pParam->szParam), "[0%08X%08Xh]", (uint32_t)(pParam->disp64 >> 32), (uint32_t)pParam->disp64); 
     1236        return sizeof(uint32_t); 
     1237    } 
     1238    else 
    12241239    { 
    12251240        if (OP_PARM_VSUBTYPE(pParam->param) == OP_PARM_p) 
     
    12601275        } 
    12611276    } 
     1277    if (pCpu->addrmode == CPUMODE_64BIT) 
     1278    { 
     1279        return sizeof(uint64_t); 
     1280    } 
    12621281    else 
    12631282    { 
     
    12861305    } 
    12871306 
    1288     if (pParam->param < OP_PARM_REG_SEG_START
     1307    if (pParam->param <= OP_PARM_REG_GEN32_END
    12891308    { 
    12901309        /* 32-bit EAX..EDI registers. */ 
     
    12961315            pParam->flags |= USE_REG_GEN32; 
    12971316            pParam->size   = 4; 
     1317        } 
     1318        else 
     1319        if (pCpu->opmode == CPUMODE_64BIT) 
     1320        { 
     1321            /* Use 64-bit registers. */ 
     1322            pParam->base.reg_gen = pParam->param - OP_PARM_REG_GEN32_START; 
     1323            if (    (pCpu->prefix & PREFIX_REX) 
     1324                &&  (pCpu->prefix_rex & PREFIX_REX_FLAGS)) 
     1325                pParam->base.reg_gen += 8; 
     1326 
     1327            pParam->flags |= USE_REG_GEN64; 
     1328            pParam->size   = 8; 
    12981329        } 
    12991330        else 
     
    13071338    } 
    13081339    else 
    1309     if (pParam->param < OP_PARM_REG_GEN16_START
     1340    if (pParam->param <= OP_PARM_REG_SEG_END
    13101341    { 
    13111342        /* Segment ES..GS registers. */ 
     
    13151346    } 
    13161347    else 
    1317     if (pParam->param < OP_PARM_REG_GEN8_START
     1348    if (pParam->param <= OP_PARM_REG_GEN16_END
    13181349    { 
    13191350        /* 16-bit AX..DI registers. */ 
     
    13231354    } 
    13241355    else 
    1325     if (pParam->param < OP_PARM_REG_FP_START
     1356    if (pParam->param <= OP_PARM_REG_GEN8_END
    13261357    { 
    13271358        /* 8-bit AL..DL, AH..DH registers. */ 
     
    13311362    } 
    13321363    else 
    1333     if (pParam->param <= OP_PARM_REGFP_7
     1364    if (pParam->param <= OP_PARM_REG_FP_END
    13341365    { 
    13351366        /* FPU registers. */ 
     
    13561387    } 
    13571388    else 
     1389    if (pCpu->addrmode == CPUMODE_64BIT) 
     1390    { 
     1391        pParam->base.reg_gen = USE_REG_RSI; 
     1392        pParam->flags |= USE_REG_GEN64; 
     1393    } 
     1394    else 
    13581395    { 
    13591396        pParam->base.reg_gen = USE_REG_SI; 
     
    13751412    } 
    13761413    else 
     1414    if (pCpu->addrmode == CPUMODE_64BIT) 
     1415    { 
     1416        pParam->base.reg_gen = USE_REG_RSI; 
     1417        pParam->flags |= USE_REG_GEN64; 
     1418    } 
     1419    else 
    13771420    { 
    13781421        pParam->base.reg_gen = USE_REG_SI; 
     
    13951438    } 
    13961439    else 
     1440    if (pCpu->addrmode == CPUMODE_64BIT) 
     1441    { 
     1442        pParam->base.reg_gen = USE_REG_RDI; 
     1443        pParam->flags |= USE_REG_GEN64; 
     1444    } 
     1445    else 
    13971446    { 
    13981447        pParam->base.reg_gen = USE_REG_DI; 
     
    14121461        pParam->base.reg_gen = USE_REG_EDI; 
    14131462        pParam->flags |= USE_REG_GEN32; 
     1463    } 
     1464    else 
     1465    if (pCpu->addrmode == CPUMODE_64BIT) 
     1466    { 
     1467        pParam->base.reg_gen = USE_REG_RDI; 
     1468        pParam->flags |= USE_REG_GEN64; 
    14141469    } 
    14151470    else 
     
    15061561    //little hack to make sure the ModRM byte is included in the returned size 
    15071562    if (pOp->idxParse1 != IDX_ParseModRM && pOp->idxParse2 != IDX_ParseModRM) 
    1508     { 
    15091563        size = sizeof(uint8_t); //ModRM byte 
    1510     } 
    15111564 
    15121565    size += ParseInstruction(lpszCodeBlock, pOp, pCpu); 
     
    18611914#if !defined(DIS_CORE_ONLY) && defined(LOG_ENABLED) 
    18621915const char *szModRMReg8[]      = {"AL", "CL", "DL", "BL", "AH", "CH", "DH", "BH"}; 
     1916const char *szModRMReg8_64[]   = {"AL", "CL", "DL", "BL", "AH", "CH", "DH", "BH", "R8L", "R9L", "R10L", "R11L", "R12L", "R13L", "R14L", "R15L"}; 
    18631917const char *szModRMReg16[]     = {"AX", "CX", "DX", "BX", "SP", "BP", "SI", "DI"}; 
    18641918const char *szModRMReg32[]     = {"EAX", "ECX", "EDX", "EBX", "ESP", "EBP", "ESI", "EDI"}; 

© 2008 Sun Microsystems, Inc.
ContactPrivacy policy