"Fossies" - the Fresh Open Source Software Archive 
Member "fasm/source/assemble.inc" (21 Feb 2022, 42134 Bytes) of package /linux/misc/fasm-1.73.30.tgz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) fasm source code syntax highlighting (style:
standard) with prefixed line numbers.
Alternatively you can here
view or
download the uninterpreted source code file.
See also the latest
Fossies "Diffs" side-by-side code changes report for "assemble.inc":
1.73.29_vs_1.73.30.
1
2 ; flat assembler core
3 ; Copyright (c) 1999-2022, Tomasz Grysztar.
4 ; All rights reserved.
5
6 assembler:
7 xor eax,eax
8 mov [stub_size],eax
9 mov [current_pass],ax
10 mov [resolver_flags],eax
11 mov [number_of_sections],eax
12 mov [actual_fixups_size],eax
13 assembler_loop:
14 mov eax,[labels_list]
15 mov [tagged_blocks],eax
16 mov eax,[additional_memory]
17 mov [free_additional_memory],eax
18 mov eax,[additional_memory_end]
19 mov [structures_buffer],eax
20 mov esi,[source_start]
21 mov edi,[code_start]
22 xor eax,eax
23 mov dword [adjustment],eax
24 mov dword [adjustment+4],eax
25 mov [addressing_space],eax
26 mov [error_line],eax
27 mov [counter],eax
28 mov [format_flags],eax
29 mov [number_of_relocations],eax
30 mov [undefined_data_end],eax
31 mov [file_extension],eax
32 mov [next_pass_needed],al
33 mov [output_format],al
34 mov [adjustment_sign],al
35 mov [evex_mode],al
36 mov [code_type],16
37 call init_addressing_space
38 pass_loop:
39 call assemble_line
40 jnc pass_loop
41 mov eax,[additional_memory_end]
42 cmp eax,[structures_buffer]
43 je pass_done
44 sub eax,18h
45 mov eax,[eax+4]
46 mov [current_line],eax
47 jmp missing_end_directive
48 pass_done:
49 call close_pass
50 mov eax,[labels_list]
51 check_symbols:
52 cmp eax,[memory_end]
53 jae symbols_checked
54 test byte [eax+8],8
55 jz symbol_defined_ok
56 mov cx,[current_pass]
57 cmp cx,[eax+18]
58 jne symbol_defined_ok
59 test byte [eax+8],1
60 jz symbol_defined_ok
61 sub cx,[eax+16]
62 cmp cx,1
63 jne symbol_defined_ok
64 and byte [eax+8],not 1
65 or [next_pass_needed],-1
66 symbol_defined_ok:
67 test byte [eax+8],10h
68 jz use_prediction_ok
69 mov cx,[current_pass]
70 and byte [eax+8],not 10h
71 test byte [eax+8],20h
72 jnz check_use_prediction
73 cmp cx,[eax+18]
74 jne use_prediction_ok
75 test byte [eax+8],8
76 jz use_prediction_ok
77 jmp use_misprediction
78 check_use_prediction:
79 test byte [eax+8],8
80 jz use_misprediction
81 cmp cx,[eax+18]
82 je use_prediction_ok
83 use_misprediction:
84 or [next_pass_needed],-1
85 use_prediction_ok:
86 test byte [eax+8],40h
87 jz check_next_symbol
88 and byte [eax+8],not 40h
89 test byte [eax+8],4
90 jnz define_misprediction
91 mov cx,[current_pass]
92 test byte [eax+8],80h
93 jnz check_define_prediction
94 cmp cx,[eax+16]
95 jne check_next_symbol
96 test byte [eax+8],1
97 jz check_next_symbol
98 jmp define_misprediction
99 check_define_prediction:
100 test byte [eax+8],1
101 jz define_misprediction
102 cmp cx,[eax+16]
103 je check_next_symbol
104 define_misprediction:
105 or [next_pass_needed],-1
106 check_next_symbol:
107 add eax,LABEL_STRUCTURE_SIZE
108 jmp check_symbols
109 symbols_checked:
110 cmp [next_pass_needed],0
111 jne next_pass
112 mov eax,[error_line]
113 or eax,eax
114 jz assemble_ok
115 mov [current_line],eax
116 cmp [error],undefined_symbol
117 jne error_confirmed
118 mov eax,[error_info]
119 or eax,eax
120 jz error_confirmed
121 test byte [eax+8],1
122 jnz next_pass
123 error_confirmed:
124 call error_handler
125 error_handler:
126 mov eax,[error]
127 sub eax,error_handler
128 add [esp],eax
129 ret
130 next_pass:
131 inc [current_pass]
132 mov ax,[current_pass]
133 cmp ax,[passes_limit]
134 je code_cannot_be_generated
135 jmp assembler_loop
136 assemble_ok:
137 ret
138
139 create_addressing_space:
140 mov ebx,[addressing_space]
141 test ebx,ebx
142 jz init_addressing_space
143 test byte [ebx+0Ah],1
144 jnz illegal_instruction
145 mov eax,edi
146 sub eax,[ebx+18h]
147 mov [ebx+1Ch],eax
148 init_addressing_space:
149 mov ebx,[tagged_blocks]
150 mov dword [ebx-4],10h
151 mov dword [ebx-8],24h
152 sub ebx,8+24h
153 cmp ebx,edi
154 jbe out_of_memory
155 mov [tagged_blocks],ebx
156 mov [addressing_space],ebx
157 xor eax,eax
158 mov [ebx],edi
159 mov [ebx+4],eax
160 mov [ebx+8],eax
161 mov [ebx+10h],eax
162 mov [ebx+14h],eax
163 mov [ebx+18h],edi
164 mov [ebx+1Ch],eax
165 mov [ebx+20h],eax
166 ret
167
168 assemble_line:
169 mov eax,[tagged_blocks]
170 sub eax,100h
171 cmp edi,eax
172 ja out_of_memory
173 lods byte [esi]
174 cmp al,1
175 je assemble_instruction
176 jb source_end
177 cmp al,3
178 jb define_label
179 je define_constant
180 cmp al,4
181 je label_addressing_space
182 cmp al,0Fh
183 je new_line
184 cmp al,13h
185 je code_type_setting
186 cmp al,10h
187 jne illegal_instruction
188 lods byte [esi]
189 jmp segment_prefix
190 code_type_setting:
191 lods byte [esi]
192 mov [code_type],al
193 jmp instruction_assembled
194 new_line:
195 lods dword [esi]
196 mov [current_line],eax
197 and [prefix_flags],0
198 cmp [symbols_file],0
199 je continue_line
200 cmp [next_pass_needed],0
201 jne continue_line
202 mov ebx,[tagged_blocks]
203 mov dword [ebx-4],1
204 mov dword [ebx-8],14h
205 sub ebx,8+14h
206 cmp ebx,edi
207 jbe out_of_memory
208 mov [tagged_blocks],ebx
209 mov [ebx],eax
210 mov [ebx+4],edi
211 mov eax,[addressing_space]
212 mov [ebx+8],eax
213 mov al,[code_type]
214 mov [ebx+10h],al
215 continue_line:
216 cmp byte [esi],0Fh
217 je line_assembled
218 jmp assemble_line
219 define_label:
220 lods dword [esi]
221 cmp eax,0Fh
222 jb invalid_use_of_symbol
223 je reserved_word_used_as_symbol
224 mov ebx,eax
225 lods byte [esi]
226 mov [label_size],al
227 call make_label
228 jmp continue_line
229 make_label:
230 mov eax,edi
231 xor edx,edx
232 xor cl,cl
233 mov ebp,[addressing_space]
234 sub eax,[ds:ebp]
235 sbb edx,[ds:ebp+4]
236 sbb cl,[ds:ebp+8]
237 jp label_value_ok
238 call recoverable_overflow
239 label_value_ok:
240 mov [address_sign],cl
241 test byte [ds:ebp+0Ah],1
242 jnz make_virtual_label
243 or byte [ebx+9],1
244 xchg eax,[ebx]
245 xchg edx,[ebx+4]
246 mov ch,[ebx+9]
247 shr ch,1
248 and ch,1
249 neg ch
250 sub eax,[ebx]
251 sbb edx,[ebx+4]
252 sbb ch,cl
253 mov dword [adjustment],eax
254 mov dword [adjustment+4],edx
255 mov [adjustment_sign],ch
256 or al,ch
257 or eax,edx
258 setnz ah
259 jmp finish_label
260 make_virtual_label:
261 and byte [ebx+9],not 1
262 cmp eax,[ebx]
263 mov [ebx],eax
264 setne ah
265 cmp edx,[ebx+4]
266 mov [ebx+4],edx
267 setne al
268 or ah,al
269 finish_label:
270 mov ebp,[addressing_space]
271 mov ch,[ds:ebp+9]
272 mov cl,[label_size]
273 mov edx,[ds:ebp+14h]
274 mov ebp,[ds:ebp+10h]
275 finish_label_symbol:
276 mov al,[address_sign]
277 xor al,[ebx+9]
278 and al,10b
279 or ah,al
280 xor [ebx+9],al
281 cmp cl,[ebx+10]
282 mov [ebx+10],cl
283 setne al
284 or ah,al
285 cmp ch,[ebx+11]
286 mov [ebx+11],ch
287 setne al
288 or ah,al
289 cmp ebp,[ebx+12]
290 mov [ebx+12],ebp
291 setne al
292 or ah,al
293 or ch,ch
294 jz label_symbol_ok
295 cmp edx,[ebx+20]
296 mov [ebx+20],edx
297 setne al
298 or ah,al
299 label_symbol_ok:
300 mov cx,[current_pass]
301 xchg [ebx+16],cx
302 mov edx,[current_line]
303 mov [ebx+28],edx
304 and byte [ebx+8],not 2
305 test byte [ebx+8],1
306 jz new_label
307 cmp cx,[ebx+16]
308 je symbol_already_defined
309 btr dword [ebx+8],10
310 jc requalified_label
311 inc cx
312 sub cx,[ebx+16]
313 setnz al
314 or ah,al
315 jz label_made
316 test byte [ebx+8],8
317 jz label_made
318 mov cx,[current_pass]
319 cmp cx,[ebx+18]
320 jne label_made
321 requalified_label:
322 or [next_pass_needed],-1
323 label_made:
324 ret
325 new_label:
326 or byte [ebx+8],1
327 ret
328 define_constant:
329 lods dword [esi]
330 inc esi
331 cmp eax,0Fh
332 jb invalid_use_of_symbol
333 je reserved_word_used_as_symbol
334 push eax
335 or [operand_flags],1
336 call get_value
337 pop ebx
338 xor cl,cl
339 mov ch,[value_type]
340 cmp ch,3
341 je invalid_use_of_symbol
342 make_constant:
343 and byte [ebx+9],not 1
344 cmp eax,[ebx]
345 mov [ebx],eax
346 setne ah
347 cmp edx,[ebx+4]
348 mov [ebx+4],edx
349 setne al
350 or ah,al
351 mov al,[value_sign]
352 xor al,[ebx+9]
353 and al,10b
354 or ah,al
355 xor [ebx+9],al
356 cmp cl,[ebx+10]
357 mov [ebx+10],cl
358 setne al
359 or ah,al
360 cmp ch,[ebx+11]
361 mov [ebx+11],ch
362 setne al
363 or ah,al
364 xor edx,edx
365 cmp edx,[ebx+12]
366 mov [ebx+12],edx
367 setne al
368 or ah,al
369 or ch,ch
370 jz constant_symbol_ok
371 mov edx,[symbol_identifier]
372 cmp edx,[ebx+20]
373 mov [ebx+20],edx
374 setne al
375 or ah,al
376 constant_symbol_ok:
377 mov cx,[current_pass]
378 xchg [ebx+16],cx
379 mov edx,[current_line]
380 mov [ebx+28],edx
381 test byte [ebx+8],1
382 jz new_constant
383 cmp cx,[ebx+16]
384 jne redeclare_constant
385 test byte [ebx+8],2
386 jz symbol_already_defined
387 or byte [ebx+8],4
388 and byte [ebx+9],not 4
389 jmp instruction_assembled
390 redeclare_constant:
391 btr dword [ebx+8],10
392 jc requalified_constant
393 inc cx
394 sub cx,[ebx+16]
395 setnz al
396 or ah,al
397 jz instruction_assembled
398 test byte [ebx+8],4
399 jnz instruction_assembled
400 test byte [ebx+8],8
401 jz instruction_assembled
402 mov cx,[current_pass]
403 cmp cx,[ebx+18]
404 jne instruction_assembled
405 requalified_constant:
406 or [next_pass_needed],-1
407 jmp instruction_assembled
408 new_constant:
409 or byte [ebx+8],1+2
410 jmp instruction_assembled
411 label_addressing_space:
412 lods dword [esi]
413 cmp eax,0Fh
414 jb invalid_use_of_symbol
415 je reserved_word_used_as_symbol
416 mov cx,[current_pass]
417 test byte [eax+8],1
418 jz make_addressing_space_label
419 cmp cx,[eax+16]
420 je symbol_already_defined
421 test byte [eax+9],4
422 jnz make_addressing_space_label
423 or [next_pass_needed],-1
424 make_addressing_space_label:
425 mov dx,[eax+8]
426 and dx,not (2 or 100h)
427 or dx,1 or 4 or 400h
428 mov [eax+8],dx
429 mov [eax+16],cx
430 mov edx,[current_line]
431 mov [eax+28],edx
432 mov ebx,[addressing_space]
433 mov [eax],ebx
434 or byte [ebx+0Ah],2
435 jmp continue_line
436 assemble_instruction:
437 ; mov [operand_size],0
438 ; mov [operand_flags],0
439 ; mov [operand_prefix],0
440 ; mov [rex_prefix],0
441 and dword [operand_size],0
442 ; mov [opcode_prefix],0
443 ; mov [vex_required],0
444 ; mov [vex_register],0
445 ; mov [immediate_size],0
446 and dword [opcode_prefix],0
447 call instruction_handler
448 instruction_handler:
449 movzx ebx,word [esi]
450 mov al,[esi+2]
451 add esi,3
452 add [esp],ebx
453 ret
454 instruction_assembled:
455 test [prefix_flags],not 1
456 jnz illegal_instruction
457 mov al,[esi]
458 cmp al,0Fh
459 je line_assembled
460 or al,al
461 jnz extra_characters_on_line
462 line_assembled:
463 clc
464 ret
465 source_end:
466 dec esi
467 stc
468 ret
469
470 org_directive:
471 lods byte [esi]
472 cmp al,'('
473 jne invalid_argument
474 cmp byte [esi],'.'
475 je invalid_value
476 call get_qword_value
477 mov cl,[value_type]
478 test cl,1
479 jnz invalid_use_of_symbol
480 push eax
481 mov ebx,[addressing_space]
482 mov eax,edi
483 sub eax,[ebx+18h]
484 mov [ebx+1Ch],eax
485 test byte [ebx+0Ah],1
486 jnz in_virtual
487 call init_addressing_space
488 jmp org_space_ok
489 in_virtual:
490 call close_virtual_addressing_space
491 call init_addressing_space
492 or byte [ebx+0Ah],1
493 org_space_ok:
494 pop eax
495 mov [ebx+9],cl
496 mov cl,[value_sign]
497 sub [ebx],eax
498 sbb [ebx+4],edx
499 sbb byte [ebx+8],cl
500 jp org_value_ok
501 call recoverable_overflow
502 org_value_ok:
503 mov edx,[symbol_identifier]
504 mov [ebx+14h],edx
505 cmp [output_format],1
506 ja instruction_assembled
507 cmp edi,[code_start]
508 jne instruction_assembled
509 cmp eax,100h
510 jne instruction_assembled
511 bts [format_flags],0
512 jmp instruction_assembled
513 label_directive:
514 lods byte [esi]
515 cmp al,2
516 jne invalid_argument
517 lods dword [esi]
518 cmp eax,0Fh
519 jb invalid_use_of_symbol
520 je reserved_word_used_as_symbol
521 inc esi
522 mov ebx,eax
523 mov [label_size],0
524 lods byte [esi]
525 cmp al,':'
526 je get_label_size
527 dec esi
528 cmp al,11h
529 jne label_size_ok
530 get_label_size:
531 lods word [esi]
532 cmp al,11h
533 jne invalid_argument
534 mov [label_size],ah
535 label_size_ok:
536 cmp byte [esi],80h
537 je get_free_label_value
538 call make_label
539 jmp instruction_assembled
540 get_free_label_value:
541 inc esi
542 lods byte [esi]
543 cmp al,'('
544 jne invalid_argument
545 push ebx ecx
546 or byte [ebx+8],4
547 cmp byte [esi],'.'
548 je invalid_value
549 call get_address_value
550 or bh,bh
551 setnz ch
552 xchg ch,cl
553 mov bp,cx
554 shl ebp,16
555 xchg bl,bh
556 mov bp,bx
557 pop ecx ebx
558 and byte [ebx+8],not 4
559 mov ch,[value_type]
560 test ch,1
561 jnz invalid_use_of_symbol
562 make_free_label:
563 and byte [ebx+9],not 1
564 cmp eax,[ebx]
565 mov [ebx],eax
566 setne ah
567 cmp edx,[ebx+4]
568 mov [ebx+4],edx
569 setne al
570 or ah,al
571 mov edx,[address_symbol]
572 mov cl,[label_size]
573 call finish_label_symbol
574 jmp instruction_assembled
575 load_directive:
576 lods byte [esi]
577 cmp al,2
578 jne invalid_argument
579 lods dword [esi]
580 cmp eax,0Fh
581 jb invalid_use_of_symbol
582 je reserved_word_used_as_symbol
583 inc esi
584 push eax
585 mov al,1
586 cmp byte [esi],11h
587 jne load_size_ok
588 lods byte [esi]
589 lods byte [esi]
590 load_size_ok:
591 cmp al,8
592 ja invalid_value
593 mov [operand_size],al
594 and dword [value],0
595 and dword [value+4],0
596 lods byte [esi]
597 cmp al,82h
598 jne invalid_argument
599 call get_data_point
600 jc value_loaded
601 push esi edi
602 mov esi,ebx
603 mov edi,value
604 rep movs byte [edi],[esi]
605 pop edi esi
606 value_loaded:
607 mov [value_sign],0
608 mov eax,dword [value]
609 mov edx,dword [value+4]
610 pop ebx
611 xor cx,cx
612 jmp make_constant
613 get_data_point:
614 lods byte [esi]
615 cmp al,':'
616 je get_data_offset
617 cmp al,'('
618 jne invalid_argument
619 mov ebx,[addressing_space]
620 mov ecx,edi
621 sub ecx,[ebx+18h]
622 mov [ebx+1Ch],ecx
623 cmp byte [esi],11h
624 jne get_data_address
625 cmp word [esi+1+4],'):'
626 jne get_data_address
627 inc esi
628 lods dword [esi]
629 add esi,2
630 cmp byte [esi],'('
631 jne invalid_argument
632 inc esi
633 cmp eax,0Fh
634 jbe reserved_word_used_as_symbol
635 mov edx,undefined_symbol
636 test byte [eax+8],1
637 jz addressing_space_unavailable
638 mov edx,symbol_out_of_scope
639 mov cx,[eax+16]
640 cmp cx,[current_pass]
641 jne addressing_space_unavailable
642 test byte [eax+9],4
643 jz invalid_use_of_symbol
644 mov ebx,eax
645 mov ax,[current_pass]
646 mov [ebx+18],ax
647 or byte [ebx+8],8
648 call store_label_reference
649 get_addressing_space:
650 mov ebx,[ebx]
651 get_data_address:
652 push ebx
653 cmp byte [esi],'.'
654 je invalid_value
655 or [operand_flags],1
656 call get_address_value
657 pop ebp
658 call calculate_relative_offset
659 cmp [next_pass_needed],0
660 jne data_address_type_ok
661 cmp [value_type],0
662 jne invalid_use_of_symbol
663 data_address_type_ok:
664 mov ebx,edi
665 xor ecx,ecx
666 add ebx,eax
667 adc edx,ecx
668 mov eax,ebx
669 sub eax,[ds:ebp+18h]
670 sbb edx,ecx
671 jnz bad_data_address
672 mov cl,[operand_size]
673 add eax,ecx
674 cmp eax,[ds:ebp+1Ch]
675 ja bad_data_address
676 clc
677 ret
678 addressing_space_unavailable:
679 cmp [error_line],0
680 jne get_data_address
681 push [current_line]
682 pop [error_line]
683 mov [error],edx
684 mov [error_info],eax
685 jmp get_data_address
686 bad_data_address:
687 call recoverable_overflow
688 stc
689 ret
690 get_data_offset:
691 cmp [output_format],2
692 jae invalid_operand
693 lods byte [esi]
694 cmp al,'('
695 jne invalid_argument
696 cmp byte [esi],'.'
697 je invalid_value
698 call get_dword_value
699 cmp [value_type],0
700 je data_offset_ok
701 call recoverable_invalid_address
702 data_offset_ok:
703 add eax,[code_start]
704 jc bad_data_address
705 mov ebx,eax
706 movzx ecx,[operand_size]
707 add eax,ecx
708 jc bad_data_address
709 mov edx,[addressing_space]
710 test byte [edx+0Ah],1
711 jnz data_offset_from_virtual
712 cmp eax,edi
713 ja bad_data_address
714 clc
715 ret
716 data_offset_from_virtual:
717 cmp eax,[undefined_data_end]
718 ja bad_data_address
719 clc
720 ret
721
722 store_directive:
723 cmp byte [esi],11h
724 je sized_store
725 lods byte [esi]
726 cmp al,'('
727 jne invalid_argument
728 call get_byte_value
729 xor edx,edx
730 movzx eax,al
731 mov [operand_size],1
732 jmp store_value_ok
733 sized_store:
734 or [operand_flags],1
735 call get_value
736 store_value_ok:
737 cmp [value_type],0
738 jne invalid_use_of_symbol
739 mov dword [value],eax
740 mov dword [value+4],edx
741 lods byte [esi]
742 cmp al,80h
743 jne invalid_argument
744 call get_data_point
745 jc instruction_assembled
746 push esi edi
747 mov esi,value
748 mov edi,ebx
749 rep movs byte [edi],[esi]
750 mov eax,edi
751 pop edi esi
752 cmp ebx,[undefined_data_end]
753 jae instruction_assembled
754 cmp eax,[undefined_data_start]
755 jbe instruction_assembled
756 mov [undefined_data_start],eax
757 jmp instruction_assembled
758
759 display_directive:
760 lods byte [esi]
761 cmp al,'('
762 jne invalid_argument
763 cmp byte [esi],0
764 jne display_byte
765 inc esi
766 lods dword [esi]
767 mov ecx,eax
768 push edi
769 mov edi,[tagged_blocks]
770 sub edi,8
771 sub edi,eax
772 cmp edi,[esp]
773 jbe out_of_memory
774 mov [tagged_blocks],edi
775 rep movs byte [edi],[esi]
776 stos dword [edi]
777 xor eax,eax
778 stos dword [edi]
779 pop edi
780 inc esi
781 jmp display_next
782 display_byte:
783 call get_byte_value
784 push edi
785 mov edi,[tagged_blocks]
786 sub edi,8+1
787 mov [tagged_blocks],edi
788 stos byte [edi]
789 mov eax,1
790 stos dword [edi]
791 dec eax
792 stos dword [edi]
793 pop edi
794 display_next:
795 cmp edi,[tagged_blocks]
796 ja out_of_memory
797 lods byte [esi]
798 cmp al,','
799 je display_directive
800 dec esi
801 jmp instruction_assembled
802 show_display_buffer:
803 mov eax,[tagged_blocks]
804 or eax,eax
805 jz display_done
806 mov esi,[labels_list]
807 cmp esi,eax
808 je display_done
809 display_messages:
810 sub esi,8
811 mov eax,[esi+4]
812 mov ecx,[esi]
813 sub esi,ecx
814 cmp eax,10h
815 je write_addressing_space
816 test eax,eax
817 jnz skip_block
818 push esi
819 call display_block
820 pop esi
821 skip_block:
822 cmp esi,[tagged_blocks]
823 jne display_messages
824 display_done:
825 ret
826 write_addressing_space:
827 mov ecx,[esi+20h]
828 jecxz skip_block
829 push esi
830 mov edi,[free_additional_memory]
831 mov esi,[output_file]
832 test esi,esi
833 jz addressing_space_written
834 xor ebx,ebx
835 copy_output_path:
836 lodsb
837 cmp edi,[structures_buffer]
838 jae out_of_memory
839 stosb
840 test al,al
841 jz output_path_copied
842 cmp al,'/'
843 je new_path_segment
844 cmp al,'\'
845 je new_path_segment
846 cmp al,'.'
847 jne copy_output_path
848 mov ebx,edi
849 jmp copy_output_path
850 new_path_segment:
851 xor ebx,ebx
852 jmp copy_output_path
853 output_path_copied:
854 test ebx,ebx
855 jnz append_extension
856 mov byte [edi-1],'.'
857 mov ebx,edi
858 append_extension:
859 mov edi,ebx
860 add ebx,ecx
861 inc ebx
862 cmp ebx,[structures_buffer]
863 jae out_of_memory
864 mov esi,[esp]
865 mov esi,[esi+18h]
866 sub esi,ecx
867 rep movs byte [edi],[esi]
868 xor al,al
869 stos byte [edi]
870 mov edx,[free_additional_memory]
871 call create
872 jc write_failed
873 mov esi,[esp]
874 mov edx,[esi+18h]
875 mov ecx,[esi+1Ch]
876 call write
877 jc write_failed
878 call close
879 addressing_space_written:
880 pop esi
881 jmp skip_block
882
883 times_directive:
884 lods byte [esi]
885 cmp al,'('
886 jne invalid_argument
887 cmp byte [esi],'.'
888 je invalid_value
889 call get_count_value
890 cmp eax,0
891 je zero_times
892 cmp byte [esi],':'
893 jne times_argument_ok
894 inc esi
895 times_argument_ok:
896 push [counter]
897 push [counter_limit]
898 mov [counter_limit],eax
899 mov [counter],1
900 times_loop:
901 mov eax,esp
902 sub eax,[stack_limit]
903 cmp eax,100h
904 jb stack_overflow
905 push esi
906 or [prefix_flags],1
907 call continue_line
908 mov eax,[counter_limit]
909 cmp [counter],eax
910 je times_done
911 inc [counter]
912 pop esi
913 jmp times_loop
914 times_done:
915 pop eax
916 pop [counter_limit]
917 pop [counter]
918 jmp instruction_assembled
919 zero_times:
920 call skip_symbol
921 jnc zero_times
922 jmp instruction_assembled
923
924 virtual_directive:
925 lods byte [esi]
926 cmp al,'('
927 je continue_virtual_area
928 cmp al,80h
929 jne virtual_at_current
930 lods byte [esi]
931 cmp al,'('
932 jne invalid_argument
933 cmp byte [esi],'.'
934 je invalid_value
935 call get_address_value
936 mov ebp,[address_symbol]
937 or bh,bh
938 setnz ch
939 jmp set_virtual
940 virtual_at_current:
941 dec esi
942 virtual_fallback:
943 mov ebp,[addressing_space]
944 mov al,[ds:ebp+9]
945 mov [value_type],al
946 mov eax,edi
947 xor edx,edx
948 xor cl,cl
949 sub eax,[ds:ebp]
950 sbb edx,[ds:ebp+4]
951 sbb cl,[ds:ebp+8]
952 mov [address_sign],cl
953 mov bx,[ds:ebp+10h]
954 mov cx,[ds:ebp+10h+2]
955 xchg bh,bl
956 xchg ch,cl
957 mov ebp,[ds:ebp+14h]
958 set_virtual:
959 xchg bl,bh
960 xchg cl,ch
961 shl ecx,16
962 mov cx,bx
963 push ecx eax
964 mov ebx,[addressing_space]
965 test byte [ebx+0Ah],1
966 jnz non_virtual_end_ok
967 mov eax,edi
968 xchg eax,[undefined_data_end]
969 cmp eax,edi
970 je non_virtual_end_ok
971 mov [undefined_data_start],edi
972 non_virtual_end_ok:
973 call allocate_virtual_structure_data
974 call init_addressing_space
975 or byte [ebx+0Ah],1
976 cmp byte [esi],86h
977 jne addressing_space_extension_ok
978 cmp word [esi+1],'('
979 jne invalid_argument
980 mov ecx,[esi+3]
981 add esi,3+4
982 add [ebx+18h],ecx
983 mov [ebx+20h],ecx
984 or byte [ebx+0Ah],2
985 push ebx
986 mov ebx,characters
987 get_extension:
988 lods byte [esi]
989 stos byte [edi]
990 xlat byte [ebx]
991 test al,al
992 jz invalid_argument
993 loop get_extension
994 inc esi
995 pop ebx
996 addressing_space_extension_ok:
997 pop eax
998 mov cl,[address_sign]
999 not eax
1000 not edx
1001 not cl
1002 add eax,1
1003 adc edx,0
1004 adc cl,0
1005 add eax,edi
1006 adc edx,0
1007 adc cl,0
1008 mov [ebx],eax
1009 mov [ebx+4],edx
1010 mov [ebx+8],cl
1011 pop dword [ebx+10h]
1012 mov [ebx+14h],ebp
1013 mov al,[value_type]
1014 test al,1
1015 jnz invalid_use_of_symbol
1016 mov [ebx+9],al
1017 jmp instruction_assembled
1018 allocate_structure_data:
1019 mov ebx,[structures_buffer]
1020 sub ebx,18h
1021 cmp ebx,[free_additional_memory]
1022 jb out_of_memory
1023 mov [structures_buffer],ebx
1024 ret
1025 find_structure_data:
1026 mov ebx,[structures_buffer]
1027 scan_structures:
1028 cmp ebx,[additional_memory_end]
1029 je no_such_structure
1030 cmp ax,[ebx]
1031 je structure_data_found
1032 add ebx,18h
1033 jmp scan_structures
1034 structure_data_found:
1035 ret
1036 no_such_structure:
1037 stc
1038 ret
1039 allocate_virtual_structure_data:
1040 call allocate_structure_data
1041 mov word [ebx],virtual_directive-instruction_handler
1042 mov ecx,[addressing_space]
1043 mov [ebx+12],ecx
1044 mov [ebx+8],edi
1045 mov ecx,[current_line]
1046 mov [ebx+4],ecx
1047 mov ebx,[addressing_space]
1048 mov eax,edi
1049 sub eax,[ebx+18h]
1050 mov [ebx+1Ch],eax
1051 ret
1052 continue_virtual_area:
1053 cmp byte [esi],11h
1054 jne invalid_argument
1055 cmp byte [esi+1+4],')'
1056 jne invalid_argument
1057 inc esi
1058 lods dword [esi]
1059 inc esi
1060 cmp eax,0Fh
1061 jbe reserved_word_used_as_symbol
1062 mov edx,undefined_symbol
1063 test byte [eax+8],1
1064 jz virtual_area_unavailable
1065 mov edx,symbol_out_of_scope
1066 mov cx,[eax+16]
1067 cmp cx,[current_pass]
1068 jne virtual_area_unavailable
1069 mov edx,invalid_use_of_symbol
1070 test byte [eax+9],4
1071 jz virtual_area_unavailable
1072 mov ebx,eax
1073 mov ax,[current_pass]
1074 mov [ebx+18],ax
1075 or byte [ebx+8],8
1076 call store_label_reference
1077 mov ebx,[ebx]
1078 test byte [ebx+0Ah],4
1079 jz virtual_area_unavailable
1080 and byte [ebx+0Ah],not 4
1081 mov edx,ebx
1082 call allocate_virtual_structure_data
1083 mov [addressing_space],edx
1084 push esi
1085 mov esi,[edx+18h]
1086 mov ecx,[edx+1Ch]
1087 mov eax,[edx+20h]
1088 sub esi,eax
1089 add ecx,eax
1090 lea eax,[edi+ecx]
1091 cmp eax,[tagged_blocks]
1092 jae out_of_memory
1093 mov eax,esi
1094 sub eax,edi
1095 sub [edx+18h],eax
1096 sub [edx],eax
1097 sbb dword [edx+4],0
1098 sbb byte [edx+8],0
1099 mov al,cl
1100 shr ecx,2
1101 rep movs dword [edi],[esi]
1102 mov cl,al
1103 and cl,11b
1104 rep movs byte [edi],[esi]
1105 pop esi
1106 jmp instruction_assembled
1107 virtual_area_unavailable:
1108 cmp [error_line],0
1109 jne virtual_fallback
1110 push [current_line]
1111 pop [error_line]
1112 mov [error],edx
1113 mov [error_info],eax
1114 jmp virtual_fallback
1115 end_virtual:
1116 call find_structure_data
1117 jc unexpected_instruction
1118 push ebx
1119 call close_virtual_addressing_space
1120 pop ebx
1121 mov eax,[ebx+12]
1122 mov [addressing_space],eax
1123 mov edi,[ebx+8]
1124 remove_structure_data:
1125 push esi edi
1126 mov ecx,ebx
1127 sub ecx,[structures_buffer]
1128 shr ecx,2
1129 lea esi,[ebx-4]
1130 lea edi,[esi+18h]
1131 std
1132 rep movs dword [edi],[esi]
1133 cld
1134 add [structures_buffer],18h
1135 pop edi esi
1136 ret
1137 close_virtual_addressing_space:
1138 mov ebx,[addressing_space]
1139 mov eax,edi
1140 sub eax,[ebx+18h]
1141 mov [ebx+1Ch],eax
1142 add eax,[ebx+20h]
1143 test byte [ebx+0Ah],2
1144 jz addressing_space_closed
1145 or byte [ebx+0Ah],4
1146 push esi edi ecx edx
1147 mov ecx,eax
1148 mov eax,[tagged_blocks]
1149 mov dword [eax-4],11h
1150 mov dword [eax-8],ecx
1151 sub eax,8
1152 sub eax,ecx
1153 mov [tagged_blocks],eax
1154 lea edi,[eax+ecx-1]
1155 add eax,[ebx+20h]
1156 xchg eax,[ebx+18h]
1157 sub eax,[ebx+20h]
1158 lea esi,[eax+ecx-1]
1159 mov eax,edi
1160 sub eax,esi
1161 std
1162 shr ecx,1
1163 jnc virtual_byte_ok
1164 movs byte [edi],[esi]
1165 virtual_byte_ok:
1166 dec esi
1167 dec edi
1168 shr ecx,1
1169 jnc virtual_word_ok
1170 movs word [edi],[esi]
1171 virtual_word_ok:
1172 sub esi,2
1173 sub edi,2
1174 rep movs dword [edi],[esi]
1175 cld
1176 xor edx,edx
1177 add [ebx],eax
1178 adc dword [ebx+4],edx
1179 adc byte [ebx+8],dl
1180 pop edx ecx edi esi
1181 addressing_space_closed:
1182 ret
1183 repeat_directive:
1184 test [prefix_flags],1
1185 jnz unexpected_instruction
1186 lods byte [esi]
1187 cmp al,'('
1188 jne invalid_argument
1189 cmp byte [esi],'.'
1190 je invalid_value
1191 call get_count_value
1192 cmp eax,0
1193 je zero_repeat
1194 call allocate_structure_data
1195 mov word [ebx],repeat_directive-instruction_handler
1196 xchg eax,[counter_limit]
1197 mov [ebx+10h],eax
1198 mov eax,1
1199 xchg eax,[counter]
1200 mov [ebx+14h],eax
1201 mov [ebx+8],esi
1202 mov eax,[current_line]
1203 mov [ebx+4],eax
1204 jmp instruction_assembled
1205 end_repeat:
1206 test [prefix_flags],1
1207 jnz unexpected_instruction
1208 call find_structure_data
1209 jc unexpected_instruction
1210 mov eax,[counter_limit]
1211 inc [counter]
1212 cmp [counter],eax
1213 jbe continue_repeating
1214 stop_repeat:
1215 mov eax,[ebx+10h]
1216 mov [counter_limit],eax
1217 mov eax,[ebx+14h]
1218 mov [counter],eax
1219 call remove_structure_data
1220 jmp instruction_assembled
1221 continue_repeating:
1222 mov esi,[ebx+8]
1223 jmp instruction_assembled
1224 zero_repeat:
1225 mov al,[esi]
1226 or al,al
1227 jz missing_end_directive
1228 cmp al,0Fh
1229 jne extra_characters_on_line
1230 call find_end_repeat
1231 jmp instruction_assembled
1232 find_end_repeat:
1233 call find_structure_end
1234 cmp ax,repeat_directive-instruction_handler
1235 jne unexpected_instruction
1236 ret
1237 while_directive:
1238 test [prefix_flags],1
1239 jnz unexpected_instruction
1240 call allocate_structure_data
1241 mov word [ebx],while_directive-instruction_handler
1242 mov eax,1
1243 xchg eax,[counter]
1244 mov [ebx+10h],eax
1245 mov [ebx+8],esi
1246 mov eax,[current_line]
1247 mov [ebx+4],eax
1248 do_while:
1249 push ebx
1250 call calculate_logical_expression
1251 or al,al
1252 jnz while_true
1253 mov al,[esi]
1254 or al,al
1255 jz missing_end_directive
1256 cmp al,0Fh
1257 jne extra_characters_on_line
1258 stop_while:
1259 call find_end_while
1260 pop ebx
1261 mov eax,[ebx+10h]
1262 mov [counter],eax
1263 call remove_structure_data
1264 jmp instruction_assembled
1265 while_true:
1266 pop ebx
1267 jmp instruction_assembled
1268 end_while:
1269 test [prefix_flags],1
1270 jnz unexpected_instruction
1271 call find_structure_data
1272 jc unexpected_instruction
1273 mov eax,[ebx+4]
1274 mov [current_line],eax
1275 inc [counter]
1276 jz too_many_repeats
1277 mov esi,[ebx+8]
1278 jmp do_while
1279 find_end_while:
1280 call find_structure_end
1281 cmp ax,while_directive-instruction_handler
1282 jne unexpected_instruction
1283 ret
1284 if_directive:
1285 test [prefix_flags],1
1286 jnz unexpected_instruction
1287 call calculate_logical_expression
1288 mov dl,al
1289 mov al,[esi]
1290 or al,al
1291 jz missing_end_directive
1292 cmp al,0Fh
1293 jne extra_characters_on_line
1294 or dl,dl
1295 jnz if_true
1296 call find_else
1297 jc instruction_assembled
1298 mov al,[esi]
1299 cmp al,1
1300 jne else_true
1301 cmp word [esi+1],if_directive-instruction_handler
1302 jne else_true
1303 add esi,4
1304 jmp if_directive
1305 if_true:
1306 xor al,al
1307 make_if_structure:
1308 call allocate_structure_data
1309 mov word [ebx],if_directive-instruction_handler
1310 mov byte [ebx+2],al
1311 mov eax,[current_line]
1312 mov [ebx+4],eax
1313 jmp instruction_assembled
1314 else_true:
1315 or al,al
1316 jz missing_end_directive
1317 cmp al,0Fh
1318 jne extra_characters_on_line
1319 or al,-1
1320 jmp make_if_structure
1321 else_directive:
1322 test [prefix_flags],1
1323 jnz unexpected_instruction
1324 mov ax,if_directive-instruction_handler
1325 call find_structure_data
1326 jc unexpected_instruction
1327 cmp byte [ebx+2],0
1328 jne unexpected_instruction
1329 found_else:
1330 mov al,[esi]
1331 cmp al,1
1332 jne skip_else
1333 cmp word [esi+1],if_directive-instruction_handler
1334 jne skip_else
1335 add esi,4
1336 call find_else
1337 jnc found_else
1338 call remove_structure_data
1339 jmp instruction_assembled
1340 skip_else:
1341 or al,al
1342 jz missing_end_directive
1343 cmp al,0Fh
1344 jne extra_characters_on_line
1345 call find_end_if
1346 call remove_structure_data
1347 jmp instruction_assembled
1348 end_if:
1349 test [prefix_flags],1
1350 jnz unexpected_instruction
1351 call find_structure_data
1352 jc unexpected_instruction
1353 call remove_structure_data
1354 jmp instruction_assembled
1355 find_else:
1356 call find_structure_end
1357 cmp ax,else_directive-instruction_handler
1358 je else_found
1359 cmp ax,if_directive-instruction_handler
1360 jne unexpected_instruction
1361 stc
1362 ret
1363 else_found:
1364 clc
1365 ret
1366 find_end_if:
1367 call find_structure_end
1368 cmp ax,if_directive-instruction_handler
1369 jne unexpected_instruction
1370 ret
1371 find_structure_end:
1372 push [error_line]
1373 mov eax,[current_line]
1374 mov [error_line],eax
1375 find_end_directive:
1376 call skip_symbol
1377 jnc find_end_directive
1378 lods byte [esi]
1379 cmp al,0Fh
1380 jne no_end_directive
1381 lods dword [esi]
1382 mov [current_line],eax
1383 skip_labels:
1384 cmp byte [esi],2
1385 jne labels_ok
1386 add esi,6
1387 jmp skip_labels
1388 labels_ok:
1389 cmp byte [esi],1
1390 jne find_end_directive
1391 mov ax,[esi+1]
1392 cmp ax,prefix_instruction-instruction_handler
1393 je find_end_directive
1394 add esi,4
1395 cmp ax,repeat_directive-instruction_handler
1396 je skip_repeat
1397 cmp ax,while_directive-instruction_handler
1398 je skip_while
1399 cmp ax,if_directive-instruction_handler
1400 je skip_if
1401 cmp ax,else_directive-instruction_handler
1402 je structure_end
1403 cmp ax,end_directive-instruction_handler
1404 jne find_end_directive
1405 cmp byte [esi],1
1406 jne find_end_directive
1407 mov ax,[esi+1]
1408 add esi,4
1409 cmp ax,repeat_directive-instruction_handler
1410 je structure_end
1411 cmp ax,while_directive-instruction_handler
1412 je structure_end
1413 cmp ax,if_directive-instruction_handler
1414 jne find_end_directive
1415 structure_end:
1416 pop [error_line]
1417 ret
1418 no_end_directive:
1419 mov eax,[error_line]
1420 mov [current_line],eax
1421 jmp missing_end_directive
1422 skip_repeat:
1423 call find_end_repeat
1424 jmp find_end_directive
1425 skip_while:
1426 call find_end_while
1427 jmp find_end_directive
1428 skip_if:
1429 call skip_if_block
1430 jmp find_end_directive
1431 skip_if_block:
1432 call find_else
1433 jc if_block_skipped
1434 cmp byte [esi],1
1435 jne skip_after_else
1436 cmp word [esi+1],if_directive-instruction_handler
1437 jne skip_after_else
1438 add esi,4
1439 jmp skip_if_block
1440 skip_after_else:
1441 call find_end_if
1442 if_block_skipped:
1443 ret
1444 end_directive:
1445 lods byte [esi]
1446 cmp al,1
1447 jne invalid_argument
1448 lods word [esi]
1449 inc esi
1450 cmp ax,virtual_directive-instruction_handler
1451 je end_virtual
1452 cmp ax,repeat_directive-instruction_handler
1453 je end_repeat
1454 cmp ax,while_directive-instruction_handler
1455 je end_while
1456 cmp ax,if_directive-instruction_handler
1457 je end_if
1458 cmp ax,data_directive-instruction_handler
1459 je end_data
1460 jmp invalid_argument
1461 break_directive:
1462 mov ebx,[structures_buffer]
1463 mov al,[esi]
1464 or al,al
1465 jz find_breakable_structure
1466 cmp al,0Fh
1467 jne extra_characters_on_line
1468 find_breakable_structure:
1469 cmp ebx,[additional_memory_end]
1470 je unexpected_instruction
1471 mov ax,[ebx]
1472 cmp ax,repeat_directive-instruction_handler
1473 je break_repeat
1474 cmp ax,while_directive-instruction_handler
1475 je break_while
1476 cmp ax,if_directive-instruction_handler
1477 je break_if
1478 add ebx,18h
1479 jmp find_breakable_structure
1480 break_if:
1481 push [current_line]
1482 mov eax,[ebx+4]
1483 mov [current_line],eax
1484 call remove_structure_data
1485 call skip_if_block
1486 pop [current_line]
1487 mov ebx,[structures_buffer]
1488 jmp find_breakable_structure
1489 break_repeat:
1490 push ebx
1491 call find_end_repeat
1492 pop ebx
1493 jmp stop_repeat
1494 break_while:
1495 push ebx
1496 jmp stop_while
1497
1498 define_data:
1499 cmp edi,[tagged_blocks]
1500 jae out_of_memory
1501 cmp byte [esi],'('
1502 jne simple_data_value
1503 mov ebx,esi
1504 inc esi
1505 call skip_expression
1506 xchg esi,ebx
1507 cmp byte [ebx],81h
1508 jne simple_data_value
1509 inc esi
1510 call get_count_value
1511 inc esi
1512 or eax,eax
1513 jz duplicate_zero_times
1514 cmp byte [esi],91h
1515 jne duplicate_single_data_value
1516 inc esi
1517 duplicate_data:
1518 push eax esi
1519 duplicated_values:
1520 cmp edi,[tagged_blocks]
1521 jae out_of_memory
1522 clc
1523 call near dword [esp+8]
1524 lods byte [esi]
1525 cmp al,','
1526 je duplicated_values
1527 cmp al,92h
1528 jne invalid_argument
1529 pop ebx eax
1530 dec eax
1531 jz data_defined
1532 mov esi,ebx
1533 jmp duplicate_data
1534 duplicate_single_data_value:
1535 cmp edi,[tagged_blocks]
1536 jae out_of_memory
1537 push eax esi
1538 clc
1539 call near dword [esp+8]
1540 pop ebx eax
1541 dec eax
1542 jz data_defined
1543 mov esi,ebx
1544 jmp duplicate_single_data_value
1545 duplicate_zero_times:
1546 cmp byte [esi],91h
1547 jne skip_single_data_value
1548 inc esi
1549 skip_data_value:
1550 call skip_symbol
1551 jc invalid_argument
1552 cmp byte [esi],92h
1553 jne skip_data_value
1554 inc esi
1555 jmp data_defined
1556 skip_single_data_value:
1557 call skip_symbol
1558 jmp data_defined
1559 simple_data_value:
1560 cmp edi,[tagged_blocks]
1561 jae out_of_memory
1562 clc
1563 call near dword [esp]
1564 data_defined:
1565 lods byte [esi]
1566 cmp al,','
1567 je define_data
1568 dec esi
1569 stc
1570 ret
1571 data_bytes:
1572 call define_data
1573 jc instruction_assembled
1574 lods byte [esi]
1575 cmp al,'('
1576 je get_byte
1577 cmp al,'?'
1578 jne invalid_argument
1579 mov eax,edi
1580 mov byte [edi],0
1581 inc edi
1582 jmp undefined_data
1583 get_byte:
1584 cmp byte [esi],0
1585 je get_string
1586 call get_byte_value
1587 stos byte [edi]
1588 ret
1589 get_string:
1590 inc esi
1591 lods dword [esi]
1592 mov ecx,eax
1593 lea eax,[edi+ecx]
1594 cmp eax,[tagged_blocks]
1595 ja out_of_memory
1596 rep movs byte [edi],[esi]
1597 inc esi
1598 ret
1599 undefined_data:
1600 mov ebp,[addressing_space]
1601 test byte [ds:ebp+0Ah],1
1602 jz mark_undefined_data
1603 ret
1604 mark_undefined_data:
1605 cmp eax,[undefined_data_end]
1606 je undefined_data_ok
1607 mov [undefined_data_start],eax
1608 undefined_data_ok:
1609 mov [undefined_data_end],edi
1610 ret
1611 data_unicode:
1612 or [base_code],-1
1613 jmp define_words
1614 data_words:
1615 mov [base_code],0
1616 define_words:
1617 call define_data
1618 jc instruction_assembled
1619 lods byte [esi]
1620 cmp al,'('
1621 je get_word
1622 cmp al,'?'
1623 jne invalid_argument
1624 mov eax,edi
1625 and word [edi],0
1626 scas word [edi]
1627 jmp undefined_data
1628 ret
1629 get_word:
1630 cmp [base_code],0
1631 je word_data_value
1632 cmp byte [esi],0
1633 je word_string
1634 word_data_value:
1635 call get_word_value
1636 call mark_relocation
1637 stos word [edi]
1638 ret
1639 word_string:
1640 inc esi
1641 lods dword [esi]
1642 mov ecx,eax
1643 jecxz word_string_ok
1644 lea eax,[edi+ecx*2]
1645 cmp eax,[tagged_blocks]
1646 ja out_of_memory
1647 xor ah,ah
1648 copy_word_string:
1649 lods byte [esi]
1650 stos word [edi]
1651 loop copy_word_string
1652 word_string_ok:
1653 inc esi
1654 ret
1655 data_dwords:
1656 call define_data
1657 jc instruction_assembled
1658 lods byte [esi]
1659 cmp al,'('
1660 je get_dword
1661 cmp al,'?'
1662 jne invalid_argument
1663 mov eax,edi
1664 and dword [edi],0
1665 scas dword [edi]
1666 jmp undefined_data
1667 get_dword:
1668 push esi
1669 call get_dword_value
1670 pop ebx
1671 cmp byte [esi],':'
1672 je complex_dword
1673 call mark_relocation
1674 stos dword [edi]
1675 ret
1676 complex_dword:
1677 mov esi,ebx
1678 cmp byte [esi],'.'
1679 je invalid_value
1680 call get_word_value
1681 push eax
1682 inc esi
1683 lods byte [esi]
1684 cmp al,'('
1685 jne invalid_operand
1686 mov al,[value_type]
1687 push eax
1688 cmp byte [esi],'.'
1689 je invalid_value
1690 call get_word_value
1691 call mark_relocation
1692 stos word [edi]
1693 pop eax
1694 mov [value_type],al
1695 pop eax
1696 call mark_relocation
1697 stos word [edi]
1698 ret
1699 data_pwords:
1700 call define_data
1701 jc instruction_assembled
1702 lods byte [esi]
1703 cmp al,'('
1704 je get_pword
1705 cmp al,'?'
1706 jne invalid_argument
1707 mov eax,edi
1708 and dword [edi],0
1709 scas dword [edi]
1710 and word [edi],0
1711 scas word [edi]
1712 jmp undefined_data
1713 get_pword:
1714 push esi
1715 call get_pword_value
1716 pop ebx
1717 cmp byte [esi],':'
1718 je complex_pword
1719 call mark_relocation
1720 stos dword [edi]
1721 mov ax,dx
1722 stos word [edi]
1723 ret
1724 complex_pword:
1725 mov esi,ebx
1726 cmp byte [esi],'.'
1727 je invalid_value
1728 call get_word_value
1729 push eax
1730 inc esi
1731 lods byte [esi]
1732 cmp al,'('
1733 jne invalid_operand
1734 mov al,[value_type]
1735 push eax
1736 cmp byte [esi],'.'
1737 je invalid_value
1738 call get_dword_value
1739 call mark_relocation
1740 stos dword [edi]
1741 pop eax
1742 mov [value_type],al
1743 pop eax
1744 call mark_relocation
1745 stos word [edi]
1746 ret
1747 data_qwords:
1748 call define_data
1749 jc instruction_assembled
1750 lods byte [esi]
1751 cmp al,'('
1752 je get_qword
1753 cmp al,'?'
1754 jne invalid_argument
1755 mov eax,edi
1756 and dword [edi],0
1757 scas dword [edi]
1758 and dword [edi],0
1759 scas dword [edi]
1760 jmp undefined_data
1761 get_qword:
1762 call get_qword_value
1763 call mark_relocation
1764 stos dword [edi]
1765 mov eax,edx
1766 stos dword [edi]
1767 ret
1768 data_twords:
1769 call define_data
1770 jc instruction_assembled
1771 lods byte [esi]
1772 cmp al,'('
1773 je get_tword
1774 cmp al,'?'
1775 jne invalid_argument
1776 mov eax,edi
1777 and dword [edi],0
1778 scas dword [edi]
1779 and dword [edi],0
1780 scas dword [edi]
1781 and word [edi],0
1782 scas word [edi]
1783 jmp undefined_data
1784 get_tword:
1785 cmp byte [esi],'.'
1786 jne complex_tword
1787 inc esi
1788 cmp word [esi+8],8000h
1789 je fp_zero_tword
1790 mov eax,[esi]
1791 stos dword [edi]
1792 mov eax,[esi+4]
1793 stos dword [edi]
1794 mov ax,[esi+8]
1795 add ax,3FFFh
1796 jo value_out_of_range
1797 cmp ax,7FFFh
1798 jge value_out_of_range
1799 cmp ax,0
1800 jg tword_exp_ok
1801 mov cx,ax
1802 neg cx
1803 inc cx
1804 cmp cx,64
1805 jae value_out_of_range
1806 cmp cx,32
1807 ja large_shift
1808 mov eax,[esi]
1809 mov edx,[esi+4]
1810 mov ebx,edx
1811 shr edx,cl
1812 shrd eax,ebx,cl
1813 jmp tword_mantissa_shift_done
1814 large_shift:
1815 sub cx,32
1816 xor edx,edx
1817 mov eax,[esi+4]
1818 shr eax,cl
1819 tword_mantissa_shift_done:
1820 jnc store_shifted_mantissa
1821 add eax,1
1822 adc edx,0
1823 store_shifted_mantissa:
1824 mov [edi-8],eax
1825 mov [edi-4],edx
1826 xor ax,ax
1827 test edx,1 shl 31
1828 jz tword_exp_ok
1829 inc ax
1830 tword_exp_ok:
1831 mov bl,[esi+11]
1832 shl bx,15
1833 or ax,bx
1834 stos word [edi]
1835 add esi,13
1836 ret
1837 fp_zero_tword:
1838 xor eax,eax
1839 stos dword [edi]
1840 stos dword [edi]
1841 mov al,[esi+11]
1842 shl ax,15
1843 stos word [edi]
1844 add esi,13
1845 ret
1846 complex_tword:
1847 call get_word_value
1848 push eax
1849 cmp byte [esi],':'
1850 jne invalid_operand
1851 inc esi
1852 lods byte [esi]
1853 cmp al,'('
1854 jne invalid_operand
1855 mov al,[value_type]
1856 push eax
1857 cmp byte [esi],'.'
1858 je invalid_value
1859 call get_qword_value
1860 call mark_relocation
1861 stos dword [edi]
1862 mov eax,edx
1863 stos dword [edi]
1864 pop eax
1865 mov [value_type],al
1866 pop eax
1867 call mark_relocation
1868 stos word [edi]
1869 ret
1870 data_file:
1871 lods word [esi]
1872 cmp ax,'('
1873 jne invalid_argument
1874 add esi,4
1875 call open_binary_file
1876 mov eax,[esi-4]
1877 lea esi,[esi+eax+1]
1878 mov al,2
1879 xor edx,edx
1880 call lseek
1881 push eax
1882 xor edx,edx
1883 cmp byte [esi],':'
1884 jne position_ok
1885 inc esi
1886 cmp byte [esi],'('
1887 jne invalid_argument
1888 inc esi
1889 cmp byte [esi],'.'
1890 je invalid_value
1891 push ebx
1892 call get_count_value
1893 pop ebx
1894 mov edx,eax
1895 sub [esp],edx
1896 jc value_out_of_range
1897 position_ok:
1898 cmp byte [esi],','
1899 jne size_ok
1900 inc esi
1901 cmp byte [esi],'('
1902 jne invalid_argument
1903 inc esi
1904 cmp byte [esi],'.'
1905 je invalid_value
1906 push ebx edx
1907 call get_count_value
1908 pop edx ebx
1909 cmp eax,[esp]
1910 ja value_out_of_range
1911 mov [esp],eax
1912 size_ok:
1913 xor al,al
1914 call lseek
1915 pop ecx
1916 mov edx,edi
1917 add edi,ecx
1918 jc out_of_memory
1919 cmp edi,[tagged_blocks]
1920 ja out_of_memory
1921 call read
1922 jc error_reading_file
1923 call close
1924 lods byte [esi]
1925 cmp al,','
1926 je data_file
1927 dec esi
1928 jmp instruction_assembled
1929 open_binary_file:
1930 push esi
1931 push edi
1932 mov eax,[current_line]
1933 find_current_source_path:
1934 mov esi,[eax]
1935 test byte [eax+7],80h
1936 jz get_current_path
1937 mov eax,[eax+8]
1938 jmp find_current_source_path
1939 get_current_path:
1940 lodsb
1941 stosb
1942 or al,al
1943 jnz get_current_path
1944 cut_current_path:
1945 cmp edi,[esp]
1946 je current_path_ok
1947 cmp byte [edi-1],'\'
1948 je current_path_ok
1949 cmp byte [edi-1],'/'
1950 je current_path_ok
1951 dec edi
1952 jmp cut_current_path
1953 current_path_ok:
1954 mov esi,[esp+4]
1955 call expand_path
1956 pop edx
1957 mov esi,edx
1958 call open
1959 jnc file_opened
1960 mov edx,[include_paths]
1961 search_in_include_paths:
1962 push edx esi
1963 mov edi,esi
1964 mov esi,[esp+4]
1965 call get_include_directory
1966 mov [esp+4],esi
1967 mov esi,[esp+8]
1968 call expand_path
1969 pop edx
1970 mov esi,edx
1971 call open
1972 pop edx
1973 jnc file_opened
1974 cmp byte [edx],0
1975 jne search_in_include_paths
1976 mov edi,esi
1977 mov esi,[esp]
1978 push edi
1979 call expand_path
1980 pop edx
1981 mov esi,edx
1982 call open
1983 jc file_not_found
1984 file_opened:
1985 mov edi,esi
1986 pop esi
1987 ret
1988 reserve_bytes:
1989 lods byte [esi]
1990 cmp al,'('
1991 jne invalid_argument
1992 cmp byte [esi],'.'
1993 je invalid_value
1994 call get_count_value
1995 mov ecx,eax
1996 mov edx,ecx
1997 add edx,edi
1998 jc out_of_memory
1999 cmp edx,[tagged_blocks]
2000 ja out_of_memory
2001 push edi
2002 cmp [next_pass_needed],0
2003 je zero_bytes
2004 add edi,ecx
2005 jmp reserved_data
2006 zero_bytes:
2007 xor eax,eax
2008 shr ecx,1
2009 jnc bytes_stosb_ok
2010 stos byte [edi]
2011 bytes_stosb_ok:
2012 shr ecx,1
2013 jnc bytes_stosw_ok
2014 stos word [edi]
2015 bytes_stosw_ok:
2016 rep stos dword [edi]
2017 reserved_data:
2018 pop eax
2019 call undefined_data
2020 jmp instruction_assembled
2021 reserve_words:
2022 lods byte [esi]
2023 cmp al,'('
2024 jne invalid_argument
2025 cmp byte [esi],'.'
2026 je invalid_value
2027 call get_count_value
2028 mov ecx,eax
2029 mov edx,ecx
2030 shl edx,1
2031 jc out_of_memory
2032 add edx,edi
2033 jc out_of_memory
2034 cmp edx,[tagged_blocks]
2035 ja out_of_memory
2036 push edi
2037 cmp [next_pass_needed],0
2038 je zero_words
2039 lea edi,[edi+ecx*2]
2040 jmp reserved_data
2041 zero_words:
2042 xor eax,eax
2043 shr ecx,1
2044 jnc words_stosw_ok
2045 stos word [edi]
2046 words_stosw_ok:
2047 rep stos dword [edi]
2048 jmp reserved_data
2049 reserve_dwords:
2050 lods byte [esi]
2051 cmp al,'('
2052 jne invalid_argument
2053 cmp byte [esi],'.'
2054 je invalid_value
2055 call get_count_value
2056 mov ecx,eax
2057 mov edx,ecx
2058 shl edx,1
2059 jc out_of_memory
2060 shl edx,1
2061 jc out_of_memory
2062 add edx,edi
2063 jc out_of_memory
2064 cmp edx,[tagged_blocks]
2065 ja out_of_memory
2066 push edi
2067 cmp [next_pass_needed],0
2068 je zero_dwords
2069 lea edi,[edi+ecx*4]
2070 jmp reserved_data
2071 zero_dwords:
2072 xor eax,eax
2073 rep stos dword [edi]
2074 jmp reserved_data
2075 reserve_pwords:
2076 lods byte [esi]
2077 cmp al,'('
2078 jne invalid_argument
2079 cmp byte [esi],'.'
2080 je invalid_value
2081 call get_count_value
2082 mov ecx,eax
2083 shl ecx,1
2084 jc out_of_memory
2085 add ecx,eax
2086 mov edx,ecx
2087 shl edx,1
2088 jc out_of_memory
2089 add edx,edi
2090 jc out_of_memory
2091 cmp edx,[tagged_blocks]
2092 ja out_of_memory
2093 push edi
2094 cmp [next_pass_needed],0
2095 je zero_words
2096 lea edi,[edi+ecx*2]
2097 jmp reserved_data
2098 reserve_qwords:
2099 lods byte [esi]
2100 cmp al,'('
2101 jne invalid_argument
2102 cmp byte [esi],'.'
2103 je invalid_value
2104 call get_count_value
2105 mov ecx,eax
2106 shl ecx,1
2107 jc out_of_memory
2108 mov edx,ecx
2109 shl edx,1
2110 jc out_of_memory
2111 shl edx,1
2112 jc out_of_memory
2113 add edx,edi
2114 jc out_of_memory
2115 cmp edx,[tagged_blocks]
2116 ja out_of_memory
2117 push edi
2118 cmp [next_pass_needed],0
2119 je zero_dwords
2120 lea edi,[edi+ecx*4]
2121 jmp reserved_data
2122 reserve_twords:
2123 lods byte [esi]
2124 cmp al,'('
2125 jne invalid_argument
2126 cmp byte [esi],'.'
2127 je invalid_value
2128 call get_count_value
2129 mov ecx,eax
2130 shl ecx,2
2131 jc out_of_memory
2132 add ecx,eax
2133 mov edx,ecx
2134 shl edx,1
2135 jc out_of_memory
2136 add edx,edi
2137 jc out_of_memory
2138 cmp edx,[tagged_blocks]
2139 ja out_of_memory
2140 push edi
2141 cmp [next_pass_needed],0
2142 je zero_words
2143 lea edi,[edi+ecx*2]
2144 jmp reserved_data
2145 align_directive:
2146 lods byte [esi]
2147 cmp al,'('
2148 jne invalid_argument
2149 cmp byte [esi],'.'
2150 je invalid_value
2151 call get_count_value
2152 mov edx,eax
2153 dec edx
2154 test eax,edx
2155 jnz invalid_align_value
2156 or eax,eax
2157 jz invalid_align_value
2158 cmp eax,1
2159 je instruction_assembled
2160 mov ecx,edi
2161 mov ebp,[addressing_space]
2162 sub ecx,[ds:ebp]
2163 cmp dword [ds:ebp+10h],0
2164 jne section_not_aligned_enough
2165 cmp byte [ds:ebp+9],0
2166 je make_alignment
2167 cmp [output_format],3
2168 je pe_alignment
2169 cmp [output_format],5
2170 jne object_alignment
2171 test [format_flags],1
2172 jnz pe_alignment
2173 object_alignment:
2174 mov ebx,[ds:ebp+14h]
2175 cmp byte [ebx],0
2176 jne section_not_aligned_enough
2177 cmp eax,[ebx+10h]
2178 jbe make_alignment
2179 jmp section_not_aligned_enough
2180 pe_alignment:
2181 cmp eax,1000h
2182 ja section_not_aligned_enough
2183 make_alignment:
2184 dec eax
2185 and ecx,eax
2186 jz instruction_assembled
2187 neg ecx
2188 add ecx,eax
2189 inc ecx
2190 mov edx,ecx
2191 add edx,edi
2192 jc out_of_memory
2193 cmp edx,[tagged_blocks]
2194 ja out_of_memory
2195 push edi
2196 cmp [next_pass_needed],0
2197 je nops
2198 add edi,ecx
2199 jmp reserved_data
2200 invalid_align_value:
2201 cmp [error_line],0
2202 jne instruction_assembled
2203 mov eax,[current_line]
2204 mov [error_line],eax
2205 mov [error],invalid_value
2206 jmp instruction_assembled
2207 nops:
2208 mov eax,90909090h
2209 shr ecx,1
2210 jnc nops_stosb_ok
2211 stos byte [edi]
2212 nops_stosb_ok:
2213 shr ecx,1
2214 jnc nops_stosw_ok
2215 stos word [edi]
2216 nops_stosw_ok:
2217 rep stos dword [edi]
2218 jmp reserved_data
2219 err_directive:
2220 mov al,[esi]
2221 cmp al,0Fh
2222 je invoked_error
2223 or al,al
2224 jz invoked_error
2225 jmp extra_characters_on_line
2226 assert_directive:
2227 call calculate_logical_expression
2228 or al,al
2229 jnz instruction_assembled
2230 cmp [error_line],0
2231 jne instruction_assembled
2232 mov eax,[current_line]
2233 mov [error_line],eax
2234 mov [error],assertion_failed
2235 jmp instruction_assembled