MgAsmComDef.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. //-------------------------------------------------------------------------------------------------------------------------
  2. //
  3. #pragma once
  4. //-------------------------------------------------------------------------------------------------------------------------
  5. //
  6. //
  7. #define REG_EAX 0 // Indexes of general-purpose registers
  8. #define REG_ECX 1 // in t_reg.
  9. #define REG_EDX 2
  10. #define REG_EBX 3
  11. #define REG_ESP 4
  12. #define REG_EBP 5
  13. #define REG_ESI 6
  14. #define REG_EDI 7
  15. //
  16. #define SEG_UNDEF -1
  17. #define SEG_ES 0 // Indexes of segment/selector registers
  18. #define SEG_CS 1
  19. #define SEG_SS 2
  20. #define SEG_DS 3
  21. #define SEG_FS 4
  22. #define SEG_GS 5
  23. //
  24. #define C_TYPEMASK 0xF0 // Mask for command type
  25. #define C_CMD 0x00 // Ordinary instruction
  26. #define C_PSH 0x10 // 1-word PUSH instruction
  27. #define C_POP 0x20 // 1-word POP instruction
  28. #define C_MMX 0x30 // MMX instruction
  29. #define C_FLT 0x40 // FPU instruction
  30. #define C_JMP 0x50 // JUMP instruction
  31. #define C_JMC 0x60 // Conditional JUMP instruction
  32. #define C_CAL 0x70 // CALL instruction
  33. #define C_RET 0x80 // RET instruction
  34. #define C_FLG 0x90 // Changes system flags
  35. #define C_RTF 0xA0 // C_JMP and C_FLG simultaneously
  36. #define C_REP 0xB0 // Instruction with REPxx prefix
  37. #define C_PRI 0xC0 // Privileged instruction
  38. #define C_DAT 0xD0 // Data (address) doubleword
  39. #define C_NOW 0xE0 // 3DNow! instruction
  40. #define C_BAD 0xF0 // Unrecognized command
  41. #define C_RARE 0x08 // Rare command, seldom used in programs
  42. #define C_SIZEMASK 0x07 // MMX data size or special flag
  43. #define C_EXPL 0x01 // (non-MMX) Specify explicit memory size
  44. //
  45. #define DEC_TYPEMASK 0x1F // Type of memory byte
  46. #define DEC_UNKNOWN 0x00 // Unknown type
  47. #define DEC_BYTE 0x01 // Accessed as byte
  48. #define DEC_WORD 0x02 // Accessed as short
  49. #define DEC_NEXTDATA 0x03 // Subsequent byte of code or data
  50. #define DEC_DWORD 0x04 // Accessed as long
  51. #define DEC_FLOAT4 0x05 // Accessed as float
  52. #define DEC_FWORD 0x06 // Accessed as descriptor/long pointer
  53. #define DEC_FLOAT8 0x07 // Accessed as double
  54. #define DEC_QWORD 0x08 // Accessed as 8-byte integer
  55. #define DEC_FLOAT10 0x09 // Accessed as long double
  56. #define DEC_TBYTE 0x0A // Accessed as 10-byte integer
  57. #define DEC_STRING 0x0B // Zero-terminated ASCII string
  58. #define DEC_UNICODE 0x0C // Zero-terminated UNICODE string
  59. #define DEC_3DNOW 0x0D // Accessed as 3Dnow operand
  60. #define DEC_BYTESW 0x11 // Accessed as byte index to switch
  61. #define DEC_NEXTCODE 0x13 // Subsequent byte of command
  62. #define DEC_COMMAND 0x1D // First byte of command
  63. #define DEC_JMPDEST 0x1E // Jump destination
  64. #define DEC_CALLDEST 0x1F // Call (and maybe jump) destination
  65. #define DEC_PROCMASK 0x60 // Procedure analysis
  66. #define DEC_PROC 0x20 // Start of procedure
  67. #define DEC_PBODY 0x40 // Body of procedure
  68. #define DEC_PEND 0x60 // End of procedure
  69. #define DEC_CHECKED 0x80 // Byte was analysed
  70. // Errors detected during command disassembling.
  71. #define DAE_NOERR 0 // No error
  72. #define DAE_BADCMD 1 // Unrecognized command
  73. #define DAE_CROSS 2 // Command crosses end of memory block
  74. #define DAE_BADSEG 3 // Undefined segment register
  75. #define DAE_MEMORY 4 // Register where only memory allowed
  76. #define DAE_REGISTER 5 // Memory where only register allowed
  77. #define DAE_INTERN 6 // Internal error
  78. // Warnings issued by Disasm():
  79. #define DAW_FARADDR 0x0001 // Command is a far jump, call or return
  80. #define DAW_SEGMENT 0x0002 // Command loads segment register
  81. #define DAW_PRIV 0x0004 // Privileged command
  82. #define DAW_IO 0x0008 // I/O command
  83. #define DAW_SHIFT 0x0010 // Shift constant out of range 1..31
  84. #define DAW_PREFIX 0x0020 // Superfluous prefix
  85. #define DAW_LOCK 0x0040 // Command has LOCK prefix
  86. #define DAW_STACK 0x0080 // Unaligned stack operation
  87. #define DAW_DANGER95 0x1000 // May mess up Win95 if executed
  88. #define DAW_DANGEROUS 0x3000 // May mess up any OS if executed
  89. // Special command features.
  90. #define WW 0x01 // Bit W (size of operand)
  91. #define SS 0x02 // Bit S (sign extention of immediate)
  92. #define WS 0x03 // Bits W and S
  93. #define W3 0x08 // Bit W at position 3
  94. #define CC 0x10 // Conditional jump
  95. #define FF 0x20 // Forced 16-bit size
  96. #define LL 0x40 // Conditional loop
  97. #define PR 0x80 // Protected command
  98. #define WP 0x81 // I/O command with bit W
  99. // All possible types of operands in 80x86. A bit more than you expected, he?
  100. #define NNN 0 // No operand
  101. #define REG 1 // Integer register in Reg field
  102. #define RCM 2 // Integer register in command byte
  103. #define RG4 3 // Integer 4-byte register in Reg field
  104. #define RAC 4 // Accumulator (AL/AX/EAX, implicit)
  105. #define RAX 5 // AX (2-byte, implicit)
  106. #define RDX 6 // DX (16-bit implicit port address)
  107. #define RCL 7 // Implicit CL register (for shifts)
  108. #define RS0 8 // Top of FPU stack (ST(0), implicit)
  109. #define RST 9 // FPU register (ST(i)) in command byte
  110. #define RMX 10 // MMX register MMx
  111. #define R3D 11 // 3DNow! register MMx
  112. #define MRG 12 // Memory/register in ModRM byte
  113. #define MR1 13 // 1-byte memory/register in ModRM byte
  114. #define MR2 14 // 2-byte memory/register in ModRM byte
  115. #define MR4 15 // 4-byte memory/register in ModRM byte
  116. #define RR4 16 // 4-byte memory/register (register only)
  117. #define MR8 17 // 8-byte memory/MMX register in ModRM
  118. #define RR8 18 // 8-byte MMX register only in ModRM
  119. #define MRD 19 // 8-byte memory/3DNow! register in ModRM
  120. #define RRD 20 // 8-byte memory/3DNow! (register only)
  121. #define MRJ 21 // Memory/reg in ModRM as JUMP target
  122. #define MMA 22 // Memory address in ModRM byte for LEA
  123. #define MML 23 // Memory in ModRM byte (for LES)
  124. #define MMS 24 // Memory in ModRM byte (as SEG:OFFS)
  125. #define MM6 25 // Memory in ModRm (6-byte descriptor)
  126. #define MMB 26 // Two adjacent memory locations (BOUND)
  127. #define MD2 27 // Memory in ModRM (16-bit integer)
  128. #define MB2 28 // Memory in ModRM (16-bit binary)
  129. #define MD4 29 // Memory in ModRM byte (32-bit integer)
  130. #define MD8 30 // Memory in ModRM byte (64-bit integer)
  131. #define MDA 31 // Memory in ModRM byte (80-bit BCD)
  132. #define MF4 32 // Memory in ModRM byte (32-bit float)
  133. #define MF8 33 // Memory in ModRM byte (64-bit float)
  134. #define MFA 34 // Memory in ModRM byte (80-bit float)
  135. #define MFE 35 // Memory in ModRM byte (FPU environment)
  136. #define MFS 36 // Memory in ModRM byte (FPU state)
  137. #define MFX 37 // Memory in ModRM byte (ext. FPU state)
  138. #define MSO 38 // Source in string op's ([ESI])
  139. #define MDE 39 // Destination in string op's ([EDI])
  140. #define MXL 40 // XLAT operand ([EBX+AL])
  141. #define IMM 41 // Immediate data (8 or 16/32)
  142. #define IMU 42 // Immediate unsigned data (8 or 16/32)
  143. #define VXD 43 // VxD service
  144. #define IMX 44 // Immediate sign-extendable byte
  145. #define C01 45 // Implicit constant 1 (for shifts)
  146. #define IMS 46 // Immediate byte (for shifts)
  147. #define IM1 47 // Immediate byte
  148. #define IM2 48 // Immediate word (ENTER/RET)
  149. #define IMA 49 // Immediate absolute near data address
  150. #define JOB 50 // Immediate byte offset (for jumps)
  151. #define JOW 51 // Immediate full offset (for jumps)
  152. #define JMF 52 // Immediate absolute far jump/call addr
  153. #define SGM 53 // Segment register in ModRM byte
  154. #define SCM 54 // Segment register in command byte
  155. #define CRX 55 // Control register CRx
  156. #define DRX 56 // Debug register DRx
  157. // Pseudooperands (implicit operands, never appear in assembler commands). Must
  158. // have index equal to or exceeding PSEUDOOP.
  159. #define PRN (PSEUDOOP+0) // Near return address
  160. #define PRF (PSEUDOOP+1) // Far return address
  161. #define PAC (PSEUDOOP+2) // Accumulator (AL/AX/EAX)
  162. #define PAH (PSEUDOOP+3) // AH (in LAHF/SAHF commands)
  163. #define PFL (PSEUDOOP+4) // Lower byte of flags (in LAHF/SAHF)
  164. #define PS0 (PSEUDOOP+5) // Top of FPU stack (ST(0))
  165. #define PS1 (PSEUDOOP+6) // ST(1)
  166. #define PCX (PSEUDOOP+7) // CX/ECX
  167. #define PDI (PSEUDOOP+8) // EDI (in MMX extentions)
  168. //
  169. #define C_DANGER95 0x01 // Command is dangerous under Win95/98
  170. #define C_DANGER 0x03 // Command is dangerous everywhere
  171. #define C_DANGERLOCK 0x07 // Dangerous with LOCK prefix
  172. ////////////////////////////////////////////////////////////////////////////////
  173. ///////////////////////////// ASSEMBLER FUNCTIONS //////////////////////////////
  174. // Scanner modes.
  175. #define SA_NAME 0x0001 // Don't try to decode labels
  176. #define SA_IMPORT 0x0002 // Allow import pseudolabel
  177. // Types of input tokens reported by scanner.
  178. #define SCAN_EOL 0 // End of line
  179. #define SCAN_REG8 1 // 8-bit register
  180. #define SCAN_REG16 2 // 16-bit register
  181. #define SCAN_REG32 3 // 32-bit register
  182. #define SCAN_SEG 4 // Segment register 段寄存器
  183. #define SCAN_FPU 5 // FPU register FPU寄存器
  184. #define SCAN_MMX 6 // MMX register 扩展寄存器
  185. #define SCAN_CR 7 // Control register
  186. #define SCAN_DR 8 // Debug register
  187. #define SCAN_OPSIZE 9 // Operand size modifier
  188. #define SCAN_JMPSIZE 10 // Jump size modifier 跳转大小
  189. #define SCAN_LOCAL 11 // Address on stack in form LOCAL.decimal 在堆栈中的地址的形式LOCAL.decimal
  190. #define SCAN_ARG 12 // Address on stack in form ARG.decimal 在堆栈中的地址的形式ARG.decimal
  191. #define SCAN_PTR 20 // PTR in MASM addressing statements PTR在MASM解决报表
  192. #define SCAN_REP 21 // REP prefix REP前缀
  193. #define SCAN_REPE 22 // REPE prefix REPE前缀
  194. #define SCAN_REPNE 23 // REPNE prefix REPNE前缀
  195. #define SCAN_LOCK 24 // LOCK prefix LOCK前缀
  196. #define SCAN_NAME 25 // Command or label 命令或标签
  197. #define SCAN_ICONST 26 // Hexadecimal constant 十六进制常量
  198. #define SCAN_DCONST 27 // Decimal constant 十进制常数
  199. #define SCAN_OFS 28 // Undefined constant 未定义的常量
  200. #define SCAN_FCONST 29 // Floating-point constant 浮点常量
  201. #define SCAN_EIP 30 // Register EIP 注册EIP
  202. #define SCAN_SIGNED 31 // Keyword "SIGNED" (in expressions)
  203. #define SCAN_UNSIGNED 32 // Keyword "UNSIGNED" (in expressions)
  204. #define SCAN_CHAR 33 // Keyword "CHAR" (in expressions)
  205. #define SCAN_FLOAT 34 // Keyword "FLOAT" (in expressions)
  206. #define SCAN_DOUBLE 35 // Keyword "DOUBLE" (in expressions)
  207. #define SCAN_FLOAT10 36 // Keyword "FLOAT10" (in expressions)
  208. #define SCAN_STRING 37 // Keyword "STRING" (in expressions)
  209. #define SCAN_UNICODE 38 // Keyword "UNICODE" (in expressions)
  210. #define SCAN_MSG 39 // Pseudovariable MSG (in expressions)
  211. #define SCAN_SYMB 64 // Any other character 任何其他字符
  212. #define SCAN_IMPORT 65 // Import pseudolabel
  213. #define SCAN_ERR 255 // Definitely bad item //错误的信息
  214. // Definition used by Assembler to report command matching errors.
  215. // 错误信息定义
  216. #define MA_JMP 0x0001 // Invalid jump size modifier
  217. #define MA_NOP 0x0002 // Wrong number of operands
  218. #define MA_TYP 0x0004 // Bad operand type 错误的操作数类型
  219. #define MA_NOS 0x0008 // Explicit operand size expected
  220. #define MA_SIZ 0x0010 // Bad operand size 错误的操作数大小
  221. #define MA_DIF 0x0020 // Different operand sizes 不同的操作数大小
  222. #define MA_SEG 0x0040 // Invalid segment register 无效的段寄存器
  223. #define MA_RNG 0x0080 // Constant out of expected range 常量超出预期的范围