Возможны 3 разных режима.
curr_id=0
enum LONG_MODE,LEGACY_MODE32,LEGACY_MODE16
MaxInstrLen
equ 15
Возможны следующие значения.
curr_id=MaxInstrLen+1
enum
VERBOSE_PFX,INVALID_INSTRUCTION,
INVALID_OPERAND,
OPCODE_OUT_RANGE
enum UNKNOWN_MNEMONIC,
ASM_DUMP, NOT_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.
Возможны следующие значения.
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 префикса.