Instruction

Instruction struc
    MajorVersa    BYTE ? ;out + 0h
    MinorVersa    BYTE ?
    OpcNum        BYTE ?
    OpcTotal      BYTE ?
    DsmCtrl       DWORD ?
    CodePtr       PVOID ? ;in/out + 08h
    NextPtr       PVOID ? ;in/out + 10h
    AlterBase     QWORD ? ;in/out + 18h
    MnemOperType  LPSTR ? ;out + 20h
    Mnemonic      LPSTR ? ;out + 28h
    Oper1Mnemonic LPSTR ? ;+ 30h
    Oper2Mnemonic LPSTR ? ;+ 38h
    Oper3Mnemonic LPSTR ? ;+ 40h
    Oper4Mnemonic LPSTR ? ;+ 48h
    Oper5Mnemonic LPSTR ? ;+ 50h
    RemnCode      ULONG64 ? ;in/out ;+ 58h
    ModrmOffsets  pmoRanges ? ;+ 60h
    hAnalyses     HANALYSES ? ;+ 68h
    Mode          BYTE ? ;in + 70h
    IsHeapStr     BYTE ? ;+ 71h
    FullOpcode    BYTE FULL_OPCSIZE dup(?) ;+ 72h
    ;Legacy prefixes
    SegOver BYTE ? ;out + 92h
    RepPfx  BYTE ? ;out + 93h
    PfxCnt  BYTE ? ;out + 94h
    ;REX prefix
    union
        RexPfx BYTE ? ;out + 95h
        XopRex BYTE ?
        VexRex BYTE ?
    ends
    union

        XopSec BYTE ? ;+ 96h
        VexSec BYTE ?
    ends
    InstrLen BYTE ? ;out + 97h
    ;ModRM
    mode BYTE ? ;out + 98h
    reg  BYTE ? ;out + 99h
    rmem BYTE ? ;out + 9Ah
    ;SIB
    Scale BYTE ? ;out + 9Bh
    Index BYTE ? ;out + 9Ch
    Base  BYTE ? ;out + 9Dh
    ModRmAddress    BYTE 32 dup(?) ;+ 9Eh
    DefaultOperSize BYTE ? ;out +0BEh
    DefaultAddrSize BYTE ? ;out +0BFh
    iFlags          PVOID ? ;out +0C0h
    x87Condition    x87c <> ;out +0C8h
    mOffset         DWORD ? ;out +0D0h
    iMxcsr          DWORD ? ;out +0D4h
    DataSegMnem     DWORD ? ;out +0D8h
    Status          DWORD ? ;out +0DCh
    AddrBias        DWORD ? ;out +0E0h
    Opflags         DWORD ? ;out +0E4h
    OpFeatures      Features <> ;out +0E8h
    OptAddr         BYTE;out +0F2h
    union
        RipOffsetBuf   BYTE 37 dup(?) ;out +0F3h
        JAddrOffsetBuf BYTE 37 dup(?)
    ends
    union

        RipOffset   BYTE 37 dup(?) ;out +118h
        JAddrOffset BYTE 37 dup(?)
    ends
    fn1_eax         DWORD ?
    fn1_ebx         DWORD ?
    fn1_ecx         DWORD ?
    fn1_edx         DWORD ?
    fn7_eax         DWORD ?
    fn7_ebx         DWORD ?
    fn7_ecx         DWORD ?
    fn7_edx         DWORD ?
    fn80000001_eax  DWORD ?
    fn80000001_ebx  DWORD ?
    fn80000001_ecx  DWORD ?
    fn80000001_edx  DWORD ?
    InitialCodePtr  PVOID ?
    InitialCodeSize ULONG64 ?
Instruction ends

HINSTR TYPEDEF PTR Instruction
FULL_OPCSIZE equ 32

  • MajorVersa    - зарезервировано для старшего номера версии.
  • MinorVersa    - зарезервировано для младшего номера версии.
  • OpcNum        - номер опкода в списке опкодов связаных с мнемоникой, после ассемблирования, нумерация начинается с 1.
  • OpcTotal      - общее количество опкодов связаных с мнемоникой, после ассемблирования.
  • DsmCtrl       - дополнительные флаги управления выводом листинга.

    curr_id=0
    enf MODRM_RANGES_PRESENT,ANALYSES_PRESENT,OMIT_SHORT,OMIT_TYPE_SPEC
    enf     OMIT_DEFAULT_SEG,        INDEX_BP
    curr_id=8
    enf SINGLE_DASM
    curr_id=9
    enf        OMIT_NEAR_PTR,        LOADALLSRJ_OFFSET
    curr_id=30
    enf         ARCH_INTEL64,      ARCH_AMD64

    MODRM_RANGES_PRESENT - означает что указатель ModrmOffsets используется.
    ANALYSES_PRESENT     - означает что указатель hAnalyses используется.
    OMIT_SHORT           - запрещает после инструкций jcc выводить ключевое слово short.
    OMIT_TYPE_SPEC       - пренебрежение типами указателей там где это допустимо. По умалчанию установлен.
    OMIT_DEFAULT_SEG     - пренебрежение сегментными префиксами по возможности.
    INDEX_BP             - даёт возможность ассемблеру произвольно определять индекс и базу в аддрессах с регистром ebp или rbp.
    SINGLE_DASM          - режим одинарного диз/ассемблирования, при котором подразумевается, что
                           вызывающий будет сам постоянно переопределять аддресс опкода
                           и виртуальный аддресс. При ассемблировании опкод будет находиться
                           только в буфере FullOpcode.
    OMIT_NEAR_PTR        - если бит установлен, то для ближних переходов не используются уточнения near ptr,near32 ptr и near16 ptr.
    LOADALLS             - если бит установлен, то вместо syscall/sysret используются loadall286/loadall386.
    RJ_OFFSET            - если бит установлен, то происходит автоматическое выделение и освобождения буфера из кучи процесса, указатель на который находится в полеле RipOffset. При необходимости можно перенаправить вывод дизассемблера заменой указателя поля RipOffset и сбрасыванием этого флага. Если старый указатель не равен нулю, значит его нужно освободить функцией HeapFree. 
    ARCH_INTEL64         - тип архитектуры. Устанавливается автоматически в соответствии с cpuid.
    ARCH_AMD64           - тип архитектуры. Устанавливается автоматически в соответствии с cpuid.
  • CodePtr       - указатель на инструкцию.
  • NextPtr       - указатель на следующую инструкцию.
  • AlterBase     - база для отсчитывания абсолютных аддрессов.
  • MnemOperType  - указатель на строку определяющую тип операнда по умолчанию.
  • Mnemonic      - указатель на мнемонику инструкции вместе с префиксом.
  • Oper1Mnemonic,Oper2Mnemonic,Oper3Mnemonic,Oper4Mnemonic,Oper5Mnemonic - указатели на мнемоники операндов.
  • RemnCode      - остаток памяти от изначально заданного буфера при инициализации.
  • ModrmOffsets  - указатель на структуру moRanges.
  • hAnalyses     - указатель на структуру Analyses.
  • Mode          - режим кодирования.

    Возможны 3 разных режима.

    curr_id=0
    enum     LONG_MODE,LEGACY_MODE32,LEGACY_MODE16

    LONG_MODE     - для 64-битного кода.
    LEGACY_MODE32 - для 32-битного кода.
    LEGACY_MODE16 - для 16-битного кода.
  • IsHeapStr     - содержит флаги отмечающие дополнительные участки памяти выделенные из кучи процесса, и в соотвествии с этими флагами инструкция FreeInstr освобождает память.

    curr_id=0
    enf  MNEM_HEAP,OPER1_HEAP,OPER2_HEAP,   OPER3_HEAP
    enf OPER4_HEAP,OPER5_HEAP, MO_RANGES,ANALYSES_HEAP
  • FullOpcode    - 32-байтный буфер в который копируется опкод перед дизассемблированмем, а при ассемблировании там формируется новый опкод.
  • SegOver       - значение последнего сегментного префикса, если такие вообще были, в противном случае равен нулю.
  • RepPfx        - значение последнего rep\repe\repne (0F3h\0F2h) префикса, если такие вообще были, в противном случае равен нулю.
  • PfxCnt        - количество префиксов, плюс длина SVEX,VEX или XOP префикса если такие есть.
  • RexPfx        - значение действующего префикса REX если он есть иначе равно нулю.
  • XopRex        - значение первого байта XOP префикса, сдвинутое на 3 бита влево инструкцией rol.
  • VexRex        - значение первого байта VEX префикса, сдвинутое на 3 бита влево инструкцией rol.
  • XopSec        - значение второго байта XOP префикса.
  • VexSec        - значение второго байта VEX префикса.
  • InstrLen      - длина инструкции.
  • mode          - из ModRM-байта.
  • reg           - из ModRM-байта.
  • rmem          - из ModRM-байта.
  • Scale         - из SIB-байта.
  • Index         - из SIB-байта.
  • Base          - из SIB-байта.
  • ModRmAddress  - мнемоника аддресса определённого ModRM-байтом если mode не равен 11b.
  • DefaultOperSize - значение размера операнда по умолчанию в битах 16/32/64.
  • DefaultAddrSize - размер аддресса по умолчанию в битах 16/32/64.
  • iFlags        - указатель на структуру EF, равен нулю если инструкция не влияет на флаги регистра rFLAGS.
  • x87Condition  - структура x87c с информацией о влиянии на FPU-флаги C0,C1,C2,C3.
  • mOffset       - 1,2 или 4 байтовое смещение после ModRM-байта или SIB`a если он есть.
  • iMxcsr        - маска модифицируемых флагов регистра mxcsr.
  • DataSegMnem   - мнемоника сегментного префикса, только для 64-битного кода может равняться нулю, обусловлено моделью памяти.
  • Status        - статус дизассемблирования, если равен нулю значит мнемоника правильная.

    MaxInstrLen           equ 15
    Возможны следующие значения.
    curr_id=MaxInstrLen+1
    enum        VERBOSE_PFX,INVALID_INSTRUCTION,   INVALID_OPERAND,   OPCODE_OUT_RANGE
    enum    UNKNOWN_MNEMONIC,           ASM_DUMPNOT_ALLOWED_LOCK,    NOT_ALLOWED_REP
    enum   NOT_ALLOWED_REPXX,       TOO_LONG_STR,     TOO_MANY_ARGS,INSUFFICIENT_BUFFER
    enum     INVALID_IN_LM16,TOO_LARGE_ALTER_NUM,MODE_CHANGED_TO_16, MODE_CHANGED_TO_32
    enum  MODE_CHANGED_TO_64,BASE_CHANGED_BY_ORG,     ASM_DIRECTIVE

    VERBOSE_PFX           - избыточные префиксы.
    INVALID_INSTRUCTION   - неизвестная инструкция.
    INVALID_OPERAND       - недопустимый операнд, например prefetch eax.
    OPCODE_OUT_RANGE      - опкод не уместился в буфере.

    В случае если Assemble получил недопустимую мнемонинику.
    UNKNOWN_MNEMONIC      - мнемоника отсутствует в основном списке.
    ASM_DUMP              - была обработана строка дампа, например строка db 2Ch,77h может быть условно ассемблирована, как будто это мнемоника.
    NOT_ALLOWED_LOCK      - недопустимое использование префикса lock.
    NOT_ALLOWED_REP       - недопустимое использование префикса rep.
    NOT_ALLOWED_REPXX     - недопустимое использование префикса repe или repne.
    TOO_LONG_STR          - слишком длинная строка мнемоники.
    TOO_MANY_ARGS         - аргументов больше 5-ти.
    INSUFFICIENT_BUFFER     - означает, что ассемблированный опкод не умещается в буфере. Смотрите описание FullOpcode.
    TOO_LARGE_ALTER_NUM   - указан заведомо не правильный номер альтернативного опкода т. е. сейчас это начиная с 8.
    MODE_CHANGED_TO_16    - обработана директива use16.
    MODE_CHANGED_TO_32    - обработана директива use32.
    MODE_CHANGED_TO_64    - обработана директива use64.
    BASE_CHANGED_BY_ORG   - база изменина директивой org.

  • AddrBias - 1,2 или 4 байтовое смещение относительного REL-аддресса, если такой есть.
  • Opflags - флаги опкода.

    Возможны следующие значения.
    curr_id=0
    enf           OPER66OVER,   ADDR67OVER,   LOCK_PFX,           MODRM
    enf             SIB_BYTE,      MOFFSET,   RIP_ADDR ERASE_SECOND_N
    enf JADDR16_BUT_NOT_LM16, MOD11_OPCODE,     PFX_F3,           JADDR
    enf            OPER2_MEM,   REG_OPCODE,RMEM_OPCODE,   F2F366_OPCODE
    enf          F2F3_OPCODE,WASTE_PFX_SET,    FLAG_0F,OPSZ_NOT_INFERRS
    enf              CS_D_NA,      FLAG_38,    FLAG_3A,    CPL3_ALLOWED
    enf              VEX_PFX,      XOP_PFX,       VSIB,       OPER1_MEM
    enf            OPER3_MEM,    OPER4_MEM,   SVEX_PFX

    OPER66OVER             - наличие хотя-бы 1-го префикса 66h.
    ADDR67OVER             - наличие хотя-бы 1-го префикса 67h.
    LOCK_PFX               - наличие хотя-бы 1-го префикса 0F0h.
    MODRM                  - наличие modrm-байта.
    SIB_BYTE               - наличие sib-байта.
    MOFFSET                - наличие 1,2 или 4-байтового смещения.
    RIP_ADDR               - RIP-аддрессация.
    ERASE_SECOND_N         - наличие неявного wait префикса.
    JADDR16_BUT_NOT_LM16   - 16-битный аддресс не в 16-битном коде.
    MOD11_OPCODE           - поле mode может модифицировать опкод, если рано 11b.
    PFX_F3                 - зарезервировано, не используется.
    JADDR                  - инструкция передачи управления, валидное значение AddrBias.
    OPER2_MEM              - второй операнд представлен аддресом памяти, но не абсолютным оффсетом.
    REG_OPCODE             - reg модифицирует опкод.
    RMEM_OPCODE            - rmem модифицирует опкод.
    F2F366_OPCODE          - префиксы 0F3h,66h,0F2h модифицируют опкод.
    F2F3_OPCODE            - префиксы 0F3h,0F2h модифицируют опкод, но не 66h.
    FLAG_0F                - двухбайтовый опкод, начинающийся с 0Fh.
    OPSZ_NOT_INFERRS       - невозможность пренебречь размерностью операндов.
    CS_D_NA                - размер операндов зависит только от текущего режима кодирования.
    FLAG_38                - трёхбайтовый опкод, начинающийся с 0Fh,38h.
    FLAG_3A                - трёхбайтовый опкод, начинающийся 0Fh,3Ah.
    CPL3_ALLOWED           - инструкция может быть выполнена с CPL равным трём.
    VEX_PFX                - наличие трёхбайтного VEX префикса.
    XOP_PFX                - наличие XOP префикса.
    VSIB                  - (Vector SIB Memory Addressing) возможность специального типа аддрессации для некоторых инструкций AVX2.
    OPER1_MEM              - первый операнд представлен аддресом памяти, но не абсолютным оффсетом.
    OPER3_MEM              - третий операнд представлен аддресом памяти, но не абсолютным оффсетом.
    OPER4_MEM              - четвертый операнд представлен аддресом памяти, но не абсолютным оффсетом.
    SVEX_PFX               - наличие двухбайтного VEX префикса.

  • OpFeatures    - характеристики опкода смотрите описание структуры Features.
  • OptAddr       - cмотрите описание второго параметра псевдо-макроса altm.
  • RipOffsetBuf     - резервировано. 
  • JAddrOffsetBuf   - резервировано.
  • RipOffset     - указатель на мнемонику с абсолютным аддрессом для операнда с RIP-аддрессацией.
  • JAddrOffset   - указатель на мнемонику с абсолютным аддрессом для REL-инструкций.
  • fn1_eax,fn1_ebx,fn1_ecx,fn1_edx - здесь находится значение первой функции cpuid.
  • fn7_eax,fn7_ebx,fn7_ecx,fn7_edx - здесь находится значение седьмой функции cpuid, с ecx равным нулю.
  • fn80000001_eax,fn80000001_ebx,fn80000001_ecx,fn80000001_edx - здесь находится значение расширенной функции 8000_0001 cpuid.
  • InitialCodePtr  - начальное значение указателя на код, при инициализации.
  • InitialCodeSize - начальный размер блока с кодом, при инициализации.
  • Сайт управляется системой uCoz