VirtualBox

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


Ignore:
Timestamp:
Jun 17, 2012 12:08:19 AM (12 years ago)
Author:
vboxsync
Message:

Encourage keeping things in the same registers across calls.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Disassembler/DisasmCore.cpp

    r41793 r41794  
    4747*   Internal Functions                                                         *
    4848*******************************************************************************/
    49 static void     disasmModRMReg(PDISSTATE pDis, PCDISOPCODE pOp, unsigned idx, PDISOPPARAM pParam, int fRegAddr);
    50 
    51 
    5249/** @name Parsers
    5350 * @{ */
     
    523520{
    524521    size_t size = 0;
    525     bool fFiltered = false;
    526522
    527523    Assert(pOp); Assert(pDis);
     
    534530     * Note! Multibyte opcodes are always marked harmless until the final byte.
    535531     */
     532    bool fFiltered;
    536533    if ((pOp->fOpType & pDis->fFilter) == 0)
    537534    {
     
    542539    {
    543540        /* Not filtered out -> full disassembly */
     541        fFiltered = false;
    544542        pDis->pfnDisasmFnTable = g_apfnFullDisasm;
    545543    }
     
    594592static size_t ParseEscFP(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
    595593{
    596     size_t      size = 0;
    597594    PCDISOPCODE fpop;
    598595    NOREF(pOp);
    599596
    600     unsigned    ModRM = disReadByte(pDis, offInstr);
    601     unsigned    index = pDis->bOpCode - 0xD8;
     597    uint8_t    ModRM = disReadByte(pDis, offInstr);
     598    uint8_t    index = pDis->bOpCode - 0xD8;
    602599    if (ModRM <= 0xBF)
    603600    {
     
    638635
    639636    // Little hack to make sure the ModRM byte is included in the returned size
     637    size_t      size = 0;
    640638    if (fpop->idxParse1 != IDX_ParseModRM && fpop->idxParse2 != IDX_ParseModRM)
    641639        size = sizeof(uint8_t); //ModRM byte
     
    660658 *
    661659 ********************************************************************************************************************************/
    662 static void UseSIB(size_t offInstr, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
    663 {
    664     NOREF(offInstr); NOREF(pOp);
    665 
     660static void UseSIB(PDISSTATE pDis, PDISOPPARAM pParam)
     661{
    666662    unsigned scale = pDis->SIB.Bits.Scale;
    667663    unsigned base  = pDis->SIB.Bits.Base;
     
    780776 *
    781777 ********************************************************************************************************************************/
    782 static void disasmModRMReg(PDISSTATE pDis, PCDISOPCODE pOp, unsigned idx, PDISOPPARAM pParam, int fRegAddr)
     778static void disasmModRMReg(unsigned idx, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam, int fRegAddr)
    783779{
    784780    NOREF(pOp); NOREF(pDis);
     
    854850}
    855851
    856 static void disasmModRMReg16(PDISSTATE pDis, PCDISOPCODE pOp, unsigned idx, PDISOPPARAM pParam)
     852
     853static void disasmModRMReg16(unsigned idx, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
    857854{
    858855    static const uint8_t s_auBaseModRMReg16[8]  =
     
    869866    }
    870867}
    871 //*****************************************************************************
    872 //*****************************************************************************
    873 static void disasmModRMSReg(PDISSTATE pDis, PCDISOPCODE pOp, unsigned idx, PDISOPPARAM pParam)
     868
     869
     870static void disasmModRMSReg(unsigned idx, PCDISOPCODE pOp, PDISSTATE pDis, PDISOPPARAM pParam)
    874871{
    875872    NOREF(pOp);
     
    896893    {
    897894    case OP_PARM_G: //general purpose register
    898         disasmModRMReg(pDis, pOp, reg, pParam, 0);
     895        disasmModRMReg(reg, pOp, pDis, pParam, 0);
    899896        return 0;
    900897
     
    931928            case OP_PARM_S: //segment register
    932929                reg &= 7;   /* REX.R has no effect here */
    933                 disasmModRMSReg(pDis, pOp, reg, pParam);
     930                disasmModRMSReg(reg, pOp, pDis, pParam);
    934931                pParam->fUse |= DISUSE_REG_SEG;
    935932                return 0;
     
    967964        {
    968965        case 0: //effective address
    969             if (rm == 4)
    970             {   /* SIB byte follows ModRM */
    971                 UseSIB(offInstr, pOp, pDis, pParam);
    972             }
     966            if (rm == 4)    /* SIB byte follows ModRM */
     967                UseSIB(pDis, pParam);
    973968            else
    974969            if (rm == 5)
     
    989984            {   //register address
    990985                pParam->fUse |= DISUSE_BASE;
    991                 disasmModRMReg(pDis, pOp, rm, pParam, 1);
     986                disasmModRMReg(rm, pOp, pDis, pParam, 1);
    992987            }
    993988            break;
    994989
    995990        case 1: //effective address + 8 bits displacement
    996             if (rm == 4) {//SIB byte follows ModRM
    997                 UseSIB(offInstr, pOp, pDis, pParam);
    998             }
     991            if (rm == 4)    /* SIB byte follows ModRM */
     992                UseSIB(pDis, pParam);
    999993            else
    1000994            {
    1001995                pParam->fUse |= DISUSE_BASE;
    1002                 disasmModRMReg(pDis, pOp, rm, pParam, 1);
     996                disasmModRMReg(rm, pOp, pDis, pParam, 1);
    1003997            }
    1004998            pParam->uDisp.i8 = pDis->i32SibDisp;
     
    10071001
    10081002        case 2: //effective address + 32 bits displacement
    1009             if (rm == 4) {//SIB byte follows ModRM
    1010                 UseSIB(offInstr, pOp, pDis, pParam);
    1011             }
     1003            if (rm == 4)    /* SIB byte follows ModRM */
     1004                UseSIB(pDis, pParam);
    10121005            else
    10131006            {
    10141007                pParam->fUse |= DISUSE_BASE;
    1015                 disasmModRMReg(pDis, pOp, rm, pParam, 1);
     1008                disasmModRMReg(rm, pOp, pDis, pParam, 1);
    10161009            }
    10171010            pParam->uDisp.i32 = pDis->i32SibDisp;
     
    10201013
    10211014        case 3: //registers
    1022             disasmModRMReg(pDis, pOp, rm, pParam, 0);
     1015            disasmModRMReg(rm, pOp, pDis, pParam, 0);
    10231016            break;
    10241017        }
     
    10371030            {
    10381031                pParam->fUse |= DISUSE_BASE;
    1039                 disasmModRMReg16(pDis, pOp, rm, pParam);
     1032                disasmModRMReg16(rm, pOp, pDis, pParam);
    10401033            }
    10411034            break;
    10421035
    10431036        case 1: //effective address + 8 bits displacement
    1044             disasmModRMReg16(pDis, pOp, rm, pParam);
     1037            disasmModRMReg16(rm, pOp, pDis, pParam);
    10451038            pParam->uDisp.i8 = pDis->i32SibDisp;
    10461039            pParam->fUse |= DISUSE_BASE | DISUSE_DISPLACEMENT8;
     
    10481041
    10491042        case 2: //effective address + 16 bits displacement
    1050             disasmModRMReg16(pDis, pOp, rm, pParam);
     1043            disasmModRMReg16(rm, pOp, pDis, pParam);
    10511044            pParam->uDisp.i16 = pDis->i32SibDisp;
    10521045            pParam->fUse |= DISUSE_BASE | DISUSE_DISPLACEMENT16;
     
    10541047
    10551048        case 3: //registers
    1056             disasmModRMReg(pDis, pOp, rm, pParam, 0);
     1049            disasmModRMReg(rm, pOp, pDis, pParam, 0);
    10571050            break;
    10581051        }
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