Rev 31 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 31 | Rev 109 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | ; flat assembler core |
1 | ; flat assembler core |
2 | ; Copyright (c) 1999-2005, Tomasz Grysztar. |
2 | ; Copyright (c) 1999-2006, Tomasz Grysztar. |
3 | ; All rights reserved. |
3 | ; All rights reserved. |
Line 4... | Line 4... | ||
4 | 4 | ||
5 | parser: |
5 | parser: |
6 | mov eax,[memory_end] |
6 | mov eax,[memory_end] |
Line 11... | Line 11... | ||
11 | mov [current_locals_prefix],eax |
11 | mov [current_locals_prefix],eax |
12 | mov [anonymous_reverse],eax |
12 | mov [anonymous_reverse],eax |
13 | mov [anonymous_forward],eax |
13 | mov [anonymous_forward],eax |
14 | mov [hash_tree],eax |
14 | mov [hash_tree],eax |
15 | push [memory_end] |
15 | mov [blocks_stack],eax |
16 | mov esi,[memory_start] |
16 | mov esi,[memory_start] |
17 | mov edi,[source_start] |
17 | mov edi,[source_start] |
18 | parser_loop: |
18 | parser_loop: |
19 | mov [current_line],esi |
19 | mov [current_line],esi |
20 | lea eax,[edi+100h] |
20 | lea eax,[edi+100h] |
21 | cmp eax,[memory_end] |
21 | cmp eax,[labels_list] |
22 | jae out_of_memory |
22 | jae out_of_memory |
23 | cmp byte [esi+16],0 |
23 | cmp byte [esi+16],0 |
24 | je empty_line |
24 | je empty_line |
25 | mov al,0Fh |
25 | mov al,0Fh |
26 | stos byte [edi] |
26 | stos byte [edi] |
27 | mov eax,esi |
27 | mov eax,esi |
28 | stos dword [edi] |
28 | stos dword [edi] |
29 | add esi,16 |
29 | add esi,16 |
30 | call parse_line |
30 | parse_line: |
31 | parse_next_line: |
- | |
32 | cmp esi,[source_start] |
- | |
33 | jb parser_loop |
- | |
34 | xor al,al |
- | |
35 | stos byte [edi] |
- | |
36 | mov eax,[error_line] |
- | |
37 | mov [current_line],eax |
- | |
38 | cmp [anonymous_forward],0 |
- | |
39 | jne invalid_value |
- | |
40 | add edi,0Fh |
- | |
41 | and edi,not 0Fh |
- | |
42 | mov [code_start],edi |
- | |
43 | pop [memory_end] |
- | |
44 | ret |
- | |
45 | empty_line: |
- | |
46 | add esi,17 |
- | |
47 | jmp parse_next_line |
- | |
48 | - | ||
49 | parse_line: |
- | |
50 | mov [parenthesis_stack],0 |
31 | cmp byte [esi],1Ah |
51 | instruction_start: |
- | |
52 | cmp byte [esi],1Ah |
- | |
53 | jne empty_instruction |
32 | jne empty_instruction |
54 | push edi |
33 | push edi |
55 | add esi,2 |
34 | add esi,2 |
56 | movzx ecx,byte [esi-1] |
35 | movzx ecx,byte [esi-1] |
57 | cmp byte [esi+ecx],':' |
36 | cmp byte [esi+ecx],':' |
58 | je simple_label |
37 | je simple_label |
59 | cmp byte [esi+ecx],'=' |
38 | cmp byte [esi+ecx],'=' |
60 | je constant_label |
39 | je constant_label |
61 | cmp byte [esi+ecx],1Ah |
40 | call get_instruction |
- | 41 | jnc main_instruction_identified |
|
- | 42 | cmp byte [esi+ecx],1Ah |
|
62 | jne get_main_instruction |
43 | jne no_data_label |
63 | push esi ecx |
44 | push esi ecx |
64 | lea esi,[esi+ecx+2] |
45 | lea esi,[esi+ecx+2] |
65 | movzx ecx,byte [esi-1] |
46 | movzx ecx,byte [esi-1] |
66 | mov edi,data_directives |
47 | call get_data_directive |
67 | call get_symbol |
48 | jnc data_label |
68 | jnc data_label |
- | |
69 | pop ecx esi |
49 | pop ecx esi |
70 | get_main_instruction: |
50 | no_data_label: |
71 | call get_instruction |
51 | call get_data_directive |
72 | jnc parse_instruction |
- | |
73 | mov edi,data_directives |
- | |
74 | call get_symbol |
52 | jnc main_instruction_identified |
75 | jnc data_instruction |
- | |
76 | mov edi,symbols |
53 | pop edi |
77 | call get_symbol |
- | |
78 | pop edi |
- | |
79 | jc unknown_instruction |
54 | sub esi,2 |
80 | stos word [edi] |
- | |
81 | jmp parse_arguments |
- | |
82 | data_instruction: |
- | |
83 | movzx ebx,ah |
- | |
84 | mov bx,[data_handlers+ebx*2] |
- | |
85 | jmp parse_instruction |
- | |
86 | unknown_instruction: |
- | |
87 | sub esi,2 |
- | |
88 | jmp parse_arguments |
55 | xor bx,bx |
- | 56 | call parse_line_contents |
|
- | 57 | jmp parse_next_line |
|
89 | constant_label: |
58 | simple_label: |
- | 59 | pop edi |
|
- | 60 | call identify_label |
|
- | 61 | mov byte [edi],2 |
|
- | 62 | inc edi |
|
- | 63 | stos dword [edi] |
|
- | 64 | inc esi |
|
- | 65 | xor al,al |
|
- | 66 | stos byte [edi] |
|
- | 67 | jmp parse_line |
|
- | 68 | constant_label: |
|
90 | pop edi |
69 | pop edi |
91 | call get_label_id |
70 | call get_label_id |
92 | mov byte [edi],3 |
71 | mov byte [edi],3 |
93 | inc edi |
72 | inc edi |
94 | stos dword [edi] |
73 | stos dword [edi] |
95 | xor al,al |
74 | xor al,al |
96 | stos byte [edi] |
75 | stos byte [edi] |
97 | inc esi |
76 | inc esi |
98 | jmp parse_arguments |
77 | xor bx,bx |
- | 78 | call parse_line_contents |
|
- | 79 | jmp parse_next_line |
|
99 | data_label: |
80 | data_label: |
100 | pop ecx ebx |
81 | pop ecx edx |
101 | pop edi |
82 | pop edi |
102 | push eax esi |
83 | push eax ebx esi |
103 | mov esi,ebx |
84 | mov esi,edx |
104 | movzx ecx,byte [esi-1] |
85 | movzx ecx,byte [esi-1] |
105 | call identify_label |
86 | call identify_label |
106 | mov byte [edi],2 |
87 | mov byte [edi],2 |
107 | inc edi |
88 | inc edi |
108 | stos dword [edi] |
89 | stos dword [edi] |
109 | pop esi eax |
90 | pop esi ebx eax |
110 | stos byte [edi] |
91 | stos byte [edi] |
111 | push edi |
92 | push edi |
112 | jmp data_instruction |
93 | main_instruction_identified: |
113 | simple_label: |
94 | pop edi |
114 | pop edi |
- | |
115 | call identify_label |
95 | mov dl,al |
- | 96 | mov al,1 |
|
- | 97 | stos byte [edi] |
|
- | 98 | mov ax,bx |
|
- | 99 | stos word [edi] |
|
- | 100 | mov al,dl |
|
116 | mov byte [edi],2 |
101 | stos byte [edi] |
117 | inc edi |
102 | cmp bx,if_directive-assembler |
- | 103 | je parse_block |
|
- | 104 | cmp bx,repeat_directive-assembler |
|
- | 105 | je parse_block |
|
- | 106 | cmp bx,while_directive-assembler |
|
- | 107 | je parse_block |
|
- | 108 | cmp bx,end_directive-assembler |
|
- | 109 | je parse_end_directive |
|
- | 110 | cmp bx,else_directive-assembler |
|
- | 111 | je parse_else |
|
- | 112 | common_parse: |
|
- | 113 | call parse_line_contents |
|
- | 114 | jmp parse_next_line |
|
- | 115 | empty_instruction: |
|
- | 116 | lods byte [esi] |
|
- | 117 | or al,al |
|
- | 118 | jz parse_next_line |
|
- | 119 | cmp al,':' |
|
- | 120 | je invalid_name |
|
- | 121 | cmp al,3Bh |
|
- | 122 | je skip_preprocessed_symbol |
|
- | 123 | dec esi |
|
- | 124 | call parse_argument |
|
- | 125 | jmp parse_next_line |
|
- | 126 | skip_preprocessed_symbol: |
|
- | 127 | lods byte [esi] |
|
- | 128 | movzx eax,al |
|
- | 129 | add esi,eax |
|
- | 130 | skip_next: |
|
118 | stos dword [edi] |
131 | lods byte [esi] |
- | 132 | or al,al |
|
- | 133 | jz parse_next_line |
|
- | 134 | cmp al,1Ah |
|
- | 135 | je skip_preprocessed_symbol |
|
- | 136 | cmp al,3Bh |
|
- | 137 | je skip_preprocessed_symbol |
|
- | 138 | cmp al,22h |
|
- | 139 | je skip_preprocessed_string |
|
- | 140 | jmp skip_next |
|
- | 141 | skip_preprocessed_string: |
|
- | 142 | lods dword [esi] |
|
119 | inc esi |
143 | add esi,eax |
- | 144 | jmp skip_next |
|
- | 145 | empty_line: |
|
120 | xor al,al |
146 | add esi,17 |
- | 147 | parse_next_line: |
|
- | 148 | cmp esi,[source_start] |
|
- | 149 | jb parser_loop |
|
- | 150 | source_parsed: |
|
- | 151 | cmp [blocks_stack],0 |
|
- | 152 | je blocks_stack_ok |
|
- | 153 | pop eax |
|
- | 154 | pop [current_line] |
|
- | 155 | jmp missing_end_directive |
|
- | 156 | blocks_stack_ok: |
|
- | 157 | xor al,al |
|
121 | stos byte [edi] |
158 | stos byte [edi] |
122 | jmp instruction_start |
159 | mov eax,[error_line] |
123 | identify_label: |
- | |
124 | cmp byte [esi],'.' |
160 | mov [current_line],eax |
125 | je local_label_name |
- | |
126 | call get_label_id |
- | |
127 | cmp eax,10h |
- | |
128 | jb label_identified |
- | |
129 | or ebx,ebx |
- | |
130 | jz anonymous_label_name |
- | |
131 | dec ebx |
- | |
132 | mov [current_locals_prefix],ebx |
- | |
133 | label_identified: |
161 | cmp [anonymous_forward],0 |
134 | ret |
162 | jne invalid_value |
135 | anonymous_label_name: |
- | |
136 | cmp byte [esi-1],'@' |
163 | add edi,0Fh |
137 | je anonymous_label_name_ok |
164 | and edi,not 0Fh |
138 | mov eax,0Fh |
- | |
139 | anonymous_label_name_ok: |
- | |
140 | ret |
165 | mov [code_start],edi |
141 | local_label_name: |
- | |
142 | call get_label_id |
166 | ret |
143 | ret |
- | |
144 | parse_label_directive: |
167 | parse_block: |
- | 168 | mov eax,esp |
|
- | 169 | sub eax,100h |
|
- | 170 | jc stack_overflow |
|
- | 171 | cmp eax,[stack_limit] |
|
- | 172 | jb stack_overflow |
|
- | 173 | push [current_line] |
|
- | 174 | mov ax,bx |
|
- | 175 | shl eax,16 |
|
- | 176 | push eax |
|
- | 177 | inc [blocks_stack] |
|
- | 178 | cmp bx,if_directive-assembler |
|
- | 179 | je parse_if |
|
- | 180 | cmp bx,while_directive-assembler |
|
- | 181 | je parse_while |
|
- | 182 | call parse_line_contents |
|
- | 183 | jmp parse_next_line |
|
- | 184 | parse_end_directive: |
|
145 | cmp byte [esi],1Ah |
185 | cmp byte [esi],1Ah |
146 | jne argument_parsed |
186 | jne common_parse |
147 | inc esi |
187 | push edi |
- | 188 | inc esi |
|
148 | movzx ecx,byte [esi] |
189 | movzx ecx,byte [esi] |
149 | inc esi |
190 | inc esi |
150 | mov al,2 |
191 | call get_instruction |
- | 192 | pop edi |
|
- | 193 | jnc parse_end_block |
|
- | 194 | sub esi,2 |
|
- | 195 | jmp common_parse |
|
- | 196 | parse_end_block: |
|
- | 197 | mov dl,al |
|
- | 198 | mov al,1 |
|
151 | stos byte [edi] |
199 | stos byte [edi] |
152 | call identify_label |
200 | mov ax,bx |
153 | stos dword [edi] |
201 | stos word [edi] |
154 | xor al,al |
202 | mov al,dl |
155 | stos byte [edi] |
203 | stos byte [edi] |
156 | jmp argument_parsed |
204 | lods byte [esi] |
- | 205 | or al,al |
|
- | 206 | jnz extra_characters_on_line |
|
- | 207 | cmp bx,if_directive-assembler |
|
- | 208 | je close_parsing_block |
|
- | 209 | cmp bx,repeat_directive-assembler |
|
- | 210 | je close_parsing_block |
|
- | 211 | cmp bx,while_directive-assembler |
|
- | 212 | je close_parsing_block |
|
- | 213 | jmp parse_next_line |
|
157 | parse_load_directive: |
214 | close_parsing_block: |
158 | cmp byte [esi],1Ah |
215 | cmp [blocks_stack],0 |
- | 216 | je unexpected_instruction |
|
- | 217 | cmp bx,[esp+2] |
|
159 | jne argument_parsed |
218 | jne unexpected_instruction |
- | 219 | dec [blocks_stack] |
|
- | 220 | pop eax edx |
|
160 | inc esi |
221 | cmp bx,if_directive-assembler |
- | 222 | jne parse_next_line |
|
- | 223 | test al,1100b |
|
161 | movzx ecx,byte [esi] |
224 | jz parse_next_line |
- | 225 | test al,10000b |
|
- | 226 | jnz parse_next_line |
|
- | 227 | sub edi,8 |
|
162 | inc esi |
228 | jmp parse_next_line |
- | 229 | parse_if: |
|
163 | mov al,2 |
230 | push edi |
- | 231 | call parse_line_contents |
|
- | 232 | xor al,al |
|
164 | stos byte [edi] |
233 | stos byte [edi] |
165 | call get_label_id |
234 | xchg esi,[esp] |
- | 235 | mov edi,esi |
|
- | 236 | call preevaluate_logical_expression |
|
- | 237 | pop esi |
|
- | 238 | cmp al,'0' |
|
- | 239 | je parse_false_condition_block |
|
- | 240 | cmp al,'1' |
|
- | 241 | je parse_true_condition_block |
|
- | 242 | or byte [esp],10000b |
|
- | 243 | jmp parse_next_line |
|
- | 244 | parse_while: |
|
166 | stos dword [edi] |
245 | push edi |
167 | xor al,al |
246 | call parse_line_contents |
- | 247 | xor al,al |
|
168 | stos byte [edi] |
248 | stos byte [edi] |
169 | jmp argument_parsed |
249 | xchg esi,[esp] |
- | 250 | mov edi,esi |
|
- | 251 | call preevaluate_logical_expression |
|
- | 252 | pop esi |
|
- | 253 | cmp al,'0' |
|
- | 254 | je parse_false_condition_block |
|
- | 255 | cmp al,'1' |
|
- | 256 | jne parse_next_line |
|
- | 257 | stos byte [edi] |
|
- | 258 | jmp parse_next_line |
|
- | 259 | parse_false_condition_block: |
|
- | 260 | or byte [esp],1 |
|
- | 261 | sub edi,4 |
|
- | 262 | jmp skip_parsing |
|
170 | parse_prefix_instruction: |
263 | parse_true_condition_block: |
171 | cmp byte [esi],1Ah |
264 | or byte [esp],100b |
172 | jne parse_arguments |
265 | sub edi,4 |
- | 266 | jmp parse_next_line |
|
- | 267 | parse_else: |
|
173 | push edi |
268 | cmp [blocks_stack],0 |
- | 269 | je unexpected_instruction |
|
- | 270 | cmp word [esp+2],if_directive-assembler |
|
- | 271 | jne unexpected_instruction |
|
- | 272 | lods byte [esi] |
|
- | 273 | or al,al |
|
- | 274 | jz parse_pure_else |
|
- | 275 | cmp al,1Ah |
|
- | 276 | jne extra_characters_on_line |
|
- | 277 | push edi |
|
174 | inc esi |
278 | movzx ecx,byte [esi] |
175 | movzx ecx,byte [esi] |
- | |
176 | inc esi |
279 | inc esi |
177 | jmp get_main_instruction |
280 | call get_instruction |
178 | parse_instruction: |
281 | jc extra_characters_on_line |
179 | pop edi |
282 | pop edi |
180 | mov dl,al |
283 | cmp bx,if_directive-assembler |
- | 284 | jne extra_characters_on_line |
|
- | 285 | test byte [esp],100b |
|
- | 286 | jnz skip_true_condition_else |
|
- | 287 | mov dl,al |
|
181 | mov al,1 |
288 | mov al,1 |
182 | stos byte [edi] |
289 | stos byte [edi] |
183 | mov ax,bx |
290 | mov ax,bx |
184 | stos word [edi] |
291 | stos word [edi] |
185 | mov al,dl |
292 | mov al,dl |
186 | stos byte [edi] |
293 | stos byte [edi] |
187 | cmp bx,prefix_instruction-assembler |
294 | jmp parse_if |
- | 295 | skip_true_condition_else: |
|
- | 296 | sub edi,4 |
|
- | 297 | or byte [esp],1 |
|
- | 298 | jmp skip_parsing_contents |
|
- | 299 | parse_pure_else: |
|
- | 300 | bts dword [esp],1 |
|
- | 301 | jc unexpected_instruction |
|
- | 302 | test byte [esp],100b |
|
- | 303 | jz parse_next_line |
|
- | 304 | sub edi,4 |
|
- | 305 | or byte [esp],1 |
|
- | 306 | jmp skip_parsing |
|
- | 307 | skip_parsing: |
|
- | 308 | cmp esi,[source_start] |
|
- | 309 | jae source_parsed |
|
- | 310 | mov [current_line],esi |
|
- | 311 | add esi,16 |
|
- | 312 | skip_parsing_line: |
|
- | 313 | cmp byte [esi],1Ah |
|
- | 314 | jne skip_parsing_contents |
|
- | 315 | inc esi |
|
- | 316 | movzx ecx,byte [esi] |
|
- | 317 | inc esi |
|
- | 318 | cmp byte [esi+ecx],':' |
|
- | 319 | je skip_parsing_label |
|
- | 320 | push edi |
|
- | 321 | call get_instruction |
|
- | 322 | pop edi |
|
- | 323 | jnc skip_parsing_instruction |
|
- | 324 | add esi,ecx |
|
- | 325 | jmp skip_parsing_contents |
|
- | 326 | skip_parsing_label: |
|
- | 327 | lea esi,[esi+ecx+1] |
|
- | 328 | jmp skip_parsing_line |
|
- | 329 | skip_parsing_instruction: |
|
- | 330 | cmp bx,if_directive-assembler |
|
- | 331 | je skip_parsing_block |
|
- | 332 | cmp bx,repeat_directive-assembler |
|
- | 333 | je skip_parsing_block |
|
- | 334 | cmp bx,while_directive-assembler |
|
- | 335 | je skip_parsing_block |
|
- | 336 | cmp bx,end_directive-assembler |
|
- | 337 | je skip_parsing_end_directive |
|
- | 338 | cmp bx,else_directive-assembler |
|
- | 339 | je skip_parsing_else |
|
- | 340 | skip_parsing_contents: |
|
- | 341 | lods byte [esi] |
|
- | 342 | or al,al |
|
- | 343 | jz skip_parsing |
|
- | 344 | cmp al,1Ah |
|
- | 345 | je skip_parsing_symbol |
|
- | 346 | cmp al,3Bh |
|
- | 347 | je skip_parsing_symbol |
|
- | 348 | cmp al,22h |
|
- | 349 | je skip_parsing_string |
|
- | 350 | jmp skip_parsing_contents |
|
- | 351 | skip_parsing_symbol: |
|
- | 352 | lods byte [esi] |
|
- | 353 | movzx eax,al |
|
- | 354 | add esi,eax |
|
- | 355 | jmp skip_parsing_contents |
|
- | 356 | skip_parsing_string: |
|
- | 357 | lods dword [esi] |
|
- | 358 | add esi,eax |
|
- | 359 | jmp skip_parsing_contents |
|
- | 360 | skip_parsing_block: |
|
- | 361 | mov eax,esp |
|
- | 362 | sub eax,100h |
|
- | 363 | jc stack_overflow |
|
- | 364 | cmp eax,[stack_limit] |
|
- | 365 | jb stack_overflow |
|
- | 366 | push [current_line] |
|
- | 367 | mov ax,bx |
|
- | 368 | shl eax,16 |
|
- | 369 | push eax |
|
- | 370 | inc [blocks_stack] |
|
- | 371 | jmp skip_parsing_contents |
|
- | 372 | skip_parsing_end_directive: |
|
- | 373 | cmp byte [esi],1Ah |
|
- | 374 | jne skip_parsing_contents |
|
- | 375 | push edi |
|
- | 376 | inc esi |
|
- | 377 | movzx ecx,byte [esi] |
|
- | 378 | inc esi |
|
- | 379 | call get_instruction |
|
- | 380 | pop edi |
|
- | 381 | jnc skip_parsing_end_block |
|
- | 382 | add esi,ecx |
|
- | 383 | jmp skip_parsing_contents |
|
- | 384 | skip_parsing_end_block: |
|
- | 385 | lods byte [esi] |
|
- | 386 | or al,al |
|
- | 387 | jnz extra_characters_on_line |
|
- | 388 | cmp bx,if_directive-assembler |
|
- | 389 | je close_skip_parsing_block |
|
- | 390 | cmp bx,repeat_directive-assembler |
|
- | 391 | je close_skip_parsing_block |
|
- | 392 | cmp bx,while_directive-assembler |
|
- | 393 | je close_skip_parsing_block |
|
- | 394 | jmp skip_parsing |
|
- | 395 | close_skip_parsing_block: |
|
- | 396 | cmp [blocks_stack],0 |
|
- | 397 | je unexpected_instruction |
|
- | 398 | cmp bx,[esp+2] |
|
- | 399 | jne unexpected_instruction |
|
- | 400 | dec [blocks_stack] |
|
- | 401 | pop eax edx |
|
- | 402 | test al,1 |
|
- | 403 | jz skip_parsing |
|
- | 404 | cmp bx,if_directive-assembler |
|
- | 405 | jne parse_next_line |
|
- | 406 | test al,10000b |
|
- | 407 | jz parse_next_line |
|
- | 408 | mov al,0Fh |
|
- | 409 | stos byte [edi] |
|
- | 410 | mov eax,[current_line] |
|
- | 411 | stos dword [edi] |
|
- | 412 | mov eax,1 + (end_directive-assembler) shl 8 |
|
- | 413 | stos dword [edi] |
|
- | 414 | mov eax,1 + (if_directive-assembler) shl 8 |
|
- | 415 | stos dword [edi] |
|
- | 416 | jmp parse_next_line |
|
- | 417 | skip_parsing_else: |
|
- | 418 | cmp [blocks_stack],0 |
|
- | 419 | je unexpected_instruction |
|
- | 420 | cmp word [esp+2],if_directive-assembler |
|
- | 421 | jne unexpected_instruction |
|
- | 422 | lods byte [esi] |
|
- | 423 | or al,al |
|
- | 424 | jz skip_parsing_pure_else |
|
- | 425 | cmp al,1Ah |
|
- | 426 | jne extra_characters_on_line |
|
- | 427 | push edi |
|
- | 428 | movzx ecx,byte [esi] |
|
- | 429 | inc esi |
|
- | 430 | call get_instruction |
|
- | 431 | jc extra_characters_on_line |
|
- | 432 | pop edi |
|
- | 433 | cmp bx,if_directive-assembler |
|
- | 434 | jne extra_characters_on_line |
|
- | 435 | mov al,[esp] |
|
- | 436 | test al,1 |
|
- | 437 | jz skip_parsing_contents |
|
- | 438 | test al,100b |
|
- | 439 | jnz skip_parsing_contents |
|
- | 440 | test al,10000b |
|
- | 441 | jnz parse_else_if |
|
- | 442 | xor al,al |
|
- | 443 | mov [esp],al |
|
- | 444 | mov al,0Fh |
|
- | 445 | stos byte [edi] |
|
- | 446 | mov eax,[current_line] |
|
- | 447 | stos dword [edi] |
|
- | 448 | parse_else_if: |
|
- | 449 | mov eax,1 + (if_directive-assembler) shl 8 |
|
- | 450 | stos dword [edi] |
|
- | 451 | jmp parse_if |
|
- | 452 | skip_parsing_pure_else: |
|
- | 453 | bts dword [esp],1 |
|
- | 454 | jc unexpected_instruction |
|
- | 455 | mov al,[esp] |
|
- | 456 | test al,1 |
|
- | 457 | jz skip_parsing |
|
- | 458 | test al,100b |
|
- | 459 | jnz skip_parsing |
|
- | 460 | and al,not 1 |
|
- | 461 | or al,1000b |
|
- | 462 | mov [esp],al |
|
- | 463 | jmp parse_next_line |
|
- | 464 | ||
- | 465 | parse_line_contents: |
|
- | 466 | mov [parenthesis_stack],0 |
|
- | 467 | parse_instruction_arguments: |
|
- | 468 | cmp bx,prefix_instruction-assembler |
|
188 | je parse_prefix_instruction |
469 | je allow_embedded_instruction |
189 | cmp bx,end_directive-assembler |
470 | cmp bx,times_directive-assembler |
- | 471 | je parse_times_directive |
|
- | 472 | cmp bx,end_directive-assembler |
|
190 | je parse_prefix_instruction |
473 | je allow_embedded_instruction |
191 | cmp bx,label_directive-assembler |
474 | cmp bx,label_directive-assembler |
192 | je parse_label_directive |
475 | je parse_label_directive |
193 | cmp bx,segment_directive-assembler |
476 | cmp bx,segment_directive-assembler |
194 | je parse_label_directive |
477 | je parse_label_directive |
195 | cmp bx,load_directive-assembler |
478 | cmp bx,load_directive-assembler |
196 | je parse_load_directive |
479 | je parse_load_directive |
197 | cmp bx,extrn_directive-assembler |
480 | cmp bx,extrn_directive-assembler |
198 | je parse_extrn_directive |
481 | je parse_extrn_directive |
199 | cmp bx,public_directive-assembler |
482 | cmp bx,public_directive-assembler |
200 | je parse_public_directive |
483 | je parse_public_directive |
201 | parse_arguments: |
484 | parse_argument: |
202 | lods byte [esi] |
485 | lea eax,[edi+100h] |
- | 486 | cmp eax,[labels_list] |
|
- | 487 | jae out_of_memory |
|
- | 488 | lods byte [esi] |
|
203 | cmp al,':' |
489 | cmp al,':' |
204 | je instruction_separator |
490 | je instruction_separator |
205 | cmp al,',' |
491 | cmp al,',' |
206 | je separator |
492 | je separator |
207 | cmp al,'=' |
493 | cmp al,'=' |
Line 218... | Line 504... | ||
218 | je less |
504 | je less |
219 | cmp al,')' |
505 | cmp al,')' |
220 | je close_parenthesis |
506 | je close_parenthesis |
221 | or al,al |
507 | or al,al |
222 | jz line_parsed |
508 | jz contents_parsed |
223 | cmp al,'[' |
509 | cmp al,'[' |
224 | je address_argument |
510 | je address_argument |
225 | cmp al,']' |
511 | cmp al,']' |
226 | je separator |
512 | je separator |
227 | cmp al,'{' |
513 | cmp al,'{' |
228 | je unallowed_character |
514 | je unallowed_character |
Line 242... | Line 528... | ||
242 | jnz operator_argument |
528 | jnz operator_argument |
243 | inc esi |
529 | inc esi |
244 | movzx ecx,byte [esi] |
530 | movzx ecx,byte [esi] |
245 | inc esi |
531 | inc esi |
246 | mov edi,symbols |
532 | call get_symbol |
247 | call get_symbol |
- | |
248 | jnc symbol_argument |
- | |
249 | mov edi,formatter_symbols |
- | |
250 | call get_symbol |
- | |
251 | jnc symbol_argument |
533 | jnc symbol_argument |
252 | cmp ecx,1 |
534 | cmp ecx,1 |
253 | jne check_argument |
535 | jne check_argument |
254 | cmp byte [esi],'?' |
536 | cmp byte [esi],'?' |
255 | jne check_argument |
537 | jne check_argument |
Line 273... | Line 555... | ||
273 | je parse_from_operator |
555 | je parse_from_operator |
274 | cmp al,89h |
556 | cmp al,89h |
275 | je parse_label_operator |
557 | je parse_label_operator |
276 | jmp argument_parsed |
558 | jmp argument_parsed |
277 | parse_public_directive: |
559 | allow_embedded_instruction: |
- | 560 | cmp byte [esi],1Ah |
|
- | 561 | jne parse_argument |
|
- | 562 | push edi |
|
- | 563 | inc esi |
|
- | 564 | movzx ecx,byte [esi] |
|
- | 565 | inc esi |
|
- | 566 | call get_instruction |
|
- | 567 | jnc embedded_instruction |
|
- | 568 | call get_data_directive |
|
- | 569 | jnc embedded_instruction |
|
- | 570 | pop edi |
|
- | 571 | sub esi,2 |
|
- | 572 | jmp parse_argument |
|
- | 573 | embedded_instruction: |
|
- | 574 | pop edi |
|
- | 575 | mov dl,al |
|
- | 576 | mov al,1 |
|
- | 577 | stos byte [edi] |
|
- | 578 | mov ax,bx |
|
- | 579 | stos word [edi] |
|
- | 580 | mov al,dl |
|
- | 581 | stos byte [edi] |
|
- | 582 | jmp parse_instruction_arguments |
|
- | 583 | parse_times_directive: |
|
- | 584 | mov al,'(' |
|
- | 585 | stos byte [edi] |
|
- | 586 | call convert_expression |
|
- | 587 | mov al,')' |
|
- | 588 | stos byte [edi] |
|
- | 589 | cmp byte [esi],':' |
|
- | 590 | jne allow_embedded_instruction |
|
- | 591 | movs byte [edi],[esi] |
|
- | 592 | jmp allow_embedded_instruction |
|
- | 593 | parse_label_directive: |
|
- | 594 | cmp byte [esi],1Ah |
|
- | 595 | jne argument_parsed |
|
- | 596 | push esi |
|
- | 597 | inc esi |
|
- | 598 | movzx ecx,byte [esi] |
|
- | 599 | inc esi |
|
- | 600 | call identify_label |
|
- | 601 | pop ebx |
|
- | 602 | cmp eax,0Fh |
|
- | 603 | je non_label_identified |
|
- | 604 | mov byte [edi],2 |
|
- | 605 | inc edi |
|
- | 606 | stos dword [edi] |
|
- | 607 | xor al,al |
|
- | 608 | stos byte [edi] |
|
- | 609 | jmp argument_parsed |
|
- | 610 | non_label_identified: |
|
- | 611 | mov esi,ebx |
|
- | 612 | jmp argument_parsed |
|
- | 613 | parse_load_directive: |
|
- | 614 | cmp byte [esi],1Ah |
|
- | 615 | jne argument_parsed |
|
- | 616 | push esi |
|
- | 617 | inc esi |
|
- | 618 | movzx ecx,byte [esi] |
|
- | 619 | inc esi |
|
- | 620 | call get_label_id |
|
- | 621 | pop ebx |
|
- | 622 | cmp eax,0Fh |
|
- | 623 | je non_label_identified |
|
- | 624 | mov byte [edi],2 |
|
- | 625 | inc edi |
|
- | 626 | stos dword [edi] |
|
- | 627 | xor al,al |
|
- | 628 | stos byte [edi] |
|
- | 629 | jmp argument_parsed |
|
- | 630 | parse_public_directive: |
|
278 | cmp byte [esi],1Ah |
631 | cmp byte [esi],1Ah |
279 | jne parse_arguments |
632 | jne parse_argument |
280 | inc esi |
633 | inc esi |
281 | push esi |
634 | push esi |
282 | movzx ecx,byte [esi] |
635 | movzx ecx,byte [esi] |
283 | inc esi |
636 | inc esi |
284 | mov al,2 |
637 | mov al,2 |
285 | stos byte [edi] |
638 | stos byte [edi] |
Line 310... | Line 663... | ||
310 | parse_extrn_directive: |
663 | parse_extrn_directive: |
311 | cmp byte [esi],22h |
664 | cmp byte [esi],22h |
312 | je parse_quoted_extrn |
665 | je parse_quoted_extrn |
313 | cmp byte [esi],1Ah |
666 | cmp byte [esi],1Ah |
314 | jne parse_arguments |
667 | jne parse_argument |
315 | push esi |
668 | push esi |
316 | movzx ecx,byte [esi+1] |
669 | movzx ecx,byte [esi+1] |
317 | add esi,2 |
670 | add esi,2 |
318 | mov ax,'(' |
671 | mov ax,'(' |
319 | stos word [edi] |
672 | stos word [edi] |
320 | mov eax,ecx |
673 | mov eax,ecx |
Line 371... | Line 724... | ||
371 | pop ecx esi |
724 | pop ecx esi |
372 | or al,al |
725 | or al,al |
373 | jnz not_instruction |
726 | jnz not_instruction |
374 | call get_instruction |
727 | call get_instruction |
375 | jnc parse_instruction |
728 | jnc embedded_instruction |
376 | mov edi,data_directives |
729 | call get_data_directive |
377 | call get_symbol |
730 | jnc embedded_instruction |
378 | jnc data_instruction |
- | |
379 | not_instruction: |
731 | not_instruction: |
380 | pop edi |
732 | pop edi |
381 | sub esi,2 |
733 | sub esi,2 |
382 | expression_argument: |
734 | expression_argument: |
383 | cmp byte [esi],22h |
735 | cmp byte [esi],22h |
384 | jne not_string |
736 | jne not_string |
Line 426... | Line 778... | ||
426 | inc esi |
778 | inc esi |
427 | mov al,'{' |
779 | mov al,'{' |
428 | stos byte [edi] |
780 | stos byte [edi] |
429 | inc [parenthesis_stack] |
781 | inc [parenthesis_stack] |
430 | jmp parse_arguments |
782 | jmp parse_argument |
431 | expression: |
783 | expression: |
432 | mov al,'(' |
784 | mov al,'(' |
433 | stos byte [edi] |
785 | stos byte [edi] |
434 | call convert_expression |
786 | call convert_expression |
435 | mov al,')' |
787 | mov al,')' |
436 | stos byte [edi] |
788 | stos byte [edi] |
Line 445... | Line 797... | ||
445 | address_argument: |
797 | address_argument: |
446 | call parse_address |
798 | call parse_address |
447 | lods byte [esi] |
799 | lods byte [esi] |
448 | cmp al,']' |
800 | cmp al,']' |
449 | jne invalid_address |
801 | je address_parsed |
- | 802 | dec esi |
|
450 | address_parsed: |
803 | mov al,')' |
- | 804 | stos byte [edi] |
|
- | 805 | jmp argument_parsed |
|
- | 806 | address_parsed: |
|
451 | mov al,']' |
807 | mov al,']' |
452 | stos byte [edi] |
808 | stos byte [edi] |
453 | jmp argument_parsed |
809 | jmp argument_parsed |
454 | parse_address: |
810 | parse_address: |
455 | mov al,'[' |
811 | mov al,'[' |
Line 464... | Line 820... | ||
464 | jne convert_address |
820 | jne convert_address |
465 | add esi,2 |
821 | add esi,2 |
466 | mov ecx,2 |
822 | mov ecx,2 |
467 | push ebx edi |
823 | push ebx edi |
468 | mov edi,symbols |
824 | call get_symbol |
469 | call get_symbol |
- | |
470 | pop edi esi |
825 | pop edi esi |
471 | jc invalid_address |
826 | jc unknown_segment_prefix |
472 | cmp al,10h |
827 | cmp al,10h |
473 | jne invalid_address |
828 | jne unknown_segment_prefix |
474 | mov al,ah |
829 | mov al,ah |
475 | and ah,11110000b |
830 | and ah,11110000b |
476 | cmp ah,60h |
831 | cmp ah,60h |
477 | jne invalid_address |
832 | jne unknown_segment_prefix |
478 | stos byte [edi] |
833 | stos byte [edi] |
479 | convert_address: |
834 | jmp convert_address |
- | 835 | unknown_segment_prefix: |
|
- | 836 | sub esi,5 |
|
- | 837 | convert_address: |
|
480 | cmp byte [esi],1Ah |
838 | push edi |
481 | jne convert_expression |
- | |
482 | push esi |
- | |
483 | lods word [esi] |
- | |
484 | movzx ecx,ah |
- | |
485 | push edi |
- | |
486 | mov edi,address_sizes |
839 | mov edi,address_sizes |
487 | call get_symbol |
840 | call get_operator |
488 | pop edi |
841 | pop edi |
489 | jc no_size_prefix |
842 | or al,al |
490 | mov al,ah |
843 | jz convert_expression |
491 | add al,70h |
844 | add al,70h |
492 | stos byte [edi] |
845 | stos byte [edi] |
493 | add esp,4 |
846 | jmp convert_expression |
494 | jmp convert_expression |
- | |
495 | no_size_prefix: |
- | |
496 | pop esi |
- | |
497 | jmp convert_expression |
- | |
498 | forced_parenthesis: |
847 | forced_parenthesis: |
499 | cmp byte [esi],'(' |
848 | cmp byte [esi],'(' |
500 | jne argument_parsed |
849 | jne argument_parsed |
501 | inc esi |
850 | inc esi |
502 | mov al,'{' |
851 | mov al,'{' |
Line 510... | Line 859... | ||
510 | stos byte [edi] |
859 | stos byte [edi] |
511 | jmp argument_parsed |
860 | jmp argument_parsed |
512 | instruction_separator: |
861 | instruction_separator: |
513 | stos byte [edi] |
862 | stos byte [edi] |
514 | jmp instruction_start |
863 | jmp allow_embedded_instruction |
515 | greater: |
864 | greater: |
516 | cmp byte [esi],'=' |
865 | cmp byte [esi],'=' |
517 | jne separator |
866 | jne separator |
518 | inc esi |
867 | inc esi |
519 | mov al,0F2h |
868 | mov al,0F2h |
520 | jmp separator |
869 | jmp separator |
Line 533... | Line 882... | ||
533 | mov al,0F1h |
882 | mov al,0F1h |
534 | jmp separator |
883 | jmp separator |
535 | argument_parsed: |
884 | argument_parsed: |
536 | cmp [parenthesis_stack],0 |
885 | cmp [parenthesis_stack],0 |
537 | je parse_arguments |
886 | je parse_argument |
538 | dec [parenthesis_stack] |
887 | dec [parenthesis_stack] |
539 | add esp,8 |
888 | add esp,8 |
540 | jmp argument_parsed |
889 | jmp argument_parsed |
541 | expression_parsed: |
890 | expression_parsed: |
542 | cmp [parenthesis_stack],0 |
891 | cmp [parenthesis_stack],0 |
543 | je parse_arguments |
892 | je parse_argument |
544 | cmp byte [esi],')' |
893 | cmp byte [esi],')' |
545 | jne argument_parsed |
894 | jne argument_parsed |
546 | dec [parenthesis_stack] |
895 | dec [parenthesis_stack] |
547 | pop edi esi |
896 | pop edi esi |
548 | jmp expression |
897 | jmp expression |
549 | empty_instruction: |
898 | contents_parsed: |
550 | lods byte [esi] |
- | |
551 | or al,al |
- | |
552 | jz line_parsed |
- | |
553 | cmp al,':' |
- | |
554 | je invalid_name |
- | |
555 | cmp al,3Bh |
- | |
556 | je skip_preprocessed_symbol |
- | |
557 | dec esi |
- | |
558 | jmp parse_arguments |
- | |
559 | skip_preprocessed_symbol: |
- | |
560 | lods byte [esi] |
- | |
561 | movzx eax,al |
- | |
562 | add esi,eax |
- | |
563 | skip_next: |
- | |
564 | lods byte [esi] |
- | |
565 | or al,al |
- | |
566 | jz line_parsed |
- | |
567 | cmp al,1Ah |
- | |
568 | je skip_preprocessed_symbol |
- | |
569 | cmp al,3Bh |
- | |
570 | je skip_preprocessed_symbol |
- | |
571 | cmp al,22h |
- | |
572 | je skip_preprocessed_string |
- | |
573 | jmp skip_next |
- | |
574 | skip_preprocessed_string: |
- | |
575 | lods dword [esi] |
- | |
576 | add esi,eax |
- | |
577 | jmp skip_next |
- | |
578 | line_parsed: |
- | |
579 | cmp [parenthesis_stack],0 |
899 | cmp [parenthesis_stack],0 |
580 | jne invalid_expression |
900 | jne invalid_expression |
581 | ret |
901 | ret |
582 | 902 | ||
Line -... | Line 903... | ||
- | 903 | identify_label: |
|
- | 904 | cmp byte [esi],'.' |
|
- | 905 | je local_label_name |
|
- | 906 | call get_label_id |
|
- | 907 | cmp eax,10h |
|
- | 908 | jb label_identified |
|
- | 909 | or ebx,ebx |
|
- | 910 | jz anonymous_label_name |
|
- | 911 | dec ebx |
|
- | 912 | mov [current_locals_prefix],ebx |
|
- | 913 | label_identified: |
|
- | 914 | ret |
|
- | 915 | anonymous_label_name: |
|
- | 916 | cmp byte [esi-1],'@' |
|
- | 917 | je anonymous_label_name_ok |
|
- | 918 | mov eax,0Fh |
|
- | 919 | anonymous_label_name_ok: |
|
- | 920 | ret |
|
- | 921 | local_label_name: |
|
- | 922 | call get_label_id |
|
- | 923 | ret |
|
- | 924 | ||
583 | get_operator: |
925 | get_operator: |
584 | cmp byte [esi],1Ah |
926 | cmp byte [esi],1Ah |
585 | jne get_simple_operator |
927 | jne get_simple_operator |
586 | mov edx,esi |
928 | mov edx,esi |
587 | push ebp |
929 | push ebp |
Line 638... | Line 980... | ||
638 | inc esi |
980 | inc esi |
639 | mov al,[edi+2] |
981 | mov al,[edi+2] |
640 | ret |
982 | ret |
641 | 983 | ||
Line 642... | Line -... | ||
642 | - | ||
643 | get_symbol: |
984 | get_symbol: |
644 | mov edx,esi |
985 | push esi |
645 | mov ebp,ecx |
986 | mov ebp,ecx |
646 | push edi |
- | |
647 | call lower_case |
987 | call lower_case |
648 | pop edi |
988 | mov ecx,ebp |
- | 989 | cmp cl,11 |
|
- | 990 | ja no_symbol |
|
- | 991 | sub cl,2 |
|
- | 992 | jc no_symbol |
|
- | 993 | movzx ebx,word [symbols+ecx*4] |
|
- | 994 | add ebx,symbols |
|
- | 995 | movzx edx,word [symbols+ecx*4+2] |
|
649 | scan_symbols: |
996 | scan_symbols: |
650 | mov esi,converted |
- | |
651 | movzx eax,byte [edi] |
997 | or edx,edx |
652 | or al,al |
- | |
653 | jz no_symbol |
998 | jz no_symbol |
- | 999 | mov eax,edx |
|
- | 1000 | shr eax,1 |
|
- | 1001 | lea edi,[ebp+2] |
|
- | 1002 | imul eax,edi |
|
- | 1003 | lea edi,[ebx+eax] |
|
- | 1004 | mov esi,converted |
|
654 | mov ecx,ebp |
1005 | mov ecx,ebp |
655 | inc edi |
- | |
656 | mov ebx,edi |
- | |
657 | add ebx,eax |
- | |
658 | mov ah,[esi] |
- | |
659 | cmp ah,[edi] |
- | |
660 | jb no_symbol |
- | |
661 | ja next_symbol |
- | |
662 | cmp cl,al |
- | |
663 | jne next_symbol |
- | |
664 | repe cmps byte [esi],[edi] |
1006 | repe cmps byte [esi],[edi] |
665 | jb no_symbol |
1007 | ja symbols_up |
666 | je symbol_ok |
1008 | jb symbols_down |
667 | next_symbol: |
1009 | pop esi |
668 | mov edi,ebx |
1010 | add esi,ebp |
- | 1011 | mov ax,[edi] |
|
669 | add edi,2 |
1012 | clc |
670 | jmp scan_symbols |
1013 | ret |
671 | no_symbol: |
1014 | no_symbol: |
672 | mov esi,edx |
1015 | pop esi |
673 | mov ecx,ebp |
1016 | mov ecx,ebp |
674 | stc |
1017 | stc |
675 | ret |
1018 | ret |
- | 1019 | symbols_down: |
|
- | 1020 | shr edx,1 |
|
- | 1021 | jmp scan_symbols |
|
676 | symbol_ok: |
1022 | symbols_up: |
677 | lea esi,[edx+ebp] |
1023 | lea ebx,[edi+ecx+2] |
- | 1024 | shr edx,1 |
|
678 | mov ax,[ebx] |
1025 | adc edx,-1 |
- | 1026 | jmp scan_symbols |
|
679 | clc |
1027 | |
680 | ret |
1028 | get_data_directive: |
- | 1029 | push esi |
|
- | 1030 | mov ebp,ecx |
|
- | 1031 | call lower_case |
|
- | 1032 | mov ecx,ebp |
|
- | 1033 | cmp cl,4 |
|
- | 1034 | ja no_instruction |
|
- | 1035 | sub cl,2 |
|
- | 1036 | jc no_instruction |
|
- | 1037 | movzx ebx,word [data_directives+ecx*4] |
|
- | 1038 | add ebx,data_directives |
|
- | 1039 | movzx edx,word [data_directives+ecx*4+2] |
|
- | 1040 | jmp scan_instructions |
|
Line 681... | Line 1041... | ||
681 | 1041 | ||
682 | get_instruction: |
1042 | get_instruction: |
683 | mov edx,esi |
1043 | push esi |
684 | mov ebp,ecx |
1044 | mov ebp,ecx |
685 | call lower_case |
1045 | call lower_case |
686 | mov ecx,ebp |
1046 | mov ecx,ebp |
687 | cmp cl,11 |
1047 | cmp cl,11 |
688 | ja no_instruction |
1048 | ja no_instruction |
689 | sub cl,2 |
1049 | sub cl,2 |
690 | jc no_instruction |
1050 | jc no_instruction |
691 | movzx edi,word [instructions+ecx*2] |
1051 | movzx ebx,word [instructions+ecx*4] |
- | 1052 | add ebx,instructions |
|
692 | add edi,instructions |
1053 | movzx edx,word [instructions+ecx*4+2] |
693 | scan_instructions: |
1054 | scan_instructions: |
694 | mov esi,converted |
- | |
695 | mov al,[edi] |
- | |
696 | or al,al |
1055 | or edx,edx |
- | 1056 | jz no_instruction |
|
- | 1057 | mov eax,edx |
|
- | 1058 | shr eax,1 |
|
- | 1059 | lea edi,[ebp+3] |
|
- | 1060 | imul eax,edi |
|
- | 1061 | lea edi,[ebx+eax] |
|
697 | jz no_instruction |
1062 | mov esi,converted |
698 | mov ecx,ebp |
- | |
699 | mov ebx,edi |
- | |
700 | add ebx,ecx |
1063 | mov ecx,ebp |
701 | repe cmps byte [esi],[edi] |
1064 | repe cmps byte [esi],[edi] |
702 | jb no_instruction |
1065 | ja instructions_up |
703 | je instruction_ok |
1066 | jb instructions_down |
704 | next_instruction: |
1067 | pop esi |
- | 1068 | add esi,ebp |
|
- | 1069 | mov al,[edi] |
|
705 | mov edi,ebx |
1070 | mov bx,[edi+1] |
706 | add edi,3 |
1071 | clc |
707 | jmp scan_instructions |
1072 | ret |
708 | no_instruction: |
1073 | no_instruction: |
709 | mov esi,edx |
1074 | pop esi |
710 | mov ecx,ebp |
1075 | mov ecx,ebp |
711 | stc |
1076 | stc |
712 | ret |
1077 | ret |
713 | lower_case: |
1078 | instructions_down: |
714 | mov edi,converted |
1079 | shr edx,1 |
715 | mov ebx,characters |
1080 | jmp scan_instructions |
716 | convert_case: |
- | |
717 | lods byte [esi] |
1081 | instructions_up: |
718 | xlat byte [ebx] |
1082 | lea ebx,[edi+ecx+3] |
719 | stos byte [edi] |
- | |
720 | loop convert_case |
1083 | shr edx,1 |
721 | case_ok: |
- | |
722 | ret |
1084 | adc edx,-1 |
723 | instruction_ok: |
- | |
724 | lea esi,[edx+ebp] |
- | |
725 | mov al,[ebx] |
- | |
726 | mov bx,[ebx+1] |
- | |
727 | clc |
- | |
Line 728... | Line 1085... | ||
728 | ret |
1085 | jmp scan_instructions |
729 | 1086 | ||
730 | get_label_id: |
1087 | get_label_id: |
731 | cmp ecx,100h |
1088 | cmp ecx,100h |
Line 738... | Line 1095... | ||
738 | je standard_label |
1095 | je standard_label |
739 | cmp [current_locals_prefix],0 |
1096 | cmp [current_locals_prefix],0 |
740 | je standard_label |
1097 | je standard_label |
741 | push edi |
1098 | push edi |
742 | mov edi,[memory_end] |
1099 | mov edi,[additional_memory_end] |
743 | sub edi,2 |
1100 | sub edi,2 |
744 | sub edi,ecx |
1101 | sub edi,ecx |
745 | push ecx esi |
1102 | push ecx esi |
746 | mov esi,[current_locals_prefix] |
1103 | mov esi,[current_locals_prefix] |
747 | lods byte [esi] |
1104 | lods byte [esi] |
748 | movzx ecx,al |
1105 | movzx ecx,al |
749 | sub edi,ecx |
1106 | sub edi,ecx |
750 | cmp edi,[esp+8] |
1107 | cmp edi,[free_additional_memory] |
751 | jb out_of_memory |
1108 | jb out_of_memory |
752 | mov [memory_end],edi |
1109 | mov word [edi],0 |
753 | mov word [edi],0 |
- | |
754 | add edi,2 |
1110 | add edi,2 |
755 | mov ebx,edi |
1111 | mov ebx,edi |
756 | rep movs byte [edi],[esi] |
1112 | rep movs byte [edi],[esi] |
757 | pop esi ecx |
1113 | pop esi ecx |
758 | add al,cl |
1114 | add al,cl |
759 | jc name_too_long |
1115 | jc name_too_long |
760 | rep movs byte [edi],[esi] |
1116 | rep movs byte [edi],[esi] |
761 | pop edi |
1117 | pop edi |
762 | push esi |
1118 | push ebx esi |
763 | movzx ecx,al |
1119 | movzx ecx,al |
764 | mov byte [ebx-1],al |
1120 | mov byte [ebx-1],al |
765 | mov esi,ebx |
1121 | mov esi,ebx |
766 | call get_label_id |
1122 | call get_label_id |
767 | pop esi |
1123 | pop esi ebx |
768 | ret |
1124 | cmp ebx,[eax+24] |
- | 1125 | jne composed_label_id_ok |
|
- | 1126 | lea edx,[ebx-2] |
|
- | 1127 | mov [additional_memory_end],edx |
|
- | 1128 | composed_label_id_ok: |
|
- | 1129 | ret |
|
769 | anonymous_label: |
1130 | anonymous_label: |
770 | cmp ecx,2 |
1131 | cmp ecx,2 |
771 | jne standard_label |
1132 | jne standard_label |
772 | mov al,[esi+1] |
1133 | mov al,[esi+1] |
773 | mov ebx,characters |
1134 | mov ebx,characters |
Line 785... | Line 1146... | ||
785 | or eax,eax |
1146 | or eax,eax |
786 | jnz anonymous_ok |
1147 | jnz anonymous_ok |
787 | mov eax,[current_line] |
1148 | mov eax,[current_line] |
788 | mov [error_line],eax |
1149 | mov [error_line],eax |
789 | mov eax,[labels_list] |
1150 | call allocate_label |
790 | sub eax,24 |
- | |
791 | mov [labels_list],eax |
- | |
792 | mov [anonymous_forward],eax |
1151 | mov [anonymous_forward],eax |
793 | anonymous_ok: |
1152 | anonymous_ok: |
794 | xor ebx,ebx |
1153 | xor ebx,ebx |
795 | ret |
1154 | ret |
796 | anonymous_back: |
1155 | anonymous_back: |
797 | add esi,2 |
1156 | add esi,2 |
Line 803... | Line 1162... | ||
803 | add esi,2 |
1162 | add esi,2 |
804 | mov eax,[anonymous_forward] |
1163 | mov eax,[anonymous_forward] |
805 | or eax,eax |
1164 | or eax,eax |
806 | jnz new_anonymous_ok |
1165 | jnz new_anonymous_ok |
807 | mov eax,[labels_list] |
1166 | call allocate_label |
808 | sub eax,24 |
- | |
809 | mov [labels_list],eax |
- | |
810 | new_anonymous_ok: |
1167 | new_anonymous_ok: |
811 | mov [anonymous_reverse],eax |
1168 | mov [anonymous_reverse],eax |
812 | mov [anonymous_forward],0 |
1169 | mov [anonymous_forward],0 |
813 | jmp anonymous_ok |
1170 | jmp anonymous_ok |
814 | standard_label: |
1171 | standard_label: |
815 | cmp byte [esi],'%' |
1172 | cmp byte [esi],'%' |
Line 889... | Line 1246... | ||
889 | compare_labels: |
1246 | compare_labels: |
890 | mov esi,ebx |
1247 | mov esi,ebx |
891 | mov ecx,edx |
1248 | mov ecx,edx |
892 | mov edi,[eax+4] |
1249 | mov edi,[eax+4] |
893 | repe cmps byte [esi],[edi] |
1250 | mov edi,[edi+24] |
- | 1251 | repe cmps byte [esi],[edi] |
|
894 | je label_found |
1252 | je label_found |
895 | mov eax,[eax] |
1253 | mov eax,[eax] |
896 | or eax,eax |
1254 | or eax,eax |
897 | jnz compare_labels |
1255 | jnz compare_labels |
898 | jmp add_label |
1256 | jmp add_label |
899 | label_found: |
1257 | label_found: |
900 | add esp,4 |
1258 | add esp,4 |
901 | pop edi |
1259 | pop edi |
902 | mov ebx,[eax+4] |
1260 | mov eax,[eax+4] |
903 | mov eax,[eax+8] |
- | |
904 | ret |
1261 | ret |
905 | extend_tree: |
1262 | extend_tree: |
906 | mov edx,[free_additional_memory] |
1263 | mov edx,[free_additional_memory] |
907 | lea eax,[edx+8] |
1264 | lea eax,[edx+8] |
908 | cmp eax,[additional_memory_end] |
1265 | cmp eax,[additional_memory_end] |
909 | ja out_of_memory |
1266 | ja out_of_memory |
Line 936... | Line 1293... | ||
936 | je reserved_word |
1293 | je reserved_word |
937 | check_for_reserved_word: |
1294 | check_for_reserved_word: |
938 | call get_instruction |
1295 | call get_instruction |
939 | jnc reserved_word |
1296 | jnc reserved_word |
940 | mov edi,data_directives |
1297 | call get_data_directive |
941 | call get_symbol |
1298 | jnc reserved_word |
942 | jnc reserved_word |
- | |
943 | mov edi,symbols |
- | |
944 | call get_symbol |
- | |
945 | jnc reserved_word |
- | |
946 | mov edi,formatter_symbols |
1299 | call get_symbol |
947 | call get_symbol |
- | |
948 | jnc reserved_word |
1300 | jnc reserved_word |
949 | sub esi,2 |
1301 | sub esi,2 |
950 | mov edi,operators |
1302 | mov edi,operators |
951 | call get_operator |
1303 | call get_operator |
952 | or al,al |
1304 | or al,al |
Line 963... | Line 1315... | ||
963 | movzx ecx,byte [esi] |
1315 | movzx ecx,byte [esi] |
964 | inc esi |
1316 | inc esi |
965 | label_name_ok: |
1317 | label_name_ok: |
966 | mov edx,[free_additional_memory] |
1318 | mov edx,[free_additional_memory] |
967 | lea eax,[edx+12] |
1319 | lea eax,[edx+8] |
968 | cmp eax,[additional_memory_end] |
1320 | cmp eax,[additional_memory_end] |
969 | ja out_of_memory |
1321 | ja out_of_memory |
970 | mov [free_additional_memory],eax |
1322 | mov [free_additional_memory],eax |
971 | mov [edx+4],esi |
1323 | mov ebx,esi |
972 | mov ebx,esi |
- | |
973 | add esi,ecx |
1324 | add esi,ecx |
974 | mov eax,[label_leaf] |
1325 | mov eax,[label_leaf] |
975 | mov edi,[eax] |
1326 | mov edi,[eax] |
976 | mov [edx],edi |
1327 | mov [edx],edi |
977 | mov [eax],edx |
1328 | mov [eax],edx |
978 | mov eax,[labels_list] |
1329 | call allocate_label |
979 | sub eax,24 |
1330 | mov [edx+4],eax |
980 | mov [labels_list],eax |
- | |
981 | mov [edx+8],eax |
1331 | mov [eax+24],ebx |
982 | pop edi |
1332 | pop edi |
983 | ret |
1333 | ret |
984 | reserved_word: |
1334 | reserved_word: |
985 | mov eax,0Fh |
1335 | mov eax,0Fh |
986 | pop edi |
1336 | pop edi |
987 | ret |
1337 | ret |
988 | 1338 | allocate_label: |
|
- | 1339 | mov eax,[labels_list] |
|
- | 1340 | mov ecx,LABEL_STRUCTURE_SIZE shr 2 |
|
- | 1341 | initialize_label: |
|
- | 1342 | sub eax,4 |
|
- | 1343 | mov dword [eax],0 |
|
- | 1344 | loop initialize_label |
|
- | 1345 | mov [labels_list],eax |
|
- | 1346 | ret |
|
- | 1347 | ||
Line 989... | Line -... | ||
989 | operators: |
- | |
990 | db 1,'+',80h |
- | |
991 | db 1,'-',81h |
- | |
992 | db 1,'*',90h |
- | |
993 | db 1,'/',91h |
- | |
994 | db 3,'mod',0A0h |
- | |
995 | db 3,'and',0B0h |
- | |
996 | db 2,'or',0B1h |
- | |
997 | db 3,'xor',0B2h |
- | |
998 | db 3,'shl',0C0h |
- | |
999 | db 3,'shr',0C1h |
- | |
1000 | db 0 |
- | |
1001 | - | ||
1002 | single_operand_operators: |
1348 | LABEL_STRUCTURE_SIZE = 32' |
1003 | db 1,'+',0 |
- | |
1004 | db 1,'-',0D1h |
- | |
1005 | db 3,'not',0D0h |
- | |
1006 | db 3,'rva',0E0h |
- | |
1007 | db 0 |
- | |
1008 | - | ||
1009 | directive_operators: |
- | |
1010 | db 2,'as',86h |
- | |
1011 | db 2,'at',80h |
- | |
1012 | db 7,'defined',88h |
- | |
1013 | db 3,'dup',81h |
- | |
1014 | db 2,'eq',0F0h |
- | |
1015 | db 6,'eqtype',0F7h |
- | |
1016 | db 4,'from',82h |
- | |
1017 | db 2,'in',0F6h |
- | |
1018 | db 2,'on',84h |
- | |
1019 | db 3,'ptr',85h |
- | |
1020 | db 4,'used',89h |
- | |
1021 | db 0' |
- |