Rev 2665 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2665 | Rev 4039 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | ; flat assembler core |
1 | ; flat assembler core |
2 | ; Copyright (c) 1999-2012, Tomasz Grysztar. |
2 | ; Copyright (c) 1999-2013, 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 62... | Line 62... | ||
62 | jmp parse_next_line |
62 | jmp parse_next_line |
63 | simple_label: |
63 | simple_label: |
64 | pop edi |
64 | pop edi |
65 | call identify_label |
65 | call identify_label |
66 | mov byte [edi],2 |
66 | cmp byte [esi+1],':' |
- | 67 | je block_label |
|
- | 68 | mov byte [edi],2 |
|
67 | inc edi |
69 | inc edi |
68 | stos dword [edi] |
70 | stos dword [edi] |
69 | inc esi |
71 | inc esi |
70 | xor al,al |
72 | xor al,al |
71 | stos byte [edi] |
73 | stos byte [edi] |
72 | jmp parse_line |
74 | jmp parse_line |
73 | constant_label: |
75 | block_label: |
- | 76 | mov byte [edi],4 |
|
- | 77 | inc edi |
|
- | 78 | stos dword [edi] |
|
- | 79 | add esi,2 |
|
- | 80 | jmp parse_line |
|
- | 81 | constant_label: |
|
74 | pop edi |
82 | pop edi |
75 | call get_label_id |
83 | call get_label_id |
76 | mov byte [edi],3 |
84 | mov byte [edi],3 |
77 | inc edi |
85 | inc edi |
78 | stos dword [edi] |
86 | stos dword [edi] |
Line 125... | Line 133... | ||
125 | jz parse_next_line |
133 | jz parse_next_line |
126 | cmp al,':' |
134 | cmp al,':' |
127 | je invalid_name |
135 | je invalid_name |
128 | dec esi |
136 | dec esi |
129 | cmp al,3Bh |
137 | mov [parenthesis_stack],0 |
130 | je skip_rest_of_line |
- | |
131 | mov [parenthesis_stack],0 |
- | |
132 | call parse_argument |
138 | call parse_argument |
133 | jmp parse_next_line |
139 | jmp parse_next_line |
134 | empty_line: |
140 | empty_line: |
135 | add esi,16 |
141 | add esi,16 |
136 | skip_rest_of_line: |
142 | skip_rest_of_line: |
Line 528... | Line 534... | ||
528 | cmp al,'#' |
534 | cmp al,'#' |
529 | je unallowed_character |
535 | je unallowed_character |
530 | cmp al,'`' |
536 | cmp al,'`' |
531 | je unallowed_character |
537 | je unallowed_character |
532 | dec esi |
538 | cmp al,3Bh |
- | 539 | je foreign_argument |
|
- | 540 | dec esi |
|
533 | cmp al,1Ah |
541 | cmp al,1Ah |
534 | jne expression_argument |
542 | jne expression_argument |
535 | push edi |
543 | push edi |
536 | mov edi,directive_operators |
544 | mov edi,directive_operators |
537 | call get_operator |
545 | call get_operator |
Line 548... | Line 556... | ||
548 | jne check_argument |
556 | jne check_argument |
549 | pop edi |
557 | pop edi |
550 | movs byte [edi],[esi] |
558 | movs byte [edi],[esi] |
551 | jmp argument_parsed |
559 | jmp argument_parsed |
552 | symbol_argument: |
560 | foreign_argument: |
- | 561 | dec esi |
|
- | 562 | call skip_foreign_line |
|
- | 563 | jmp contents_parsed |
|
- | 564 | symbol_argument: |
|
553 | pop edi |
565 | pop edi |
554 | stos word [edi] |
566 | stos word [edi] |
555 | jmp argument_parsed |
567 | jmp argument_parsed |
556 | operator_argument: |
568 | operator_argument: |
557 | pop edi |
569 | pop edi |
558 | cmp al,85h |
570 | cmp al,85h |
559 | je ptr_argument |
571 | je ptr_argument |
560 | stos byte [edi] |
572 | stos byte [edi] |
561 | cmp al,80h |
573 | cmp al,80h |
562 | je forced_expression |
574 | je forced_multipart_expression |
563 | cmp al,8Ch |
575 | cmp al,8Ch |
564 | je forced_expression |
576 | je forced_expression |
565 | cmp al,81h |
577 | cmp al,81h |
566 | je forced_parenthesis |
578 | je forced_parenthesis |
567 | cmp al,82h |
579 | cmp al,82h |
568 | je parse_from_operator |
580 | je parse_from_operator |
Line 723... | Line 735... | ||
723 | stos byte [edi] |
735 | stos byte [edi] |
724 | jmp argument_parsed |
736 | jmp argument_parsed |
725 | parse_from_operator: |
737 | parse_from_operator: |
726 | cmp byte [esi],22h |
738 | cmp byte [esi],22h |
727 | jne forced_expression |
739 | jne forced_multipart_expression |
728 | jmp argument_parsed |
740 | jmp argument_parsed |
729 | parse_quoted_extrn: |
741 | parse_quoted_extrn: |
730 | inc esi |
742 | inc esi |
731 | mov ax,'(' |
743 | mov ax,'(' |
732 | stos word [edi] |
744 | stos word [edi] |
733 | lods dword [esi] |
745 | lods dword [esi] |
Line 769... | Line 781... | ||
769 | jne not_string |
781 | jne not_string |
770 | mov eax,[esi+1] |
782 | mov eax,[esi+1] |
771 | lea ebx,[esi+5+eax] |
783 | lea ebx,[esi+5+eax] |
772 | push ebx ecx esi edi |
784 | push ebx ecx esi edi |
773 | mov al,'(' |
785 | call parse_expression |
774 | stos byte [edi] |
- | |
775 | call convert_expression |
- | |
776 | mov al,')' |
786 | pop eax edx ecx ebx |
777 | stos byte [edi] |
- | |
778 | pop eax edx ecx ebx |
- | |
779 | cmp esi,ebx |
787 | cmp esi,ebx |
780 | jne expression_parsed |
788 | jne expression_argument_parsed |
781 | mov edi,eax |
789 | mov edi,eax |
782 | mov esi,edx |
790 | mov esi,edx |
783 | string_argument: |
791 | string_argument: |
784 | inc esi |
792 | inc esi |
785 | mov ax,'(' |
793 | mov ax,'(' |
786 | stos word [edi] |
794 | stos word [edi] |
Line 797... | Line 805... | ||
797 | string_movsw_ok: |
805 | string_movsw_ok: |
798 | rep movs dword [edi],[esi] |
806 | rep movs dword [edi],[esi] |
799 | xor al,al |
807 | xor al,al |
800 | stos byte [edi] |
808 | stos byte [edi] |
801 | jmp expression_parsed |
809 | jmp expression_argument_parsed |
802 | not_string: |
810 | parse_expression: |
- | 811 | mov al,'(' |
|
- | 812 | stos byte [edi] |
|
- | 813 | call convert_expression |
|
- | 814 | mov al,')' |
|
- | 815 | stos byte [edi] |
|
- | 816 | ret |
|
- | 817 | not_string: |
|
803 | cmp byte [esi],'(' |
818 | cmp byte [esi],'(' |
804 | jne expression |
819 | jne expression |
805 | mov eax,esp |
820 | mov eax,esp |
806 | sub eax,100h |
821 | sub eax,100h |
807 | jc stack_overflow |
822 | jc stack_overflow |
Line 836... | Line 851... | ||
836 | inc esi |
851 | inc esi |
837 | mov al,0F1h |
852 | mov al,0F1h |
838 | jmp expression_comparator |
853 | jmp expression_comparator |
839 | expression: |
854 | expression: |
840 | mov al,'(' |
855 | call parse_expression |
841 | stos byte [edi] |
- | |
842 | call convert_expression |
- | |
843 | mov al,')' |
856 | jmp expression_argument_parsed |
844 | stos byte [edi] |
- | |
845 | jmp expression_parsed |
- | |
846 | forced_expression: |
857 | forced_expression: |
847 | xor al,al |
858 | xor al,al |
848 | xchg al,[formatter_symbols_allowed] |
859 | xchg al,[formatter_symbols_allowed] |
849 | push eax |
860 | push eax |
850 | mov al,'(' |
861 | call parse_expression |
851 | stos byte [edi] |
- | |
852 | call convert_expression |
- | |
853 | mov al,')' |
862 | forced_expression_parsed: |
854 | stos byte [edi] |
- | |
855 | pop eax |
863 | pop eax |
856 | mov [formatter_symbols_allowed],al |
864 | mov [formatter_symbols_allowed],al |
857 | jmp argument_parsed |
865 | jmp argument_parsed |
858 | address_argument: |
866 | forced_multipart_expression: |
- | 867 | xor al,al |
|
- | 868 | xchg al,[formatter_symbols_allowed] |
|
- | 869 | push eax |
|
- | 870 | call parse_expression |
|
- | 871 | cmp byte [esi],':' |
|
- | 872 | jne forced_expression_parsed |
|
- | 873 | movs byte [edi],[esi] |
|
- | 874 | call parse_expression |
|
- | 875 | jmp forced_expression_parsed |
|
- | 876 | address_argument: |
|
859 | call parse_address |
877 | call parse_address |
860 | lods byte [esi] |
878 | lods byte [esi] |
861 | cmp al,']' |
879 | cmp al,']' |
862 | je address_parsed |
880 | je address_parsed |
863 | dec esi |
881 | dec esi |
Line 923... | Line 941... | ||
923 | je parse_argument |
941 | je parse_argument |
924 | dec [parenthesis_stack] |
942 | dec [parenthesis_stack] |
925 | add esp,8 |
943 | add esp,8 |
926 | jmp argument_parsed |
944 | jmp argument_parsed |
927 | expression_parsed: |
945 | expression_argument_parsed: |
928 | cmp [parenthesis_stack],0 |
946 | cmp [parenthesis_stack],0 |
929 | je parse_argument |
947 | je parse_argument |
930 | cmp byte [esi],')' |
948 | cmp byte [esi],')' |
931 | jne argument_parsed |
949 | jne argument_parsed |
932 | dec [parenthesis_stack] |
950 | dec [parenthesis_stack] |
933 | pop edi esi |
951 | pop edi esi |