VirtualBox

Changeset 8336 in vbox for trunk/src/VBox/Disassembler


Ignore:
Timestamp:
Apr 23, 2008 4:03:03 PM (17 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
30104
Message:

More disassembler updates

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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"};
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette