Rev 109 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
31 | halyavin | 1 | |
2 | ; Copyright (c) 1999-2006, Tomasz Grysztar. |
||
109 | heavyiron | 3 | ; All rights reserved. |
31 | halyavin | 4 | |
5 | |||
6 | mov eax,[memory_end] |
||
157 | heavyiron | 7 | mov [labels_list],eax |
8 | mov eax,[additional_memory] |
||
9 | mov [free_additional_memory],eax |
||
10 | xor eax,eax |
||
11 | mov [current_locals_prefix],eax |
||
12 | mov [anonymous_reverse],eax |
||
13 | mov [anonymous_forward],eax |
||
14 | mov [hash_tree],eax |
||
15 | mov [blocks_stack],eax |
||
16 | mov esi,[memory_start] |
||
17 | mov edi,[source_start] |
||
18 | parser_loop: |
||
31 | halyavin | 19 | mov [current_line],esi |
157 | heavyiron | 20 | lea eax,[edi+100h] |
21 | cmp eax,[labels_list] |
||
22 | jae out_of_memory |
||
23 | cmp byte [esi+16],0 |
||
24 | je empty_line |
||
25 | mov al,0Fh |
||
26 | stos byte [edi] |
||
27 | mov eax,esi |
||
28 | stos dword [edi] |
||
29 | add esi,16 |
||
30 | parse_line: |
||
109 | heavyiron | 31 | cmp byte [esi],1Ah |
157 | heavyiron | 32 | jne empty_instruction |
33 | push edi |
||
34 | add esi,2 |
||
35 | movzx ecx,byte [esi-1] |
||
36 | cmp byte [esi+ecx],':' |
||
37 | je simple_label |
||
38 | cmp byte [esi+ecx],'=' |
||
39 | je constant_label |
||
40 | call get_instruction |
||
41 | jnc main_instruction_identified |
||
42 | cmp byte [esi+ecx],1Ah |
||
43 | jne no_data_label |
||
44 | push esi ecx |
||
45 | lea esi,[esi+ecx+2] |
||
46 | movzx ecx,byte [esi-1] |
||
47 | call get_data_directive |
||
48 | jnc data_label |
||
49 | pop ecx esi |
||
50 | no_data_label: |
||
109 | heavyiron | 51 | call get_data_directive |
157 | heavyiron | 52 | jnc main_instruction_identified |
53 | pop edi |
||
54 | sub esi,2 |
||
55 | xor bx,bx |
||
56 | call parse_line_contents |
||
57 | jmp parse_next_line |
||
58 | simple_label: |
||
109 | heavyiron | 59 | pop edi |
157 | heavyiron | 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: |
||
109 | heavyiron | 69 | pop edi |
157 | heavyiron | 70 | call get_label_id |
71 | mov byte [edi],3 |
||
72 | inc edi |
||
73 | stos dword [edi] |
||
74 | xor al,al |
||
75 | stos byte [edi] |
||
76 | inc esi |
||
77 | xor bx,bx |
||
78 | call parse_line_contents |
||
79 | jmp parse_next_line |
||
80 | data_label: |
||
109 | heavyiron | 81 | pop ecx edx |
157 | heavyiron | 82 | pop edi |
83 | push eax ebx esi |
||
84 | mov esi,edx |
||
85 | movzx ecx,byte [esi-1] |
||
86 | call identify_label |
||
87 | mov byte [edi],2 |
||
88 | inc edi |
||
89 | stos dword [edi] |
||
90 | pop esi ebx eax |
||
91 | stos byte [edi] |
||
92 | push edi |
||
93 | main_instruction_identified: |
||
109 | heavyiron | 94 | pop edi |
157 | heavyiron | 95 | mov dl,al |
96 | mov al,1 |
||
97 | stos byte [edi] |
||
98 | mov ax,bx |
||
99 | stos word [edi] |
||
100 | mov al,dl |
||
101 | stos byte [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: |
||
109 | heavyiron | 113 | call parse_line_contents |
157 | heavyiron | 114 | jmp parse_next_line |
115 | empty_instruction: |
||
109 | heavyiron | 116 | lods byte [esi] |
157 | heavyiron | 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: |
||
109 | heavyiron | 127 | lods byte [esi] |
157 | heavyiron | 128 | movzx eax,al |
129 | add esi,eax |
||
130 | skip_next: |
||
109 | heavyiron | 131 | lods byte [esi] |
157 | heavyiron | 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: |
||
109 | heavyiron | 142 | lods dword [esi] |
157 | heavyiron | 143 | add esi,eax |
144 | jmp skip_next |
||
145 | empty_line: |
||
109 | heavyiron | 146 | add esi,17 |
157 | heavyiron | 147 | parse_next_line: |
31 | halyavin | 148 | cmp esi,[source_start] |
157 | heavyiron | 149 | jb parser_loop |
150 | source_parsed: |
||
109 | heavyiron | 151 | cmp [blocks_stack],0 |
157 | heavyiron | 152 | je blocks_stack_ok |
153 | pop eax |
||
154 | pop [current_line] |
||
155 | jmp missing_end_directive |
||
156 | blocks_stack_ok: |
||
109 | heavyiron | 157 | xor al,al |
157 | heavyiron | 158 | stos byte [edi] |
159 | mov eax,[error_line] |
||
160 | mov [current_line],eax |
||
161 | cmp [anonymous_forward],0 |
||
162 | jne invalid_value |
||
163 | add edi,0Fh |
||
164 | and edi,not 0Fh |
||
165 | mov [code_start],edi |
||
166 | ret |
||
167 | parse_block: |
||
109 | heavyiron | 168 | mov eax,esp |
157 | heavyiron | 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: |
||
109 | heavyiron | 185 | cmp byte [esi],1Ah |
157 | heavyiron | 186 | jne common_parse |
187 | push edi |
||
188 | inc esi |
||
189 | movzx ecx,byte [esi] |
||
190 | inc esi |
||
191 | call get_instruction |
||
192 | pop edi |
||
193 | jnc parse_end_block |
||
194 | sub esi,2 |
||
195 | jmp common_parse |
||
196 | parse_end_block: |
||
109 | heavyiron | 197 | mov dl,al |
157 | heavyiron | 198 | mov al,1 |
199 | stos byte [edi] |
||
200 | mov ax,bx |
||
201 | stos word [edi] |
||
202 | mov al,dl |
||
203 | stos byte [edi] |
||
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 |
||
214 | close_parsing_block: |
||
109 | heavyiron | 215 | cmp [blocks_stack],0 |
157 | heavyiron | 216 | je unexpected_instruction |
217 | cmp bx,[esp+2] |
||
218 | jne unexpected_instruction |
||
219 | dec [blocks_stack] |
||
220 | pop eax edx |
||
221 | cmp bx,if_directive-assembler |
||
222 | jne parse_next_line |
||
223 | test al,1100b |
||
224 | jz parse_next_line |
||
225 | test al,10000b |
||
226 | jnz parse_next_line |
||
227 | sub edi,8 |
||
228 | jmp parse_next_line |
||
229 | parse_if: |
||
109 | heavyiron | 230 | push edi |
157 | heavyiron | 231 | call parse_line_contents |
232 | xor al,al |
||
233 | stos byte [edi] |
||
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: |
||
109 | heavyiron | 245 | push edi |
157 | heavyiron | 246 | call parse_line_contents |
247 | xor al,al |
||
248 | stos byte [edi] |
||
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: |
||
109 | heavyiron | 260 | or byte [esp],1 |
157 | heavyiron | 261 | sub edi,4 |
262 | jmp skip_parsing |
||
263 | parse_true_condition_block: |
||
109 | heavyiron | 264 | or byte [esp],100b |
157 | heavyiron | 265 | sub edi,4 |
266 | jmp parse_next_line |
||
267 | parse_else: |
||
109 | heavyiron | 268 | cmp [blocks_stack],0 |
157 | heavyiron | 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 |
||
278 | movzx ecx,byte [esi] |
||
279 | inc esi |
||
280 | call get_instruction |
||
281 | jc extra_characters_on_line |
||
282 | pop edi |
||
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 |
||
288 | mov al,1 |
||
289 | stos byte [edi] |
||
290 | mov ax,bx |
||
291 | stos word [edi] |
||
292 | mov al,dl |
||
293 | stos byte [edi] |
||
294 | jmp parse_if |
||
295 | skip_true_condition_else: |
||
109 | heavyiron | 296 | sub edi,4 |
157 | heavyiron | 297 | or byte [esp],1 |
298 | jmp skip_parsing_contents |
||
299 | parse_pure_else: |
||
109 | heavyiron | 300 | bts dword [esp],1 |
157 | heavyiron | 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: |
||
109 | heavyiron | 308 | cmp esi,[source_start] |
157 | heavyiron | 309 | jae source_parsed |
310 | mov [current_line],esi |
||
311 | add esi,16 |
||
312 | skip_parsing_line: |
||
109 | heavyiron | 313 | cmp byte [esi],1Ah |
157 | heavyiron | 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: |
||
109 | heavyiron | 327 | lea esi,[esi+ecx+1] |
157 | heavyiron | 328 | jmp skip_parsing_line |
329 | skip_parsing_instruction: |
||
109 | heavyiron | 330 | cmp bx,if_directive-assembler |
157 | heavyiron | 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: |
||
109 | heavyiron | 341 | lods byte [esi] |
157 | heavyiron | 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: |
||
109 | heavyiron | 352 | lods byte [esi] |
157 | heavyiron | 353 | movzx eax,al |
354 | add esi,eax |
||
355 | jmp skip_parsing_contents |
||
356 | skip_parsing_string: |
||
109 | heavyiron | 357 | lods dword [esi] |
157 | heavyiron | 358 | add esi,eax |
359 | jmp skip_parsing_contents |
||
360 | skip_parsing_block: |
||
109 | heavyiron | 361 | mov eax,esp |
157 | heavyiron | 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: |
||
109 | heavyiron | 373 | cmp byte [esi],1Ah |
157 | heavyiron | 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: |
||
109 | heavyiron | 385 | lods byte [esi] |
157 | heavyiron | 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: |
||
109 | heavyiron | 396 | cmp [blocks_stack],0 |
157 | heavyiron | 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: |
||
109 | heavyiron | 418 | cmp [blocks_stack],0 |
157 | heavyiron | 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: |
||
109 | heavyiron | 449 | mov eax,1 + (if_directive-assembler) shl 8 |
157 | heavyiron | 450 | stos dword [edi] |
451 | jmp parse_if |
||
452 | skip_parsing_pure_else: |
||
109 | heavyiron | 453 | bts dword [esp],1 |
157 | heavyiron | 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 | |||
31 | halyavin | 465 | |
109 | heavyiron | 466 | mov [parenthesis_stack],0 |
157 | heavyiron | 467 | parse_instruction_arguments: |
109 | heavyiron | 468 | cmp bx,prefix_instruction-assembler |
157 | heavyiron | 469 | je allow_embedded_instruction |
470 | cmp bx,times_directive-assembler |
||
471 | je parse_times_directive |
||
472 | cmp bx,end_directive-assembler |
||
473 | je allow_embedded_instruction |
||
474 | cmp bx,label_directive-assembler |
||
475 | je parse_label_directive |
||
476 | cmp bx,segment_directive-assembler |
||
477 | je parse_label_directive |
||
478 | cmp bx,load_directive-assembler |
||
479 | je parse_load_directive |
||
480 | cmp bx,extrn_directive-assembler |
||
481 | je parse_extrn_directive |
||
482 | cmp bx,public_directive-assembler |
||
483 | je parse_public_directive |
||
484 | parse_argument: |
||
109 | heavyiron | 485 | lea eax,[edi+100h] |
157 | heavyiron | 486 | cmp eax,[labels_list] |
487 | jae out_of_memory |
||
488 | lods byte [esi] |
||
489 | cmp al,':' |
||
490 | je instruction_separator |
||
491 | cmp al,',' |
||
492 | je separator |
||
493 | cmp al,'=' |
||
494 | je separator |
||
495 | cmp al,'|' |
||
496 | je separator |
||
497 | cmp al,'&' |
||
498 | je separator |
||
499 | cmp al,'~' |
||
500 | je separator |
||
501 | cmp al,'>' |
||
502 | je greater |
||
503 | cmp al,'<' |
||
504 | je less |
||
505 | cmp al,')' |
||
506 | je close_parenthesis |
||
507 | or al,al |
||
508 | jz contents_parsed |
||
509 | cmp al,'[' |
||
510 | je address_argument |
||
511 | cmp al,']' |
||
512 | je separator |
||
513 | cmp al,'{' |
||
514 | je unallowed_character |
||
515 | cmp al,'}' |
||
516 | je unallowed_character |
||
517 | cmp al,'#' |
||
518 | je unallowed_character |
||
519 | cmp al,'`' |
||
520 | je unallowed_character |
||
521 | dec esi |
||
522 | cmp al,1Ah |
||
523 | jne expression_argument |
||
524 | push edi |
||
525 | mov edi,directive_operators |
||
526 | call get_operator |
||
527 | or al,al |
||
528 | jnz operator_argument |
||
529 | inc esi |
||
530 | movzx ecx,byte [esi] |
||
531 | inc esi |
||
532 | call get_symbol |
||
533 | jnc symbol_argument |
||
534 | cmp ecx,1 |
||
535 | jne check_argument |
||
536 | cmp byte [esi],'?' |
||
537 | jne check_argument |
||
538 | pop edi |
||
539 | movs byte [edi],[esi] |
||
540 | jmp argument_parsed |
||
541 | symbol_argument: |
||
109 | heavyiron | 542 | pop edi |
157 | heavyiron | 543 | stos word [edi] |
544 | jmp argument_parsed |
||
545 | operator_argument: |
||
109 | heavyiron | 546 | pop edi |
157 | heavyiron | 547 | cmp al,85h |
548 | je ptr_argument |
||
549 | stos byte [edi] |
||
550 | cmp al,80h |
||
551 | je forced_expression |
||
552 | cmp al,81h |
||
553 | je forced_parenthesis |
||
554 | cmp al,82h |
||
555 | je parse_from_operator |
||
556 | cmp al,89h |
||
557 | je parse_label_operator |
||
558 | jmp argument_parsed |
||
559 | allow_embedded_instruction: |
||
109 | heavyiron | 560 | cmp byte [esi],1Ah |
157 | heavyiron | 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: |
||
109 | heavyiron | 574 | pop edi |
157 | heavyiron | 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: |
||
109 | heavyiron | 584 | mov al,'(' |
157 | heavyiron | 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: |
||
31 | halyavin | 594 | cmp byte [esi],1Ah |
157 | heavyiron | 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: |
||
109 | heavyiron | 611 | mov esi,ebx |
157 | heavyiron | 612 | jmp argument_parsed |
613 | parse_load_directive: |
||
31 | halyavin | 614 | cmp byte [esi],1Ah |
157 | heavyiron | 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: |
||
31 | halyavin | 631 | cmp byte [esi],1Ah |
157 | heavyiron | 632 | jne parse_argument |
633 | inc esi |
||
634 | push esi |
||
635 | movzx ecx,byte [esi] |
||
636 | inc esi |
||
637 | mov al,2 |
||
638 | stos byte [edi] |
||
639 | call get_label_id |
||
640 | stos dword [edi] |
||
641 | mov ax,8600h |
||
642 | stos word [edi] |
||
643 | pop ebx |
||
644 | push ebx esi edi |
||
645 | mov edi,directive_operators |
||
646 | call get_operator |
||
647 | pop edi edx ebx |
||
648 | cmp al,86h |
||
649 | je argument_parsed |
||
650 | mov esi,edx |
||
651 | xchg esi,ebx |
||
652 | movzx ecx,byte [esi] |
||
653 | inc esi |
||
654 | mov ax,'(' |
||
655 | stos word [edi] |
||
656 | mov eax,ecx |
||
657 | stos dword [edi] |
||
658 | rep movs byte [edi],[esi] |
||
659 | xor al,al |
||
660 | stos byte [edi] |
||
661 | xchg esi,ebx |
||
662 | jmp argument_parsed |
||
663 | parse_extrn_directive: |
||
31 | halyavin | 664 | cmp byte [esi],22h |
157 | heavyiron | 665 | je parse_quoted_extrn |
666 | cmp byte [esi],1Ah |
||
667 | jne parse_argument |
||
668 | push esi |
||
669 | movzx ecx,byte [esi+1] |
||
670 | add esi,2 |
||
671 | mov ax,'(' |
||
672 | stos word [edi] |
||
673 | mov eax,ecx |
||
674 | stos dword [edi] |
||
675 | rep movs byte [edi],[esi] |
||
676 | mov ax,8600h |
||
677 | stos word [edi] |
||
678 | pop esi |
||
679 | parse_label_operator: |
||
31 | halyavin | 680 | cmp byte [esi],1Ah |
157 | heavyiron | 681 | jne argument_parsed |
682 | inc esi |
||
683 | movzx ecx,byte [esi] |
||
684 | inc esi |
||
685 | mov al,2 |
||
686 | stos byte [edi] |
||
687 | call get_label_id |
||
688 | stos dword [edi] |
||
689 | xor al,al |
||
690 | stos byte [edi] |
||
691 | jmp argument_parsed |
||
692 | parse_from_operator: |
||
31 | halyavin | 693 | cmp byte [esi],22h |
157 | heavyiron | 694 | jne forced_expression |
695 | jmp argument_parsed |
||
696 | parse_quoted_extrn: |
||
31 | halyavin | 697 | inc esi |
157 | heavyiron | 698 | mov ax,'(' |
699 | stos word [edi] |
||
700 | lods dword [esi] |
||
701 | mov ecx,eax |
||
702 | stos dword [edi] |
||
703 | rep movs byte [edi],[esi] |
||
704 | xor al,al |
||
705 | stos byte [edi] |
||
706 | push esi edi |
||
707 | mov edi,directive_operators |
||
708 | call get_operator |
||
709 | mov edx,esi |
||
710 | pop edi esi |
||
711 | cmp al,86h |
||
712 | jne argument_parsed |
||
713 | stos byte [edi] |
||
714 | mov esi,edx |
||
715 | jmp parse_label_operator |
||
716 | ptr_argument: |
||
31 | halyavin | 717 | call parse_address |
157 | heavyiron | 718 | jmp address_parsed |
719 | check_argument: |
||
31 | halyavin | 720 | push esi ecx |
157 | heavyiron | 721 | sub esi,2 |
722 | mov edi,single_operand_operators |
||
723 | call get_operator |
||
724 | pop ecx esi |
||
725 | or al,al |
||
726 | jnz not_instruction |
||
727 | call get_instruction |
||
728 | jnc embedded_instruction |
||
729 | call get_data_directive |
||
730 | jnc embedded_instruction |
||
731 | not_instruction: |
||
31 | halyavin | 732 | pop edi |
157 | heavyiron | 733 | sub esi,2 |
734 | expression_argument: |
||
31 | halyavin | 735 | cmp byte [esi],22h |
157 | heavyiron | 736 | jne not_string |
737 | mov eax,[esi+1] |
||
738 | lea ebx,[esi+5+eax] |
||
739 | push ebx ecx esi edi |
||
740 | mov al,'(' |
||
741 | stos byte [edi] |
||
742 | call convert_expression |
||
743 | mov al,')' |
||
744 | stos byte [edi] |
||
745 | pop eax edx ecx ebx |
||
746 | cmp esi,ebx |
||
747 | jne expression_parsed |
||
748 | mov edi,eax |
||
749 | mov esi,edx |
||
750 | string_argument: |
||
31 | halyavin | 751 | inc esi |
157 | heavyiron | 752 | mov ax,'(' |
753 | stos word [edi] |
||
754 | lods dword [esi] |
||
755 | mov ecx,eax |
||
756 | stos dword [edi] |
||
757 | shr ecx,1 |
||
758 | jnc string_movsb_ok |
||
759 | movs byte [edi],[esi] |
||
760 | string_movsb_ok: |
||
31 | halyavin | 761 | shr ecx,1 |
157 | heavyiron | 762 | jnc string_movsw_ok |
763 | movs word [edi],[esi] |
||
764 | string_movsw_ok: |
||
31 | halyavin | 765 | rep movs dword [edi],[esi] |
157 | heavyiron | 766 | xor al,al |
767 | stos byte [edi] |
||
768 | jmp expression_parsed |
||
769 | not_string: |
||
31 | halyavin | 770 | cmp byte [esi],'(' |
157 | heavyiron | 771 | jne expression |
772 | mov eax,esp |
||
773 | sub eax,100h |
||
774 | jc stack_overflow |
||
775 | cmp eax,[stack_limit] |
||
776 | jb stack_overflow |
||
777 | push esi edi |
||
778 | inc esi |
||
779 | mov al,'{' |
||
780 | stos byte [edi] |
||
781 | inc [parenthesis_stack] |
||
782 | jmp parse_argument |
||
783 | expression: |
||
31 | halyavin | 784 | mov al,'(' |
157 | heavyiron | 785 | stos byte [edi] |
786 | call convert_expression |
||
787 | mov al,')' |
||
788 | stos byte [edi] |
||
789 | jmp expression_parsed |
||
790 | forced_expression: |
||
31 | halyavin | 791 | mov al,'(' |
157 | heavyiron | 792 | stos byte [edi] |
793 | call convert_expression |
||
794 | mov al,')' |
||
795 | stos byte [edi] |
||
796 | jmp argument_parsed |
||
797 | address_argument: |
||
31 | halyavin | 798 | call parse_address |
157 | heavyiron | 799 | lods byte [esi] |
800 | cmp al,']' |
||
801 | je address_parsed |
||
802 | dec esi |
||
803 | mov al,')' |
||
804 | stos byte [edi] |
||
805 | jmp argument_parsed |
||
806 | address_parsed: |
||
31 | halyavin | 807 | mov al,']' |
157 | heavyiron | 808 | stos byte [edi] |
809 | jmp argument_parsed |
||
810 | parse_address: |
||
31 | halyavin | 811 | mov al,'[' |
157 | heavyiron | 812 | stos byte [edi] |
813 | cmp word [esi],021Ah |
||
814 | jne convert_address |
||
815 | push esi |
||
816 | add esi,4 |
||
817 | lea ebx,[esi+1] |
||
818 | cmp byte [esi],':' |
||
819 | pop esi |
||
820 | jne convert_address |
||
821 | add esi,2 |
||
822 | mov ecx,2 |
||
823 | push ebx edi |
||
824 | call get_symbol |
||
825 | pop edi esi |
||
826 | jc unknown_segment_prefix |
||
827 | cmp al,10h |
||
828 | jne unknown_segment_prefix |
||
829 | mov al,ah |
||
830 | and ah,11110000b |
||
831 | cmp ah,60h |
||
832 | jne unknown_segment_prefix |
||
833 | stos byte [edi] |
||
834 | jmp convert_address |
||
835 | unknown_segment_prefix: |
||
109 | heavyiron | 836 | sub esi,5 |
157 | heavyiron | 837 | convert_address: |
31 | halyavin | 838 | push edi |
157 | heavyiron | 839 | mov edi,address_sizes |
840 | call get_operator |
||
841 | pop edi |
||
842 | or al,al |
||
843 | jz convert_expression |
||
844 | add al,70h |
||
845 | stos byte [edi] |
||
846 | jmp convert_expression |
||
847 | forced_parenthesis: |
||
31 | halyavin | 848 | cmp byte [esi],'(' |
157 | heavyiron | 849 | jne argument_parsed |
850 | inc esi |
||
851 | mov al,'{' |
||
852 | jmp separator |
||
853 | unallowed_character: |
||
31 | halyavin | 854 | mov al,0FFh |
157 | heavyiron | 855 | jmp separator |
856 | close_parenthesis: |
||
31 | halyavin | 857 | mov al,'}' |
157 | heavyiron | 858 | separator: |
31 | halyavin | 859 | stos byte [edi] |
157 | heavyiron | 860 | jmp argument_parsed |
861 | instruction_separator: |
||
31 | halyavin | 862 | stos byte [edi] |
157 | heavyiron | 863 | jmp allow_embedded_instruction |
864 | greater: |
||
31 | halyavin | 865 | cmp byte [esi],'=' |
157 | heavyiron | 866 | jne separator |
867 | inc esi |
||
868 | mov al,0F2h |
||
869 | jmp separator |
||
870 | less: |
||
31 | halyavin | 871 | cmp byte [edi-1],0F6h |
157 | heavyiron | 872 | je separator |
873 | cmp byte [esi],'>' |
||
874 | je not_equal |
||
875 | cmp byte [esi],'=' |
||
876 | jne separator |
||
877 | inc esi |
||
878 | mov al,0F3h |
||
879 | jmp separator |
||
880 | not_equal: |
||
31 | halyavin | 881 | inc esi |
157 | heavyiron | 882 | mov al,0F1h |
883 | jmp separator |
||
884 | argument_parsed: |
||
31 | halyavin | 885 | cmp [parenthesis_stack],0 |
157 | heavyiron | 886 | je parse_argument |
887 | dec [parenthesis_stack] |
||
888 | add esp,8 |
||
889 | jmp argument_parsed |
||
890 | expression_parsed: |
||
31 | halyavin | 891 | cmp [parenthesis_stack],0 |
157 | heavyiron | 892 | je parse_argument |
893 | cmp byte [esi],')' |
||
894 | jne argument_parsed |
||
895 | dec [parenthesis_stack] |
||
896 | pop edi esi |
||
897 | jmp expression |
||
898 | contents_parsed: |
||
109 | heavyiron | 899 | cmp [parenthesis_stack],0 |
157 | heavyiron | 900 | jne invalid_expression |
901 | ret |
||
902 | |||
31 | halyavin | 903 | |
109 | heavyiron | 904 | cmp byte [esi],'.' |
157 | heavyiron | 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: |
||
109 | heavyiron | 914 | ret |
157 | heavyiron | 915 | anonymous_label_name: |
109 | heavyiron | 916 | cmp byte [esi-1],'@' |
157 | heavyiron | 917 | je anonymous_label_name_ok |
918 | mov eax,0Fh |
||
919 | anonymous_label_name_ok: |
||
109 | heavyiron | 920 | ret |
157 | heavyiron | 921 | local_label_name: |
109 | heavyiron | 922 | call get_label_id |
157 | heavyiron | 923 | ret |
924 | |||
109 | heavyiron | 925 | |
31 | halyavin | 926 | cmp byte [esi],1Ah |
157 | heavyiron | 927 | jne get_simple_operator |
928 | mov edx,esi |
||
929 | push ebp |
||
930 | inc esi |
||
931 | lods byte [esi] |
||
932 | movzx ebp,al |
||
933 | push edi |
||
934 | mov ecx,ebp |
||
935 | call lower_case |
||
936 | pop edi |
||
937 | check_operator: |
||
31 | halyavin | 938 | mov esi,converted |
157 | heavyiron | 939 | movzx ecx,byte [edi] |
940 | jecxz no_operator |
||
941 | inc edi |
||
942 | mov ebx,edi |
||
943 | add ebx,ecx |
||
944 | cmp ecx,ebp |
||
945 | jne next_operator |
||
946 | repe cmps byte [esi],[edi] |
||
947 | je operator_found |
||
948 | next_operator: |
||
31 | halyavin | 949 | mov edi,ebx |
157 | heavyiron | 950 | inc edi |
951 | jmp check_operator |
||
952 | no_operator: |
||
31 | halyavin | 953 | mov esi,edx |
157 | heavyiron | 954 | mov ecx,ebp |
955 | pop ebp |
||
956 | no_simple_operator: |
||
31 | halyavin | 957 | xor al,al |
157 | heavyiron | 958 | ret |
959 | operator_found: |
||
31 | halyavin | 960 | lea esi,[edx+2+ebp] |
157 | heavyiron | 961 | mov ecx,ebp |
962 | pop ebp |
||
963 | mov al,[edi] |
||
964 | ret |
||
965 | get_simple_operator: |
||
31 | halyavin | 966 | mov al,[esi] |
157 | heavyiron | 967 | cmp al,22h |
968 | je no_simple_operator |
||
969 | simple_operator: |
||
31 | halyavin | 970 | cmp byte [edi],1 |
157 | heavyiron | 971 | jb no_simple_operator |
972 | ja simple_next_operator |
||
973 | cmp al,[edi+1] |
||
974 | je simple_operator_found |
||
975 | simple_next_operator: |
||
31 | halyavin | 976 | movzx ecx,byte [edi] |
157 | heavyiron | 977 | lea edi,[edi+1+ecx+1] |
978 | jmp simple_operator |
||
979 | simple_operator_found: |
||
31 | halyavin | 980 | inc esi |
157 | heavyiron | 981 | mov al,[edi+2] |
982 | ret |
||
983 | |||
31 | halyavin | 984 | |
985 | push esi |
||
157 | heavyiron | 986 | mov ebp,ecx |
987 | call lower_case |
||
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] |
||
996 | scan_symbols: |
||
31 | halyavin | 997 | or edx,edx |
157 | heavyiron | 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 |
||
1005 | mov ecx,ebp |
||
1006 | repe cmps byte [esi],[edi] |
||
1007 | ja symbols_up |
||
1008 | jb symbols_down |
||
1009 | pop esi |
||
1010 | add esi,ebp |
||
1011 | mov ax,[edi] |
||
1012 | clc |
||
1013 | ret |
||
1014 | no_symbol: |
||
31 | halyavin | 1015 | pop esi |
157 | heavyiron | 1016 | mov ecx,ebp |
1017 | stc |
||
1018 | ret |
||
1019 | symbols_down: |
||
109 | heavyiron | 1020 | shr edx,1 |
157 | heavyiron | 1021 | jmp scan_symbols |
1022 | symbols_up: |
||
109 | heavyiron | 1023 | lea ebx,[edi+ecx+2] |
157 | heavyiron | 1024 | shr edx,1 |
1025 | adc edx,-1 |
||
1026 | jmp scan_symbols |
||
1027 | |||
31 | halyavin | 1028 | |
109 | heavyiron | 1029 | push esi |
157 | heavyiron | 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 |
||
1041 | |||
109 | heavyiron | 1042 | |
31 | halyavin | 1043 | push esi |
157 | heavyiron | 1044 | mov ebp,ecx |
1045 | call lower_case |
||
1046 | mov ecx,ebp |
||
1047 | cmp cl,11 |
||
1048 | ja no_instruction |
||
1049 | sub cl,2 |
||
1050 | jc no_instruction |
||
1051 | movzx ebx,word [instructions+ecx*4] |
||
1052 | add ebx,instructions |
||
1053 | movzx edx,word [instructions+ecx*4+2] |
||
1054 | scan_instructions: |
||
31 | halyavin | 1055 | or edx,edx |
157 | heavyiron | 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] |
||
1062 | mov esi,converted |
||
1063 | mov ecx,ebp |
||
1064 | repe cmps byte [esi],[edi] |
||
1065 | ja instructions_up |
||
1066 | jb instructions_down |
||
1067 | pop esi |
||
1068 | add esi,ebp |
||
1069 | mov al,[edi] |
||
1070 | mov bx,[edi+1] |
||
1071 | clc |
||
1072 | ret |
||
1073 | no_instruction: |
||
31 | halyavin | 1074 | pop esi |
157 | heavyiron | 1075 | mov ecx,ebp |
1076 | stc |
||
1077 | ret |
||
1078 | instructions_down: |
||
109 | heavyiron | 1079 | shr edx,1 |
157 | heavyiron | 1080 | jmp scan_instructions |
1081 | instructions_up: |
||
109 | heavyiron | 1082 | lea ebx,[edi+ecx+3] |
157 | heavyiron | 1083 | shr edx,1 |
1084 | adc edx,-1 |
||
1085 | jmp scan_instructions |
||
1086 | |||
31 | halyavin | 1087 | |
1088 | cmp ecx,100h |
||
157 | heavyiron | 1089 | jae name_too_long |
1090 | cmp byte [esi],'@' |
||
1091 | je anonymous_label |
||
1092 | cmp byte [esi],'.' |
||
1093 | jne standard_label |
||
1094 | cmp byte [esi+1],'.' |
||
1095 | je standard_label |
||
1096 | cmp [current_locals_prefix],0 |
||
1097 | je standard_label |
||
1098 | push edi |
||
1099 | mov edi,[additional_memory_end] |
||
1100 | sub edi,2 |
||
1101 | sub edi,ecx |
||
1102 | push ecx esi |
||
1103 | mov esi,[current_locals_prefix] |
||
1104 | lods byte [esi] |
||
1105 | movzx ecx,al |
||
1106 | sub edi,ecx |
||
1107 | cmp edi,[free_additional_memory] |
||
1108 | jb out_of_memory |
||
1109 | mov word [edi],0 |
||
1110 | add edi,2 |
||
1111 | mov ebx,edi |
||
1112 | rep movs byte [edi],[esi] |
||
1113 | pop esi ecx |
||
1114 | add al,cl |
||
1115 | jc name_too_long |
||
1116 | rep movs byte [edi],[esi] |
||
1117 | pop edi |
||
1118 | push ebx esi |
||
1119 | movzx ecx,al |
||
1120 | mov byte [ebx-1],al |
||
1121 | mov esi,ebx |
||
1122 | call get_label_id |
||
1123 | pop esi ebx |
||
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: |
||
109 | heavyiron | 1129 | ret |
157 | heavyiron | 1130 | anonymous_label: |
31 | halyavin | 1131 | cmp ecx,2 |
157 | heavyiron | 1132 | jne standard_label |
1133 | mov al,[esi+1] |
||
1134 | mov ebx,characters |
||
1135 | xlat byte [ebx] |
||
1136 | cmp al,'@' |
||
1137 | je new_anonymous |
||
1138 | cmp al,'b' |
||
1139 | je anonymous_back |
||
1140 | cmp al,'r' |
||
1141 | je anonymous_back |
||
1142 | cmp al,'f' |
||
1143 | jne standard_label |
||
1144 | add esi,2 |
||
1145 | mov eax,[anonymous_forward] |
||
1146 | or eax,eax |
||
1147 | jnz anonymous_ok |
||
1148 | mov eax,[current_line] |
||
1149 | mov [error_line],eax |
||
1150 | call allocate_label |
||
1151 | mov [anonymous_forward],eax |
||
1152 | anonymous_ok: |
||
31 | halyavin | 1153 | xor ebx,ebx |
157 | heavyiron | 1154 | ret |
1155 | anonymous_back: |
||
31 | halyavin | 1156 | add esi,2 |
157 | heavyiron | 1157 | mov eax,[anonymous_reverse] |
1158 | or eax,eax |
||
1159 | jz invalid_value |
||
1160 | jmp anonymous_ok |
||
1161 | new_anonymous: |
||
31 | halyavin | 1162 | add esi,2 |
157 | heavyiron | 1163 | mov eax,[anonymous_forward] |
1164 | or eax,eax |
||
1165 | jnz new_anonymous_ok |
||
1166 | call allocate_label |
||
1167 | new_anonymous_ok: |
||
31 | halyavin | 1168 | mov [anonymous_reverse],eax |
157 | heavyiron | 1169 | mov [anonymous_forward],0 |
1170 | jmp anonymous_ok |
||
1171 | standard_label: |
||
31 | halyavin | 1172 | cmp byte [esi],'%' |
157 | heavyiron | 1173 | je get_predefined_id |
1174 | cmp byte [esi],'$' |
||
1175 | jne find_label |
||
1176 | cmp ecx,2 |
||
1177 | ja find_label |
||
1178 | inc esi |
||
1179 | jb get_current_offset_id |
||
1180 | inc esi |
||
1181 | cmp byte [esi-1],'$' |
||
1182 | je get_org_origin_id |
||
1183 | sub esi,ecx |
||
1184 | jmp find_label |
||
1185 | get_current_offset_id: |
||
31 | halyavin | 1186 | xor eax,eax |
157 | heavyiron | 1187 | ret |
1188 | get_counter_id: |
||
31 | halyavin | 1189 | mov eax,1 |
157 | heavyiron | 1190 | ret |
1191 | get_timestamp_id: |
||
31 | halyavin | 1192 | mov eax,2 |
157 | heavyiron | 1193 | ret |
1194 | get_org_origin_id: |
||
31 | halyavin | 1195 | mov eax,3 |
157 | heavyiron | 1196 | ret |
1197 | get_predefined_id: |
||
31 | halyavin | 1198 | cmp ecx,2 |
157 | heavyiron | 1199 | ja find_label |
1200 | inc esi |
||
1201 | cmp cl,1 |
||
1202 | je get_counter_id |
||
1203 | lods byte [esi] |
||
1204 | mov ebx,characters |
||
1205 | xlat [ebx] |
||
1206 | cmp al,'t' |
||
1207 | je get_timestamp_id |
||
1208 | sub esi,2 |
||
1209 | find_label: |
||
31 | halyavin | 1210 | xor ebx,ebx |
157 | heavyiron | 1211 | mov eax,2166136261 |
1212 | mov ebp,16777619 |
||
1213 | hash_label: |
||
31 | halyavin | 1214 | xor al,[esi+ebx] |
157 | heavyiron | 1215 | mul ebp |
1216 | inc bl |
||
1217 | cmp bl,cl |
||
1218 | jb hash_label |
||
1219 | mov ebp,eax |
||
1220 | shl eax,8 |
||
1221 | and ebp,0FFh shl 24 |
||
1222 | xor ebp,eax |
||
1223 | or ebp,ebx |
||
1224 | mov [label_hash],ebp |
||
1225 | push edi esi |
||
1226 | push ecx |
||
1227 | mov ecx,32 |
||
1228 | mov ebx,hash_tree |
||
1229 | follow_tree: |
||
31 | halyavin | 1230 | mov edx,[ebx] |
157 | heavyiron | 1231 | or edx,edx |
1232 | jz extend_tree |
||
1233 | xor eax,eax |
||
1234 | shl ebp,1 |
||
1235 | adc eax,0 |
||
1236 | lea ebx,[edx+eax*4] |
||
1237 | dec ecx |
||
1238 | jnz follow_tree |
||
1239 | mov [label_leaf],ebx |
||
1240 | pop edx |
||
1241 | mov eax,[ebx] |
||
1242 | or eax,eax |
||
1243 | jz add_label |
||
1244 | mov ebx,esi |
||
1245 | mov ebp,[label_hash] |
||
1246 | compare_labels: |
||
31 | halyavin | 1247 | mov esi,ebx |
157 | heavyiron | 1248 | mov ecx,edx |
1249 | mov edi,[eax+4] |
||
1250 | mov edi,[edi+24] |
||
1251 | repe cmps byte [esi],[edi] |
||
1252 | je label_found |
||
1253 | mov eax,[eax] |
||
1254 | or eax,eax |
||
1255 | jnz compare_labels |
||
1256 | jmp add_label |
||
1257 | label_found: |
||
31 | halyavin | 1258 | add esp,4 |
157 | heavyiron | 1259 | pop edi |
1260 | mov eax,[eax+4] |
||
1261 | ret |
||
1262 | extend_tree: |
||
31 | halyavin | 1263 | mov edx,[free_additional_memory] |
157 | heavyiron | 1264 | lea eax,[edx+8] |
1265 | cmp eax,[additional_memory_end] |
||
1266 | ja out_of_memory |
||
1267 | mov [free_additional_memory],eax |
||
1268 | xor eax,eax |
||
1269 | mov [edx],eax |
||
1270 | mov [edx+4],eax |
||
1271 | shl ebp,1 |
||
1272 | adc eax,0 |
||
1273 | mov [ebx],edx |
||
1274 | lea ebx,[edx+eax*4] |
||
1275 | dec ecx |
||
1276 | jnz extend_tree |
||
1277 | mov [label_leaf],ebx |
||
1278 | pop edx |
||
1279 | add_label: |
||
31 | halyavin | 1280 | mov ecx,edx |
157 | heavyiron | 1281 | pop esi |
1282 | cmp byte [esi-2],0 |
||
1283 | je label_name_ok |
||
1284 | mov al,[esi] |
||
1285 | cmp al,30h |
||
1286 | jb name_first_char_ok |
||
1287 | cmp al,39h |
||
1288 | jbe invalid_name |
||
1289 | name_first_char_ok: |
||
31 | halyavin | 1290 | cmp ecx,1 |
157 | heavyiron | 1291 | jne check_for_reserved_word |
1292 | cmp al,'$' |
||
1293 | je reserved_word |
||
1294 | check_for_reserved_word: |
||
31 | halyavin | 1295 | call get_instruction |
157 | heavyiron | 1296 | jnc reserved_word |
1297 | call get_data_directive |
||
1298 | jnc reserved_word |
||
1299 | call get_symbol |
||
1300 | jnc reserved_word |
||
1301 | sub esi,2 |
||
1302 | mov edi,operators |
||
1303 | call get_operator |
||
1304 | or al,al |
||
1305 | jnz reserved_word |
||
1306 | mov edi,single_operand_operators |
||
1307 | call get_operator |
||
1308 | or al,al |
||
1309 | jnz reserved_word |
||
1310 | mov edi,directive_operators |
||
1311 | call get_operator |
||
1312 | or al,al |
||
1313 | jnz reserved_word |
||
1314 | inc esi |
||
1315 | movzx ecx,byte [esi] |
||
1316 | inc esi |
||
1317 | label_name_ok: |
||
31 | halyavin | 1318 | mov edx,[free_additional_memory] |
157 | heavyiron | 1319 | lea eax,[edx+8] |
1320 | cmp eax,[additional_memory_end] |
||
1321 | ja out_of_memory |
||
1322 | mov [free_additional_memory],eax |
||
1323 | mov ebx,esi |
||
1324 | add esi,ecx |
||
1325 | mov eax,[label_leaf] |
||
1326 | mov edi,[eax] |
||
1327 | mov [edx],edi |
||
1328 | mov [eax],edx |
||
1329 | call allocate_label |
||
1330 | mov [edx+4],eax |
||
1331 | mov [eax+24],ebx |
||
1332 | pop edi |
||
1333 | ret |
||
1334 | reserved_word: |
||
31 | halyavin | 1335 | mov eax,0Fh |
157 | heavyiron | 1336 | pop edi |
1337 | ret |
||
1338 | allocate_label: |
||
109 | heavyiron | 1339 | mov eax,[labels_list] |
157 | heavyiron | 1340 | mov ecx,LABEL_STRUCTURE_SIZE shr 2 |
1341 | initialize_label: |
||
109 | heavyiron | 1342 | sub eax,4 |
157 | heavyiron | 1343 | mov dword [eax],0 |
1344 | loop initialize_label |
||
1345 | mov [labels_list],eax |
||
1346 | ret |
||
1347 | |||
31 | halyavin | 1348 | |
109 | heavyiron | 1349 | > |