Disassemble

Выполняет дизассемблирование инструкции и сборку строки с мнемоникой.

Disassemble PROTO hInstr:HINSTR,Mnemonic:LPSTR,MnemLen:PULONG,dwFlags:DWORD

  • hInstr   - указатель на структуру Instruction, который можно получить с помощью InitInstr.
  • Mnemonic - указатель на буфер размером не менее 256-байт для сохранения мнемоники.
  • MnemLen  - указатель на переменную для сохранения длины мнемоники, указывать не обязательно может равняться нулю, потому-что строка мнемоники всегда заканчивается нулевым байтом.
  • dwFlags  - набор флагов определяющих формат текста мнемоники.

    Возможно использовать следующий набор флагов.
    curr_id=0
    enf    OFFSETS_COL,   HEX_COL,   RIP_ADDRS,REL_ADDRS
    enf             CR,NOT_TABBED,          LF, ALT_MNEM
    enf REL_FFFF_ADDRS, DB_STRING,ADDR_COMPACT

    OFFSETS_COL     - мнемоника будет начинаться с абсолютного аддресса.
    HEX_COL         - слева от основной части мнемоники будет её шестнадцатеричный код.
    RIP_ADDRS       - аддреса с rip-аддрессацией в формате [$+/-disp32][длина_инструкции].
    REL_ADDRS       - относительные аддресса в формате $+/-xxxxxxxxh.
    CR              - завершение строки байтом 13.
    NOT_TABBED      - строка без TAB-oв.
    LF              - завершение строки байтом 10.
    ALT_MNEM        - добавление псевдо-макроса altm.
    REL_FFFF_ADDRS  - используется вместе с флагом REL_ADDRS.Использование записи с простыми оффсетами для 16-битных аддрессов в 32 или 64-битном коде или для 32-битных аддрессов в 16-битном.
    DB_STRING       - вывод опкода вместо мнемоники, в форме для ассемблирования.
    ADDR_COMPACT    - уменьшение количества разрядов в аддрессе, по возможности если флаг OFFSETS_COL установлен. Для 16-битного кода ширина аддресса без этого флага 8 символов, т.е. подразумевается 32-битный оффсет инструкции, но с этим флагом ширина аддресса может быть уменьшена до 4 символов на слачай оффсетов от 0 до 0FFFFh. Для 64-битного кода ширина аддресса без этого флага всегда 16 символов, но в случае оффсетов от 0 до 0FFFFFFFFh для колонки аддрессов хватит и 8 символов.

    А также полезные сочетания.
    CR_LF          equ (CR or LF or ALT_MNEM)
    STD_MNEM       equ (CR_LF or OFFSETS_COL or HEX_COL or ALT_MNEM or ADDR_COMPACT)
    RIP_REL        equ (RIP_ADDRS or REL_ADDRS or CR_LF or ALT_MNEM)
    STD_CLEAR_MNEM equ (NOT_TABBED or ALT_MNEM)
    RIP_REL_LF     equ (RIP_ADDRS or REL_ADDRS or LF or ALT_MNEM)

    Возвращаемое значение: eax равен нулю если не было ошибок, хотя не равенство нулю не означает невозможности дальнейшей работы. Если строка Mnemonic пустая то дизассемблирование необходимо прекратить. Тип DWORD. 

  • Сайт управляется системой uCoz