VirtualBox

Ignore:
Timestamp:
Jul 9, 2012 12:41:24 PM (12 years ago)
Author:
vboxsync
Message:

DisasmFormatYasm.cpp: Fixed formatting of PUSH Ib with a operand size override. Extended DISFormatYasmIsOddEncoding a little bit more.

File:
1 edited

Legend:

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

    r41792 r42050  
    816816
    817817                            case DISUSE_IMMEDIATE16_SX8:
    818                                 PUT_SZ_STRICT("strict byte ", "byte ");
     818                                if (   !(pDis->fPrefix & DISPREFIX_OPSIZE)
     819                                    || pDis->pCurInstr->uOpcode != OP_PUSH)
     820                                    PUT_SZ_STRICT("strict byte ", "byte ");
     821                                else
     822                                    PUT_SZ("word ");
    819823                                PUT_NUM_16(pParam->uValue);
    820824                                break;
     
    839843
    840844                            case DISUSE_IMMEDIATE32_SX8:
    841                                 PUT_SZ_STRICT("strict byte ", "byte ");
     845                                if (   !(pDis->fPrefix & DISPREFIX_OPSIZE)
     846                                    || pDis->pCurInstr->uOpcode != OP_PUSH)
     847                                    PUT_SZ_STRICT("strict byte ", "byte ");
     848                                else
     849                                    PUT_SZ("dword ");
    842850                                PUT_NUM_32(pParam->uValue);
    843851                                break;
    844852
    845853                            case DISUSE_IMMEDIATE64_SX8:
    846                                 PUT_SZ_STRICT("strict byte ", "byte ");
     854                                if (   !(pDis->fPrefix & DISPREFIX_OPSIZE)
     855                                    || pDis->pCurInstr->uOpcode != OP_PUSH)
     856                                    PUT_SZ_STRICT("strict byte ", "byte ");
     857                                else
     858                                    PUT_SZ("qword ");
    847859                                PUT_NUM_64(pParam->uValue);
    848860                                break;
     
    12371249     * Check for multiple prefixes of the same kind.
    12381250     */
     1251    uint8_t  off1stSeg = UINT8_MAX;
     1252    uint8_t  offOpSize = UINT8_MAX;
     1253    uint8_t  offAddrSize = UINT8_MAX;
    12391254    uint32_t fPrefixes = 0;
    12401255    for (uint32_t offOpcode = 0; offOpcode < RT_ELEMENTS(pDis->abInstr); offOpcode++)
     
    12581273            case 0x64:
    12591274            case 0x65:
     1275                if (off1stSeg == UINT8_MAX)
     1276                    off1stSeg = offOpcode;
    12601277                f = DISPREFIX_SEG;
    12611278                break;
    12621279
    12631280            case 0x66:
     1281                if (offOpSize == UINT8_MAX)
     1282                    offOpSize = offOpcode;
    12641283                f = DISPREFIX_OPSIZE;
    12651284                break;
    12661285
    12671286            case 0x67:
     1287                if (offAddrSize == UINT8_MAX)
     1288                    offAddrSize = offOpcode;
    12681289                f = DISPREFIX_ADDRSIZE;
    12691290                break;
     
    12941315            &&  !DISUSE_IS_EFFECTIVE_ADDR(pDis->Param3.fUse))
    12951316            return true;
     1317
     1318        /* Yasm puts the segment prefixes before the operand prefix with no
     1319           way of overriding it. */
     1320        if (offOpSize < off1stSeg)
     1321            return true;
    12961322    }
    12971323
     
    13071333    }
    13081334
    1309     /* Almost all prefixes are bad. */
     1335    /* Almost all prefixes are bad for jumps. */
    13101336    if (fPrefixes)
    13111337    {
     
    13431369    }
    13441370
    1345     /* All but the segment prefix is bad news. */
     1371    /* All but the segment prefix is bad news for push/pop. */
    13461372    if (fPrefixes & ~DISPREFIX_SEG)
    13471373    {
     
    13871413            case OP_XOR:
    13881414            case OP_CMP:
     1415                return true;
     1416            default:
     1417                break;
     1418        }
     1419    }
     1420
     1421    /* Instructions taking no address or operand which thus may be annoyingly
     1422       difficult to format for yasm. */
     1423    if (fPrefixes)
     1424    {
     1425        switch (pDis->pCurInstr->uOpcode)
     1426        {
     1427            case OP_STI:
     1428            case OP_STC:
     1429            case OP_CLI:
     1430            case OP_CLD:
     1431            case OP_CLC:
     1432            case OP_INT:
     1433            case OP_INT3:
     1434            case OP_INTO:
     1435            case OP_HLT:
     1436            /* Many more to can be added... */
    13891437                return true;
    13901438            default:
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