VirtualBox

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


Ignore:
Timestamp:
Apr 11, 2016 9:30:08 PM (9 years ago)
Author:
vboxsync
Message:

DISFormatYasmEx: More insb prefix hacking.

File:
1 edited

Legend:

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

    r60418 r60442  
    478478        const char *pszFmt = pOp->pszOpcode;
    479479        bool fIgnoresOpSize = false;
     480        bool fMayNeedAddrSize = false;
    480481        switch (pOp->uOpcode)
    481482        {
     
    497498            case OP_INSB:
    498499                pszFmt = "insb";
    499                 fIgnoresOpSize = true;
     500                fIgnoresOpSize = fMayNeedAddrSize = true;
    500501                break;
    501502            case OP_INSWD:
    502503                pszFmt = pDis->uOpMode == DISCPUMODE_16BIT ? "insw"     : pDis->uOpMode == DISCPUMODE_32BIT ? "insd"  : "insq";
     504                fMayNeedAddrSize = true;
    503505                break;
    504506            case OP_OUTSB:
    505507                pszFmt = "outsb";
    506                 fIgnoresOpSize = true;
     508                fIgnoresOpSize = fMayNeedAddrSize = true;
    507509                break;
    508510            case OP_OUTSWD:
    509511                pszFmt = pDis->uOpMode == DISCPUMODE_16BIT ? "outsw"    : pDis->uOpMode == DISCPUMODE_32BIT ? "outsd" : "outsq";
     512                fMayNeedAddrSize = true;
    510513                break;
    511514            case OP_MOVSB:
    512515                pszFmt = "movsb";
    513                 fIgnoresOpSize = true;
     516                fIgnoresOpSize = fMayNeedAddrSize = true;
    514517                break;
    515518            case OP_MOVSWD:
    516519                pszFmt = pDis->uOpMode == DISCPUMODE_16BIT ? "movsw"    : pDis->uOpMode == DISCPUMODE_32BIT ? "movsd" : "movsq";
     520                fMayNeedAddrSize = true;
    517521                break;
    518522            case OP_CMPSB:
    519523                pszFmt = "cmpsb";
    520                 fIgnoresOpSize = true;
     524                fIgnoresOpSize = fMayNeedAddrSize = true;
    521525                break;
    522526            case OP_CMPWD:
    523527                pszFmt = pDis->uOpMode == DISCPUMODE_16BIT ? "cmpsw"    : pDis->uOpMode == DISCPUMODE_32BIT ? "cmpsd" : "cmpsq";
     528                fMayNeedAddrSize = true;
    524529                break;
    525530            case OP_SCASB:
    526531                pszFmt = "scasb";
    527                 fIgnoresOpSize = true;
     532                fIgnoresOpSize = fMayNeedAddrSize = true;
    528533                break;
    529534            case OP_SCASWD:
    530535                pszFmt = pDis->uOpMode == DISCPUMODE_16BIT ? "scasw"    : pDis->uOpMode == DISCPUMODE_32BIT ? "scasd" : "scasq";
     536                fMayNeedAddrSize = true;
    531537                break;
    532538            case OP_LODSB:
    533539                pszFmt = "lodsb";
    534                 fIgnoresOpSize = true;
     540                fIgnoresOpSize = fMayNeedAddrSize = true;
    535541                break;
    536542            case OP_LODSWD:
    537543                pszFmt = pDis->uOpMode == DISCPUMODE_16BIT ? "lodsw"    : pDis->uOpMode == DISCPUMODE_32BIT ? "lodsd" : "lodsq";
     544                fMayNeedAddrSize = true;
    538545                break;
    539546            case OP_STOSB:
    540547                pszFmt = "stosb";
    541                 fIgnoresOpSize = true;
     548                fIgnoresOpSize = fMayNeedAddrSize = true;
    542549                break;
    543550            case OP_STOSWD:
    544551                pszFmt = pDis->uOpMode == DISCPUMODE_16BIT ? "stosw"    : pDis->uOpMode == DISCPUMODE_32BIT ? "stosd" : "stosq";
     552                fMayNeedAddrSize = true;
    545553                break;
    546554            case OP_CBW:
     
    650658
    651659        /*
    652          * Add operand size prefix for outsb, movsb, etc.
     660         * Add operand size and address prefixes for outsb, movsb, etc.
    653661         */
    654         if (fIgnoresOpSize && (pDis->fPrefix & DISPREFIX_OPSIZE) )
    655         {
    656             if (pDis->uCpuMode == DISCPUMODE_16BIT)
    657                 PUT_SZ("o32 ");
    658             else
    659                 PUT_SZ("o16 ");
     662        if (pDis->fPrefix & (DISPREFIX_OPSIZE | DISPREFIX_ADDRSIZE))
     663        {
     664            if (fIgnoresOpSize && (pDis->fPrefix & DISPREFIX_OPSIZE) )
     665            {
     666                if (pDis->uCpuMode == DISCPUMODE_16BIT)
     667                    PUT_SZ("o32 ");
     668                else
     669                    PUT_SZ("o16 ");
     670            }
     671            if (fMayNeedAddrSize && (pDis->fPrefix & DISPREFIX_ADDRSIZE) )
     672            {
     673                if (pDis->uCpuMode == DISCPUMODE_16BIT)
     674                    PUT_SZ("a32 ");
     675                else
     676                    PUT_SZ("a16 ");
     677            }
    660678        }
    661679
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