Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1846 | yogev_ezra | 1 | //CODE GENERATION DESCRIPTORS |
2 | // ========================= |
||
3 | // >>> DESCRIPTION CODES <<< |
||
4 | // ========================= |
||
5 | |||
6 | //T_ |
||
7 | // DB |
||
8 | // [DB |
||
9 | // [DB |
||
10 | // DB |
||
11 | // DB |
||
12 | // DB 0 |
||
13 | //OR DB _END //IF THERE'RE NO MORE INFO ABOUT THIS MNEMONIC |
||
14 | |||
15 | // OPERATION SIZE CODES |
||
16 | enum { _B, //OPERATION MAY BE OF SIZE BYTE,WORD OR DWORD SEIN. THE OPCODE'S |
||
17 | // W BIT INDICATES IF IT'S A BYTE OR WORD OPERATION. |
||
18 | // FOR DWORD OPERATIONS, THE W BIT MUST BE TRUE (WORD OPERATION) |
||
19 | // AND THE RAND:PREFIX MUST BE GENERATED. |
||
20 | _W, //OPERATION SIZE MAY BE WORD OR DWORD. |
||
21 | _D, //OPERATION MAY ONLY BE DWORD. |
||
22 | WB, //1. OPERAND WORD, 2. OPERAND BYTE |
||
23 | _DW, //1. OPERAND DWORD, 2. OPERAND WORD |
||
24 | BW, //1. OPERAND BYTE, 2. OPERAND WORD |
||
25 | NB, //ONLY BYTE SIZE. |
||
26 | _OW, //ONLY WORD SIZE. |
||
27 | _OD, // Only DWORD size |
||
28 | AF}; //ONLY ABSOLUTE FAR 32/48 BIT ADDRESS |
||
29 | |||
30 | #define _JB 1 //OPERAND IS A JUMP - DESTINATION +/-128 |
||
31 | #define _JW 2 //OPERAND IS A JUMP - DESTINATION +/-32678 |
||
32 | |||
33 | // 0-2 = OPERATION SIZE CODE |
||
34 | // 3-4 = # OF OPERANDS NEEDED. |
||
35 | |||
36 | // # OF OPERANDS |
||
37 | #define OL0 0 |
||
38 | #define OL1 0o10 |
||
39 | #define OL2 0o20 |
||
40 | #define OL3 0o30 |
||
41 | |||
42 | #define OLBITS 0o30 //MASKS FOR # OF OPERANDS. |
||
43 | #define NOLBITS 0o347 |
||
44 | #define TRANSBITS 0o7 //MASKS FOR OPERATION SIZE CODES. |
||
45 | #define NTRANSBITS 0o370 |
||
46 | |||
47 | // IF OL1, USE THIS OPERAND TYPES: |
||
48 | #define SOJ 0b00000000 //JUMP |
||
49 | #define SOE 0b00100000 //EA |
||
50 | #define SOR 0b01000000 //REG |
||
51 | #define SOC 0b01100000 //CONST |
||
52 | #define SO3 0b10000000 //_3 |
||
53 | #define SOS 0b10100000 //SREG |
||
54 | #define SOM 0b11000000 //EA-MEMORY-POINTER |
||
55 | #define SOO 0b11100000 //THERE IS INFORMATION USING THE OPERAND SIZE CODE BITS. |
||
56 | #define SOO_FS 0o340 //FS-REGISTER |
||
57 | #define SOO_GS 0o341 //GS-REGISTER |
||
58 | #define SOO_AF 0o342 //ABSOLUTE ADRESS |
||
59 | #define SOO_CC 0o343 //SIGNED BYTE |
||
60 | #define OPBITS 0b11100000 |
||
61 | |||
62 | // IF OL2, USE THOSE INSTEAD: |
||
63 | // 00000000B //DIRECT DESCRIPTOR |
||
64 | //AR,CO |
||
65 | #define ERO 0b00100000 //FIXED EA,REG ORDER |
||
66 | #define REO 0b01000000 //FIXED REG,EA ORDER |
||
67 | #define DER 0b01100000 //EA,REG OR REG,EA DEFINED BY A D-BIT |
||
68 | #define ECO 0b10000000 //EA,CONSTANT// SIZE DEFINED BY W-BIT |
||
69 | #define ECCO 0b10100000 //EA,CC |
||
70 | #define RCO 0b11000000 //REG,CONSTANT// SIZE DEFINED BY W-BIT |
||
71 | #define EAO 0b11100000 //EA,? // SECOND OPERAND DESCRIBED BY OLD DESCIPTORS |
||
72 | //?=_1,rCL,CO |
||
73 | |||
74 | // OPERAND TYPE CODES |
||
75 | enum { R, //GENERAL REGISTER |
||
76 | E, //EFFEKTIVE ADRESS |
||
77 | CO, //CONSTANT |
||
78 | _SR, //SEGMENT REGISTER |
||
79 | SYSR, //SYSTEM REGISTER |
||
80 | _DR, //DEBUG REGISTER |
||
81 | _TR, //TASK REGISTER |
||
82 | _CR, //CONTROL REGISTER |
||
83 | _CR4, // |
||
84 | _AF, //ABSOLUTE 32/48 BIT FAR ADDRESS |
||
85 | AR=11, //AX/AL REGISTER, INDICATED BY OPERATION SIZE |
||
86 | _1}; //CONSTANT VALUE 1 |
||
87 | |||
88 | // IF OL3, USE THIS: |
||
89 | // INSTRUCTION WITH THREE OPERANDS ARE ALWAYS OF SIZE WORD. |
||
90 | // THE FOLLOWING CODES DESCRIBE THE 3RD OPERAND. |
||
91 | enum { CB3, //BYTE CONSTANT |
||
92 | CW3, //WORD CONSTANT |
||
93 | CC3, //SBYTE CONSTANT |
||
94 | CL3}; //CL REGISTER |
||
95 | |||
96 | // OPCODE DESCRIPTORS |
||
97 | enum{ O=1, //OPCODE IS A BYTE |
||
98 | OW, //OPCODE IS A WORD |
||
99 | OS, //OPCODE IS A BYTE PLUS A SECOND BYTE THAT IS DESCRIBED BY AN |
||
100 | //OCTAL STRING. |
||
101 | S, //OCTAL STRING FOLLOWS FOR OPCODE |
||
102 | XRM, //MODRM BYTE |
||
103 | XPM, //MODRM MIT P-FLAG (GRUPPE VON ARITHMETIC INSTRUCTIONS) |
||
104 | XSM, //MODRM MIT SEGMENTREGISTER |
||
105 | X0M,X1M,X2M,X3M,X4M,X5M,X6M,X7M //MODRM WITH CONSTANT R DIGIT |
||
106 | }; |
||
107 | |||
108 | byte OVERRIDETAB={0o46,0o56,0o66,0o76,0o144,0o145}; |
||
109 | // ---- Кодировка регистров |
||
110 | enum{ rAL ,rCL ,rDL ,rBL ,rAH ,rCH ,rDH ,rBH, // 0-7 byte regs |
||
111 | rAX ,rCX ,rDX ,rBX ,rSP ,rBP ,rSI ,rDI, // 8-15 16-bit word regs |
||
112 | rEAX,rECX,rEDX,rEBX,rESP,rEBP,rESI,rEDI,// 16-23 32-bit regs |
||
113 | rCR0,rCR1,rCR2,rCR3,rCR4,rCR5,rCR6,rCR7,// 24-31 control regs |
||
114 | rDR0,rDR1,rDR2,rDR3,rDR4,rDR5,rDR6,rDR7,// 32-39 debug regs |
||
115 | rTR0,rTR1,rTR2,rTR3,rTR4,rTR5,rTR6,rTR7,// 40-47 test regs |
||
116 | rES,rCS,rSS,rDS, rFS,rGS}; // 48-53 seg regs |
||
117 | byte Registers={ |
||
118 | "AL","CL","DL","BL","AH","CH","DH","BH", |
||
119 | "AX","CX","DX","BX","SP","BP","SI","DI", |
||
120 | "EAX","ECX","EDX","EBX","ESP","EBP","ESI","EDI", |
||
121 | "CR0","CR1","CR2","CR3","CR4","CR5","CR6","CR7", |
||
122 | "DR0","DR1","DR2","DR3","DR4","DR5","DR6","DR7", |
||
123 | "TR0","TR1","TR2","TR3","TR4","TR5","TR6","TR7", |
||
124 | "ES","CS","SS","DS","FS","GS",_END}; |
||
125 | byte Sizes={"BYTE","WORD","DWORD",_END}; |
||
126 | |||
127 | // ---- Описания менмоник |
||
128 | byte PCOMMANDS1={ |
||
129 | 0, //P FLAG STARTS AT 0 |
||
130 | _B+OL2+EAO,AR,CO,S,"0P4", |
||
131 | _B+OL2+DER,S,'0','P','0',XRM,0, |
||
132 | _W+OL2+ECCO,O,0o203,XPM,0, |
||
133 | _B+OL2+ECO,O,0o200,XPM,_END}; |
||
134 | |||
135 | byte PCOMMANDS2={ |
||
136 | 4, //P FLAG STARTS AT 4 |
||
137 | _B+OL1+SOE,O,0xF6,XPM,_END}; |
||
138 | byte PCOMMANDS3= 0; //P FLAG STARTS AT 0 |
||
139 | byte PCOMMANDS3_={ |
||
140 | _B+OL2+EAO,-1,_1,O,0xD0,XPM,0, |
||
141 | _B+OL2+EAO,-1,rCL,O,0xD2,XPM,0, |
||
142 | _B+OL2+ECCO,O,0xC0,XPM,_END}; |
||
143 | |||
144 | byte PCOMMANDS4={ |
||
145 | 4, //P FLAG STARTS AT 4 |
||
146 | _W+OL2+ERO,OS,0xF,'2','P','3',XRM,0, |
||
147 | WB+OL2+ECO,OW,0xF,0o272,XPM,_END}; |
||
148 | // Однобайтовые инструкции |
||
149 | byte T_DAA={ O,0o47,_END}; |
||
150 | byte T_DAS={ O,0o57,_END}; |
||
151 | byte T_AAA={ O,0o67,_END}; |
||
152 | byte T_AAD={ OW,0o325,0o12,_END}; |
||
153 | byte T_AAM={ OW,0o324,0o12,_END}; |
||
154 | byte T_AAS={ O,0o77,_END}; |
||
155 | byte T_CWDE={ O,0o230,_END}; |
||
156 | byte T_CBW={ OW,0x66,0o230,_END}; |
||
157 | byte T_CDQ={ O,0o231,_END}; |
||
158 | byte T_CWD={ OW,0x66,0o231,_END}; |
||
159 | byte T_XLATB={ O,0o327,_END}; |
||
160 | byte T_NOP={ O,0o220,_END}; |
||
161 | byte T_WAIT={ O,0o233,_END}; |
||
162 | byte T_LOCK={ O,0o360,_END}; |
||
163 | byte T_HLT={ O,0o364,_END}; |
||
164 | byte T_INTO={ O,0o316,_END}; |
||
165 | byte T_IRET={ O,0o317,_END}; |
||
166 | byte T_POPFD={ O,0o235,_END}; |
||
167 | byte T_POPF={ OW,0x66,0o235,_END}; |
||
168 | byte T_PUSHFD={ O,0o234,_END}; |
||
169 | byte T_PUSHF={ OW,0x66,0o234,_END}; //PUSHF / (#) PUSHFD |
||
170 | byte T_SAHF={ O,0o236,_END}; |
||
171 | byte T_LAHF={ O,0o237,_END}; |
||
172 | byte T_CMC={ O,0o365,_END}; |
||
173 | byte T_CLC={ O,0o370,_END}; |
||
174 | byte T_STC={ O,0o371,_END}; |
||
175 | byte T_CLI={ O,0o372,_END}; |
||
176 | byte T_STI={ O,0o373,_END}; |
||
177 | byte T_CLD={ O,0o374,_END}; |
||
178 | byte T_STD={ O,0o375,_END}; |
||
179 | byte T_PUSHAD={ O,0o140,_END}; |
||
180 | byte T_PUSHA={ OW,0x66,0o140,_END}; |
||
181 | byte T_POPAD={ O,0o141,_END}; |
||
182 | byte T_POPA={ OW,0x66,0o141,_END}; |
||
183 | byte T_INSB={ O,0o154,_END}; |
||
184 | byte T_INSW={ OW,0x66,0o155,_END}; |
||
185 | byte T_INSD={ O,0o155,_END}; |
||
186 | byte T_OUTSB={ O,0o156,_END}; |
||
187 | byte T_OUTSW={ OW,0x66,0o157,_END}; |
||
188 | byte T_OUTSD={ O,0o157,_END}; |
||
189 | byte T_MOVSB={ O,0o244,_END}; |
||
190 | byte T_MOVSW={ OW,0x66,0o245,_END}; |
||
191 | byte T_MOVSD={ O,0o245,_END}; |
||
192 | byte T_CMPSB={ O,0o246,_END}; |
||
193 | byte T_CMPSW={ OW,0x66,0o247,_END}; |
||
194 | byte T_CMPSD={ O,0o247,_END}; |
||
195 | byte T_STOSB={ O,0o252,_END}; |
||
196 | byte T_STOSW={ OW,0x66,0o253,_END}; |
||
197 | byte T_STOSD={ O,0o253,_END}; |
||
198 | byte T_LODSB={ O,0o254,_END}; |
||
199 | byte T_LODSW={ OW,0x66,0o255,_END}; |
||
200 | byte T_LODSD={ O,0o255,_END}; |
||
201 | byte T_SCASB={ O,0o256,_END}; |
||
202 | byte T_SCASW={ OW,0x66,0o257,_END}; |
||
203 | byte T_SCASD={ O,0o257,_END}; |
||
204 | byte T_REP={ O,0o362,_END}; |
||
205 | byte T_REPE={ O,0o363,_END}; |
||
206 | byte T_RAND={ O,0o146,_END}; //RAND: |
||
207 | byte T_ADDR={ O,0o147,_END}; //ADDR: |
||
208 | byte T_LEAVE={ O,0o311,_END}; |
||
209 | byte T_CLTS={ OW,0xF,6,_END}; |
||
210 | byte T_INVD={ OW,0xF,0o10,_END}; |
||
211 | byte T_WBINVD={ OW,0xF,0o11,_END}; |
||
212 | byte T_WRMSR={ OW,0xF,0x30,_END}; //WRMSR WRITE EDXEAX TO MODEL SPECIFIC REG #ECX |
||
213 | byte T_CPUID={ OW,0xF,0xA2,_END}; //CPUID IF EAX=1 SET EDXEAX TO CPU IDENTIFICATION VALUES |
||
214 | byte T_RDMSR={ OW,0xF,0x32,_END}; //RDMSR READ MODEL SPECIFIC REG #ECX TO EDXEAX |
||
215 | byte T_RDTSC={ OW,0xF,0x31,_END}; //RDTSC READ TIME STAMP COUNTER TO EDXEAX |
||
216 | byte T_RSM={ OW,0xF,0xAA,_END}; //RSM RESUME FROM SYSTEM MANAGEMENT MODE |
||
217 | //===== INTEL PENTIUM PRO INSTRUCTIONS |
||
218 | byte T_RDPMC={ OW,0xF,0x33,_END}; //READ PERFORMANCE MONITORING COUNTERS |
||
219 | byte T_UD2={ OW,0xF,0xB,_END}; //UNDEFINED INSTRUCTION EXCEPTION |
||
220 | byte T_EMMX={ OW,0xF,0x77,_END}; //EMPTY MMX STATE |
||
221 | byte T_SALC={ O,0xD6,_END}; |
||
222 | byte T_ICEBP={ O,0xF1,_END}; |
||
223 | byte T_PSHIMW={ OW,0xF,0x71,_END}; |
||
224 | byte T_PSHIMD={ OW,0xF,0x72,_END}; |
||
225 | byte T_PSHIMQ={ OW,0xF,0x73,_END}; |
||
226 | |||
227 | byte T_NOT={ _B+OL1+SOE,O,0xF6,X2M,_END}; |
||
228 | byte T_NEG={ _B+OL1+SOE,O,0xF6,X3M,_END}; |
||
229 | byte T_INC={ _W+OL1+SOR,S,"10R", |
||
230 | _B+OL1+SOE,O,0xFE,X0M,_END}; |
||
231 | byte T_DEC={ _W+OL1+SOR,S,"11R", |
||
232 | _B+OL1+SOE,O,0xFE,X1M,_END}; |
||
233 | byte T_TEST={ _B+OL2+ERO,O,0o204,XRM,0, //ALPHA:WAS 204O |
||
234 | _B+OL2+REO,O,0o204,XRM,0, //" |
||
235 | _B+OL2+EAO,AR,CO,O,0o250,0, |
||
236 | _B+OL2+ECO,O,0xF6,X0M,_END}; |
||
237 | // EXTENDED 386 INTEGER MULTIPLICATION |
||
238 | byte T_IMUL={ _B+OL1+SOE,O,0xF6,X5M,0, //IMUL EB |
||
239 | _B+OL2+ECO,O,0xC0,X1M,0, |
||
240 | _B+OL2+EAO,-1,_1,O,0xD0,X1M,0, |
||
241 | _B+OL2+EAO,-1,rCL,O,0xD2,X1M,0, |
||
242 | _W+OL1+REO,OW,0xF,0o257,XRM,0, //IMUL RW, EW |
||
243 | OL3+REO+CC3,O,0o153,XRM,0, //IMUL RW, EW, DC |
||
244 | OL3+REO+CW3,O,0o151,XRM,_END}; //IMUL RW, EW, DW |
||
245 | byte T_SHLD={ OL3+ERO+CB3,OW,0xF,0o244,XRM,0, |
||
246 | OL3+ERO+CL3,OW,0xF,0o245,XRM,_END}; |
||
247 | byte T_SHRD={ OL3+ERO+CB3,OW,0xF,0o254,XRM,0, |
||
248 | OL3+ERO+CL3,OW,0xF,0o255,XRM,_END}; |
||
249 | byte T_MOVSX={ WB+OL2+REO,OW,0xF,0o276,XRM,0, |
||
250 | _DW+OL2+REO,OW,0xF,0o277,XRM,_END}; |
||
251 | byte T_MOVZX={ WB+OL2+REO,OW,0xF,0o266,XRM,0, |
||
252 | _DW+OL2+REO,OW,0xF,0o267,XRM,_END}; |
||
253 | byte T_BSWAP={ _D+OL1+SOR,OS,0xF,"31R",_END}; |
||
254 | byte T_BSF={ _W+OL2+REO,OW,0xF,0o274,XRM,_END}; |
||
255 | byte T_BSR={ _W+OL2+REO,OW,0xF,0o275,XRM,_END}; |
||
256 | byte T_CMPXCHG={_B+OL2+ERO,OW,0xF,0xB0,XRM,_END}; |
||
257 | byte T_CMPXCHG486={_B+OL2+ERO,OW,0xF,0xA7,XRM,_END}; |
||
258 | byte T_CMPXCHG8B={_B+OL2+ERO,OW,0xF,0xC7,XRM,_END}; |
||
259 | byte T_XADD={ _B+OL2+ERO,OW,0xF,0xC0,XRM,_END}; |
||
260 | byte T_XCHG={ _W+OL2+EAO,-1,AR,S,"22M", //ALPHA:WAS "22R" BUT GENERATED NOP |
||
261 | _W+OL2+EAO,AR,-1,S,"22R", |
||
262 | _B+OL2+REO,O,0o206,XRM,0, |
||
263 | _B+OL2+ERO,O,0o206,XRM,_END}; |
||
264 | byte T_MOV=0; //DUMMY BYTE |
||
265 | byte T_LEA={ _D+OL2+REO,O,0o215,XRM,_END}; //LEA RW, EN (X != 3) |
||
266 | byte T_LSS={ _D+OL2+REO,OW,0xF,0o262,XRM,_END};//LSS RW, EF (X != 3) |
||
267 | byte T_LFS={ _D+OL2+REO,OW,0xF,0o264,XRM,_END};//LFS RW, EF (X != 3) |
||
268 | byte T_LGS={ _D+OL2+REO,OW,0xF,0o265,XRM,_END};//LGS RW, EF (X != 3) |
||
269 | byte T_LES={ _D+OL2+REO,O,0o304,XRM,_END}; //LES RW, EF (X != 3) |
||
270 | byte T_LDS={ _D+OL2+REO,O,0o305,XRM,_END}; //LDS RW, EF (X != 3) |
||
271 | byte T_SET0={ NB+OL1+SOE,OW,0xF,0o220,X0M,_END}; |
||
272 | byte T_SET1={ NB+OL1+SOE,OW,0xF,0o221,X0M,_END}; |
||
273 | byte T_SET2={ NB+OL1+SOE,OW,0xF,0o222,X0M,_END}; |
||
274 | byte T_SET3={ NB+OL1+SOE,OW,0xF,0o223,X0M,_END}; |
||
275 | byte T_SET4={ NB+OL1+SOE,OW,0xF,0o224,X0M,_END}; |
||
276 | byte T_SET5={ NB+OL1+SOE,OW,0xF,0o225,X0M,_END}; |
||
277 | byte T_SET6={ NB+OL1+SOE,OW,0xF,0o226,X0M,_END}; |
||
278 | byte T_SET7={ NB+OL1+SOE,OW,0xF,0o227,X0M,_END}; |
||
279 | byte T_SET8={ NB+OL1+SOE,OW,0xF,0o230,X0M,_END}; |
||
280 | byte T_SET9={ NB+OL1+SOE,OW,0xF,0o231,X0M,_END}; |
||
281 | byte T_SETA={ NB+OL1+SOE,OW,0xF,0o232,X0M,_END}; |
||
282 | byte T_SETB={ NB+OL1+SOE,OW,0xF,0o233,X0M,_END}; |
||
283 | byte T_SETC={ NB+OL1+SOE,OW,0xF,0o234,X0M,_END}; |
||
284 | byte T_SETD={ NB+OL1+SOE,OW,0xF,0o235,X0M,_END}; |
||
285 | byte T_SETE={ NB+OL1+SOE,OW,0xF,0o236,X0M,_END}; |
||
286 | byte T_SETF={ NB+OL1+SOE,OW,0xF,0o237,X0M,_END}; |
||
287 | // |
||
288 | byte T_JCXZ={ OL1,_JB,O,0o343,_END}; |
||
289 | byte T_LOOPNZ={ OL1,_JB,O,0o340,_END}; |
||
290 | byte T_LOOPZ={ OL1,_JB,O,0o341,_END}; |
||
291 | byte T_LOOP={ OL1,_JB,O,0o342,_END}; |
||
292 | byte T_J0={ OL1,_JB,O,0o160,0, |
||
293 | OL1,_JW,6,OW,0o17,0o200,_END}; |
||
294 | byte T_J1={ OL1,_JB,O,0o161,0, |
||
295 | OL1,_JW,6,OW,0o17,0o201,_END}; |
||
296 | byte T_J2={ OL1,_JB,O,0o162,0, |
||
297 | OL1,_JW,6,OW,0o17,0o202,_END}; |
||
298 | byte T_J3={ OL1,_JB,O,0o163,0, |
||
299 | OL1,_JW,6,OW,0o17,0o203,_END}; |
||
300 | byte T_J4={ OL1,_JB,O,0o164,0, |
||
301 | OL1,_JW,6,OW,0o17,0o204,_END}; |
||
302 | byte T_J5={ OL1,_JB,O,0o165,0, |
||
303 | OL1,_JW,6,OW,0o17,0o205,_END}; |
||
304 | byte T_J6={ OL1,_JB,O,0o166,0, |
||
305 | OL1,_JW,6,OW,0o17,0o206,_END}; |
||
306 | byte T_J7={ OL1,_JB,O,0o167,0, |
||
307 | OL1,_JW,6,OW,0o17,0o207,_END}; |
||
308 | byte T_J8={ OL1,_JB,O,0o170,0, |
||
309 | OL1,_JW,6,OW,0o17,0o210,_END}; |
||
310 | byte T_J9={ OL1,_JB,O,0o171,0, |
||
311 | OL1,_JW,6,OW,0o17,0o211,_END}; |
||
312 | byte T_JA={ OL1,_JB,O,0o172,0, |
||
313 | OL1,_JW,6,OW,0o17,0o212,_END}; |
||
314 | byte T_JB={ OL1,_JB,O,0o173,0, |
||
315 | OL1,_JW,6,OW,0o17,0o213,_END}; |
||
316 | byte T_JC={ OL1,_JB,O,0o174,0, |
||
317 | OL1,_JW,6,OW,0o17,0o214,_END}; |
||
318 | byte T_JD={ OL1,_JB,O,0o175,0, |
||
319 | OL1,_JW,6,OW,0o17,0o215,_END}; |
||
320 | byte T_JE={ OL1,_JB,O,0o176,0, |
||
321 | OL1,_JW,6,OW,0o17,0o216,_END}; |
||
322 | byte T_JF={ OL1,_JB,O,0o177,0, |
||
323 | OL1,_JW,6,OW,0o17,0o217,_END}; |
||
324 | byte T_JMP={ OL1,_JB,O,0o353,0, //JMP SHORT CB |
||
325 | OL1,_JW,5,O,0o351,0, //JMP NEAR CW |
||
326 | _OW+OL1+SOE,O,0o377,X4M,0}; // JMP NEAR EN |
||
327 | byte T_JMPFAR={ _D+OL1+SOE,O,0o377,X5M,0, // JMP FAR EF |
||
328 | OL1+SOO_AF,O,0o352,_END}; //JMP FAR AF |
||
329 | byte T_JMPSHORT={ |
||
330 | OL1,_JB,O,0o353,_END}; //JMP SHORT CB |
||
331 | byte T_JMPNEAR={OL1,_JW,5,O,0o351,0, //JMP NEAR CW |
||
332 | _OW+OL1+SOE,O,0o377,X4M,_END}; // JMP NEAR EN |
||
333 | byte T_CALL={ OL1,_JW,5,O,0o350,0, //CALL CW |
||
334 | _OW+OL1+SOE,O,0o377,X2M,0}; //CALL EN |
||
335 | byte T_CALLFAR={ |
||
336 | OL1+SOO_AF,O,0o232,0, //CALL AF |
||
337 | _D+OL1+SOE,O,0o377,X3M,_END}; //CALL FAR EF |
||
338 | byte T_RETF={ 0,O,0o313,0, //RETF/RET FAR |
||
339 | _OW+OL1+SOC,O,0o312,_END}; //RETF DW/RET FAR DW |
||
340 | byte T_ENTER={ WB+OL2+EAO,CO,CO,O,0o310,_END}; |
||
341 | byte T_BOUND={ _W+OL2+REO,O,0o142,XRM,_END}; //BOUND RW, ED |
||
342 | /*byte T_INT={ NB+OL1+SO3,O,0o314,0, // !!! No interrupts in Win32 |
||
343 | NB+OL1+SOC,O,0o315,_END};*/ |
||
344 | byte T_IN={ NB+OL2+EAO,AR,CO,O,0o344,0, //IN AL, DB |
||
345 | WB+OL2+EAO,AR,CO,O,0o345,0, //IN AX,CO |
||
346 | _B+OL2+EAO,AR,rDX,O,0o354,0, //IN AL,DX |
||
347 | _OW+OL2+EAO,AR,rDX,O,0o355,_END}; //IN AX, DX |
||
348 | byte T_OUT={ NB+OL2+EAO,CO,AR,O,0o346,0, //OUT DB, AL |
||
349 | BW+OL2+EAO,CO,AR,O,0o347,0, //OUT DB, AX |
||
350 | WB+OL2+EAO,rDX,AR,O,0o356,0, //OUT DX, AL |
||
351 | _OW+OL2+EAO,rDX,AR,O,0o357,_END}; //OUT DX, AX |
||
352 | byte T_PUSH={ OL1+SOO_CC,O,0o152,0, |
||
353 | _D+OL1+SOR,S,"12R", |
||
354 | _D+OL1+SOE,O,0o377,X6M,0, |
||
355 | _D+OL1+SOC,O,0o150,0, |
||
356 | OL1+SOO_FS,OW,0xF,0o240,0, |
||
357 | OL1+SOO_GS,OW,0xF,0o250,0, |
||
358 | _OW+OL1+SOS,S,"0S6", //WIEDER ANS ENDE PACKEN |
||
359 | _END}; |
||
360 | byte T_RET={ _OW+OL1+SOC,O,0o302,0, //RET DW |
||
361 | O,0o303,0,_END}; //RET |
||
362 | byte T_POP={ _D+OL1+SOR,S,"13R", |
||
363 | _D+OL1+SOE,O,0o217,X0M,0, |
||
364 | OL1+SOO_FS,OW,0xF,0o241,0, |
||
365 | OL1+SOO_GS,OW,0xF,0o251,0, |
||
366 | _OW+OL1+SOS,S,"0S7",_END}; |
||
367 | byte T_ARPL={ _W+OL2+ERO,O,0o143,XRM,_END}; //ARPL ES, RW |
||
368 | byte T_SLDT={ _OW+OL1+SOE,OW,0xF,0,X0M,_END}; //SLDT EW |
||
369 | byte T_STR={ _OW+OL1+SOE,OW,0xF,0,X1M,_END}; //STR EW |
||
370 | byte T_LLDT={ _OW+OL1+SOE,OW,0xF,0,X2M,_END}; //LLDT EW |
||
371 | byte T_LTR={ _OW+OL1+SOE,OW,0xF,0,X3M,_END}; //LTR EW |
||
372 | byte T_VERR={ _OW+OL1+SOE,OW,0xF,0,X4M,_END}; //VERR EW |
||
373 | byte T_VERW={ _OW+OL1+SOE,OW,0xF,0,X5M,_END}; //VERW EW |
||
374 | byte T_LAR={ _OW+OL1+REO,OW,0xF,2,XRM,_END}; //LAR RW, EW |
||
375 | byte T_LSL={ _OW+OL1+REO,OW,0xF,3,XRM,_END}; //LSL RW, EW |
||
376 | byte T_SGDT={ _OW+OL1+SOM,OW,0xF,1,X0M,_END}; //SGDT EP |
||
377 | byte T_SIDT={ _OW+OL1+SOM,OW,0xF,1,X1M,_END}; //SIDT EP |
||
378 | byte T_LGDT={ _OW+OL1+SOM,OW,0xF,1,X2M,_END}; //LGDT EP |
||
379 | byte T_LIDT={ _OW+OL1+SOM,OW,0xF,1,X3M,_END}; //LIDT EP |
||
380 | byte T_SMSW={ _OW+OL1+SOE,OW,0xF,1,X4M,_END}; //SMSW EW |
||
381 | byte T_LMSW={ _OW+OL1+SOE,OW,0xF,1,X6M,_END}; //LMSW EW |
||
382 | //===== X486 INSTRUCTIONS |
||
383 | byte T_INVLPD={ _OW+OL1+SOM,OW,0xF,0o20,X7M,_END}; //INVLPG EA |
||
384 | //===== INTEL PENTIUM INSTRUCTIONS |
||
385 | byte T_CMPX8={ _OW+OL1+SOE,OW,0xF,0xC7,X1M,_END}; //CMPX8 EW 5 IF EDXEAX=MQ THEN MQ:=ECXEBX, ELSE EAXEDX:=MQ |
||
386 | byte T_CMOV={ _W+OL2,REO,OW,0xF,0x40,XRM,_END}; |
||
387 | //===== MMX INSTRUCTIONS |
||
388 | byte T_EMMS={ _END}; |
||
389 | byte T_UMOV={ _B+OL2,DER,OW,0xF,0x10,XRM,_END}; |
||
390 | #define _Q 1 |
||
391 | #define MMXE 1 |
||
392 | #define MMXP 1 |
||
393 | #define MMXPI 1 |
||
394 | #define MMXPE 1 |
||
395 | #define MMXEP 1 |
||
396 | byte T_PUNPCKLBW={ _D+OL2,MMXE,OW,0xF,0x60,_END}; |
||
397 | byte T_PUNPCKLWD={ _D+OL2,MMXE,OW,0xF,0x61,_END}; |
||
398 | byte T_PUNPCKLDQ={ _D+OL2,MMXE,OW,0xF,0x62,_END}; |
||
399 | byte T_PACKSSWB={ _Q+OL2,MMXE,OW,0xF,0x63,_END}; |
||
400 | byte T_PCMPGTB={ _Q+OL2,MMXE,OW,0xF,0x64,_END}; |
||
401 | byte T_PCMPGTW={ _Q+OL2,MMXE,OW,0xF,0x65,_END}; |
||
402 | byte T_PCMPGTD={ _Q+OL2,MMXE,OW,0xF,0x66,_END}; |
||
403 | byte T_PACKUSWB={ _Q+OL2,MMXE,OW,0xF,0x67,_END}; |
||
404 | byte T_PCMPEQB={ _Q+OL2,MMXE,OW,0xF,0x74,_END}; |
||
405 | byte T_PCMPEQW={ _Q+OL2,MMXE,OW,0xF,0x75,_END}; |
||
406 | byte T_PCMPEQD={ _Q+OL2,MMXE,OW,0xF,0x76,_END}; |
||
407 | byte T_PSRLW={ _Q+OL2,MMXE,OW,0xF,0xD1,_END}; |
||
408 | byte T_PSRLD={ _Q+OL2,MMXE,OW,0xF,0xD2,_END}; |
||
409 | byte T_PSRLQ={ _Q+OL2,MMXE,OW,0xF,0xD3,_END}; |
||
410 | byte T_PMULLW={ _Q+OL2,MMXE,OW,0xF,0xD5,_END}; |
||
411 | byte T_PSRAW={ _Q+OL2,MMXE,OW,0xF,0xE1,_END}; |
||
412 | byte T_PSRAD={ _Q+OL2,MMXE,OW,0xF,0xE2,_END}; |
||
413 | byte T_PMULHW={ _Q+OL2,MMXE,OW,0xF,0xE5,_END}; |
||
414 | byte T_PSLLW={ _Q+OL2,MMXE,OW,0xF,0xF1,_END}; |
||
415 | byte T_PSLLD={ _Q+OL2,MMXE,OW,0xF,0xF2,_END}; |
||
416 | byte T_PSLLQ={ _Q+OL2,MMXE,OW,0xF,0xF3,_END}; |
||
417 | byte T_PMADDWD={ _Q+OL2,MMXE,OW,0xF,0xF5,_END}; |
||
418 | byte T_PUNPCKHBW={ _Q+OL2,MMXE,OW,0xF,0x68,_END}; |
||
419 | byte T_PUNPCKHWD={ _Q+OL2,MMXE,OW,0xF,0x69,_END}; |
||
420 | byte T_PUNPCKHDQ={ _Q+OL2,MMXE,OW,0xF,0x6A,_END}; |
||
421 | byte T_PACKSSDW={ _Q+OL2,MMXE,OW,0xF, 0x6B,_END}; |
||
422 | byte T_MOVD={ _D+OL2,MMXPE,OW,0xF,0x6E,0, |
||
423 | _Q+OL2,MMXEP,OW,0xF,0x7E,_END}; |
||
424 | byte T_MOVQ={ _Q+OL2,MMXE,OW,0xF,0x6F,0, |
||
425 | _Q+OL2,MMXE,OW,0xF,0x7F,_END}; |
||
426 | byte T_PSUBUSB={ _Q+OL2,MMXE,OW,0xF,0xD8,_END}; |
||
427 | byte T_PSUBUSW={ _Q+OL2,MMXE,OW,0xF,0xD9,_END}; |
||
428 | byte T_PAND={ _Q+OL2,MMXE,OW,0xF,0xDB,_END}; |
||
429 | byte T_PADDUSB={ _Q+OL2,MMXE,OW,0xF,0xDC,_END}; |
||
430 | byte T_PADDUSW={ _Q+OL2,MMXE,OW,0xF,0xDD,_END}; |
||
431 | byte T_PANDN={ _Q+OL2,MMXE,OW,0xF,0xDF,_END}; |
||
432 | byte T_PSUBSB={ _Q+OL2,MMXE,OW,0xF,0xE8,_END}; |
||
433 | byte T_PSUBSW={ _D+OL2,MMXE,OW,0xF,0xE9,_END}; |
||
434 | byte T_POR={ _Q+OL2,MMXE,OW,0xF,0xEB,_END}; |
||
435 | byte T_PADDSB={ _Q+OL2,MMXE,OW,0xF,0xEC,_END}; |
||
436 | byte T_PADDSW={ _Q+OL2,MMXE,OW,0xF,0xED,_END}; |
||
437 | byte T_PXOR={ _Q+OL2,MMXE,OW,0xF,0xEF,_END}; |
||
438 | byte T_PSUBB={ _Q+OL2,MMXE,OW,0xF,0xF8,_END}; |
||
439 | byte T_PSUBW={ _Q+OL2,MMXE,OW,0xF,0xF9,_END}; |
||
440 | byte T_PSUBD={ _Q+OL2,MMXE,OW,0xF,0xFA,_END}; |
||
441 | byte T_PADDB={ _Q+OL2,MMXE,OW,0xF,0xFC,_END}; |
||
442 | byte T_PADDW={ _Q+OL2,MMXE,OW,0xF,0xFD,_END}; |
||
443 | byte T_PADDD={ _Q+OL2,MMXE,OW,0xF,0xFE,_END}; |
||
444 | byte T_PSRL={ _Q+OL2,MMXPI,OW,0xF,_END}; |
||
445 | byte T_PSRA={ _Q+OL2,MMXPI,OW,0xF,_END}; |
||
446 | byte T_PSLL={ _Q+OL2,MMXE,OW,0xF,_END}; |
||
447 | |||
448 | byte Mnemonics={ |
||
449 | // FIRST OF ALL THE COMMANDS WITH A P-FLAG. THIS"LL MAKE THINGS EASIER FOR |
||
450 | // COMPARISON IN THE PARSE ENGINE |
||
451 | //P1=0-7 |
||
452 | "ADD","OR","ADC","SBB/BC","AND","SUB","XOR","CMP", |
||
453 | //P2=4-7 |
||
454 | "MUL","-","DIV","IDIV", |
||
455 | // IMUL ENTFERNT |
||
456 | //P3=0-5/7 |
||
457 | "ROL","ROR","RCL","RCR","SHL/AL","SHR","-","SAR", |
||
458 | //P4=4-7 |
||
459 | "BT","BTS","BTR","BTC", |
||
460 | // USUAL COMMANDS |
||
461 | "NOT","NEG","INC","DEC","TEST", "IMUL","SHLD","SHRD", |
||
462 | "DAA","DAS","AAA","AAS","AAM","AAD", |
||
463 | "MOVSX","MOVZX","CBW","CWDE","CWD","CDQ", |
||
464 | "BSWAP","XLAT/LATB","BSF","BSR", |
||
465 | "CMPXCHG","CMPXCHG486","CMPXCHG8B","XADD", |
||
466 | "NOP","WAIT","LOCK","HLT", //"INT", |
||
467 | "INTO","IRET", |
||
468 | "POPF","POPFD","PUSHF","PUSHFD","SAHF","LAHF", |
||
469 | "CMC","CLC","STC","CLI","STI","CLD","STD", |
||
470 | "PUSH","PUSHA","PUSHAD","POP","POPA","POPAD", |
||
471 | "XCHG","MOV","LEA","LSS","LFS","LGS","LES","LDS", |
||
472 | "ADDR","RAND", |
||
473 | "IN","OUT","INSB","INSW","INSD","OUTSB","OUTSW","OUTSD", |
||
474 | "MOVSB","MOVSW","MOVSD","CMPSB","CMPSW","CMPSD", |
||
475 | "STOSB","STOSW","STOSD","LODSB","LODSW","LODSD", |
||
476 | "SCASB","SCASW","SCASD","REP/EPNE/EPNZ","REPE/EPZ", |
||
477 | "JCXZ/ECXZ","LOOP","LOOPZ/OOPE","LOOPNZ/OOPNE", |
||
478 | "JO","JNO","JC/B/NAE","JNC/AE/NB", |
||
479 | "JE/Z","JNE/NZ","JBE/NA","JA/NBE", |
||
480 | "JS","JNS","JP/PE","JNP/PO","JL/NGE","JGE/NL", |
||
481 | "JLE/NG","JG/NLE", |
||
482 | "SETO","SETNO","SETC/ETB/ETNAE","SETNC/ETAE/ETNB", |
||
483 | "SETE/ETZ","SETNE/ETNZ","SETBE/ETNA","SETA/ETNBE", |
||
484 | "SETS","SETNS","SETP/ETPE","SETNP/ETPO","SETL/ETNGE","SETGE/ETNL", |
||
485 | "SETLE/ETNG","SETG/ETNLE", |
||
486 | "JMPS","JMPN","JMPF","JMP", |
||
487 | "CALL","CALLF","RET","RETF", |
||
488 | "ENTER","LEAVE","BOUND","ARPL", |
||
489 | "SLDT","STR","LLDT","LTR","VERR","VERW","LAR","LSL", |
||
490 | "SGDT","SIDT","LGDT","LIDT","SMSW","LMSW","CLTS", |
||
491 | "INVD","WBINVD","INVLPD", |
||
492 | //INTEL PENTIUM COMMANDS |
||
493 | "WRMSR","CMPX8/MPXCHG8B","CPUID","RDMSR","RDTSC","RSM", |
||
494 | //INTEL PENTIUM PRO INSTRUCTIONS |
||
495 | "RDPMC","UD2","EMMX","SETALC", |
||
496 | //MMX INSTRUCTIONS |
||
497 | "MOVD","MOVQ", //MOVE MMX REG |
||
498 | "PACKUS/PACKUSWB", //PACK MMX REG WITH UNSIGNED SATURATION |
||
499 | "PACKSSWB","PACKSSDW", //PACK MMX REG WITH SIGNED SATURATION |
||
500 | "PUNPCKHBW","PUNPCKHWD", |
||
501 | "PUNPCKHDQ", //UNPACK HIGH ORDER |
||
502 | "PUNPCKLBW","PUNPCKLWD", |
||
503 | "PUNPCKLDQ", //UNPACK LOW ORDER |
||
504 | "PADDB","PADDW","PADDD", //ADD MMX REG WITH WRAP-AROUND |
||
505 | "PADDSB","PADDSW", //" WITH SIGNED SATURATION |
||
506 | "PADDUSB","PADDUSW", //" WITH UNSIGNED SATURATION |
||
507 | "PSUBB","PSUBW","PSUBD", //SUBTRACT MMX REG |
||
508 | "PSUBSB","PSUBSW","PSUBUSB","PSUBUSW", |
||
509 | "PMULH/PMULHW","PMULL/PMULLW","PMADD/PMADDWD", |
||
510 | "PSLLW","PSLLD","PSLLQ","PSRLW","PSRLD","PSRLQ", |
||
511 | "PSRAW","PSRAD","PCMPEQB","PCMPEQW","PCMPEQD", |
||
512 | "PCMPGTB","PCMPGTW","PCMPGTD","PAND","PANDN","POR","PXOR","EMMS",_END}; |
||
513 | |||
514 | dword TAB_MNEMONICS={ |
||
515 | #T_NOT,#T_NEG,#T_INC,#T_DEC,#T_TEST, |
||
516 | #T_IMUL,#T_SHLD,#T_SHRD, |
||
517 | #T_DAA,#T_DAS,#T_AAA,#T_AAS,#T_AAM,#T_AAD, |
||
518 | #T_MOVSX,#T_MOVZX,#T_CBW,#T_CWDE,#T_CWD,#T_CDQ, |
||
519 | #T_BSWAP,#T_XLATB, |
||
520 | #T_BSF,#T_BSR,#T_CMPXCHG,#T_CMPXCHG486,#T_CMPXCHG8B,#T_XADD, |
||
521 | #T_NOP,#T_WAIT,#T_LOCK,#T_HLT, |
||
522 | // #T_INT, |
||
523 | #T_INTO,#T_IRET, |
||
524 | #T_POPF,#T_POPFD,#T_PUSHF,#T_PUSHFD, |
||
525 | #T_SAHF,#T_LAHF, |
||
526 | #T_CMC,#T_CLC,#T_STC,#T_CLI,#T_STI,#T_CLD,#T_STD, |
||
527 | #T_PUSH,#T_PUSHA,#T_PUSHAD, |
||
528 | #T_POP,#T_POPA,#T_POPAD, |
||
529 | #T_XCHG,#T_MOV, |
||
530 | #T_LEA,#T_LSS,#T_LFS,#T_LGS,#T_LES,#T_LDS, |
||
531 | #T_ADDR,#T_RAND, |
||
532 | #T_IN,#T_OUT, |
||
533 | #T_INSB,#T_INSW,#T_INSD, |
||
534 | #T_OUTSB,#T_OUTSW,#T_OUTSD, |
||
535 | #T_MOVSB,#T_MOVSW,#T_MOVSD, |
||
536 | #T_CMPSB,#T_CMPSW,#T_CMPSD, |
||
537 | #T_STOSB,#T_STOSW,#T_STOSD, |
||
538 | #T_LODSB,#T_LODSW,#T_LODSD, |
||
539 | #T_SCASB,#T_SCASW,#T_SCASD, |
||
540 | #T_REP, |
||
541 | #T_REPE, |
||
542 | #T_JCXZ,#T_LOOP,#T_LOOPZ,#T_LOOPNZ, |
||
543 | #T_J0,#T_J1,#T_J2,#T_J3, |
||
544 | #T_J4,#T_J5,#T_J6,#T_J7, |
||
545 | #T_J8,#T_J9,#T_JA,#T_JB, |
||
546 | #T_JC,#T_JD,#T_JE,#T_JF, |
||
547 | #T_SET0,#T_SET1,#T_SET2,#T_SET3, |
||
548 | #T_SET4,#T_SET5,#T_SET6,#T_SET7, |
||
549 | #T_SET8,#T_SET9,#T_SETA,#T_SETB, |
||
550 | #T_SETC,#T_SETD,#T_SETE,#T_SETF, |
||
551 | #T_JMPSHORT,#T_JMPNEAR,#T_JMPFAR,#T_JMP, |
||
552 | #T_CALL,#T_CALLFAR, |
||
553 | #T_RET,#T_RETF, |
||
554 | #T_ENTER,#T_LEAVE, |
||
555 | #T_BOUND,#T_ARPL, |
||
556 | #T_SLDT,#T_STR,#T_LLDT,#T_LTR,#T_VERR,#T_VERW, |
||
557 | #T_LAR,#T_LSL, |
||
558 | #T_SGDT,#T_SIDT,#T_LGDT,#T_LIDT, |
||
559 | #T_SMSW,#T_LMSW,#T_CLTS, |
||
560 | #T_INVD,#T_WBINVD,#T_INVLPD, |
||
561 | //INTEL PENTIUM INSTRUCTIONS |
||
562 | #T_WRMSR,#T_CMPX8,#T_CPUID,#T_RDMSR,#T_RDTSC,#T_RSM, |
||
563 | //INTEL PENTIUM PRO INSTRUCTIONS |
||
564 | #T_RDPMC,#T_UD2,#T_EMMX,#T_SALC, |
||
565 | //MMX INSTRUCTIONS |
||
566 | #T_MOVD,#T_MOVQ, //MOVE MMX REG |
||
567 | #T_PACKUSWB, //PACK MMX REG WITH UNSIGNED SATURATION |
||
568 | #T_PACKSSWB,#T_PACKSSDW, //PACK MMX REG WITH SIGNED SATURATION |
||
569 | #T_PUNPCKHBW,#T_PUNPCKHWD,#T_PUNPCKHDQ, //UNPACK HIGH ORDER |
||
570 | #T_PUNPCKLBW,#T_PUNPCKLWD,#T_PUNPCKLDQ, //UNPACK LOW ORDER |
||
571 | #T_PADDB,#T_PADDW,#T_PADDD, //ADD MMX REG WITH WRAP-AROUND |
||
572 | #T_PADDSB,#T_PADDSW, //" WITH SIGNED SATURATION |
||
573 | #T_PADDUSB,#T_PADDUSW, //" WITH UNSIGNED SATURATION |
||
574 | #T_PSUBB,#T_PSUBW,#T_PSUBD, //SUBTRACT MMX REG |
||
575 | #T_PSUBSB,#T_PSUBSW, |
||
576 | #T_PSUBUSB,#T_PSUBUSW, |
||
577 | #T_PMULHW, |
||
578 | #T_PMULLW, |
||
579 | #T_PMADDWD, |
||
580 | #T_PSLLW,#T_PSLLD,#T_PSLLQ, |
||
581 | #T_PSRLW,#T_PSRLD,#T_PSRLQ, |
||
582 | #T_PSRAW,#T_PSRAD, |
||
583 | #T_PCMPEQB,#T_PCMPEQW,#T_PCMPEQD, |
||
584 | #T_PCMPGTB,#T_PCMPGTW,#T_PCMPGTD, |
||
585 | #T_PAND, |
||
586 | #T_PANDN, |
||
587 | #T_POR, |
||
588 | #T_PXOR, |
||
589 | #T_EMMS}; |
||
590 | |||
591 |