Rev 31 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 31 | Rev 109 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | ; flat assembler core |
1 | ; flat assembler core |
2 | ; Copyright (c) 1999-2005, Tomasz Grysztar. |
2 | ; Copyright (c) 1999-2006, Tomasz Grysztar. |
3 | ; All rights reserved. |
3 | ; All rights reserved. |
Line 4... | Line 4... | ||
4 | 4 | ||
5 | convert_expression: |
5 | convert_expression: |
6 | push ebp |
6 | push ebp |
7 | call get_fp_value |
7 | call get_fp_value |
8 | jnc fp_expression |
8 | jnc fp_expression |
9 | mov ebp,esp |
9 | mov [current_offset],esp |
10 | expression_loop: |
10 | expression_loop: |
11 | push ebp edi |
11 | push edi |
12 | mov edi,single_operand_operators |
12 | mov edi,single_operand_operators |
13 | call get_operator |
13 | call get_operator |
- | 14 | pop edi |
|
- | 15 | or al,al |
|
14 | pop edi |
16 | jz expression_element |
- | 17 | push eax |
|
- | 18 | jmp expression_loop |
|
15 | push eax |
19 | expression_element: |
16 | mov al,[esi] |
20 | mov al,[esi] |
17 | cmp al,1Ah |
21 | cmp al,1Ah |
18 | je expression_number |
22 | je expression_number |
19 | cmp al,22h |
23 | cmp al,22h |
20 | je expression_number |
24 | je expression_number |
21 | cmp al,'(' |
25 | cmp al,'(' |
22 | je expression_number |
26 | je expression_number |
23 | mov al,11h |
27 | mov al,'!' |
24 | stos byte [edi] |
- | |
25 | or eax,-1 |
- | |
26 | stos dword [edi] |
28 | stos byte [edi] |
27 | jmp expression_number_ok |
29 | jmp expression_operator |
28 | expression_number: |
30 | expression_number: |
29 | call convert_number |
- | |
30 | expression_number_ok: |
- | |
31 | pop eax |
- | |
32 | or al,al |
- | |
33 | jz expression_operator |
- | |
34 | stos byte [edi] |
31 | call convert_number |
35 | expression_operator: |
32 | expression_operator: |
36 | push edi |
33 | push edi |
37 | mov edi,operators |
34 | mov edi,operators |
38 | call get_operator |
35 | call get_operator |
39 | pop edi ebp |
36 | pop edi |
40 | or al,al |
37 | or al,al |
41 | jz expression_end |
38 | jz expression_end |
42 | operators_loop: |
39 | operators_loop: |
43 | cmp esp,ebp |
40 | cmp esp,[current_offset] |
44 | je push_operator |
41 | je push_operator |
45 | mov bl,al |
42 | mov bl,al |
46 | and bl,0F0h |
43 | and bl,0F0h |
47 | mov bh,byte [esp] |
44 | mov bh,byte [esp] |
Line 55... | Line 52... | ||
55 | push_operator: |
52 | push_operator: |
56 | push eax |
53 | push eax |
57 | jmp expression_loop |
54 | jmp expression_loop |
58 | expression_end: |
55 | expression_end: |
59 | cmp esp,ebp |
56 | cmp esp,[current_offset] |
60 | je expression_converted |
57 | je expression_converted |
61 | pop eax |
58 | pop eax |
62 | stos byte [edi] |
59 | stos byte [edi] |
63 | jmp expression_end |
60 | jmp expression_end |
64 | expression_converted: |
61 | expression_converted: |
65 | pop ebp |
62 | pop ebp |
Line 76... | Line 73... | ||
76 | pop ebp |
73 | pop ebp |
77 | ret |
74 | ret |
78 | 75 | ||
Line 79... | Line 76... | ||
79 | convert_number: |
76 | convert_number: |
- | 77 | lea eax,[edi-10h] |
|
- | 78 | cmp eax,[labels_list] |
|
- | 79 | jae out_of_memory |
|
80 | cmp byte [esi],'(' |
80 | cmp byte [esi],'(' |
81 | je expression_value |
81 | je expression_value |
82 | inc edi |
82 | inc edi |
83 | call get_number |
83 | call get_number |
84 | jc symbol_value |
84 | jc symbol_value |
Line 115... | Line 115... | ||
115 | jc stack_overflow |
115 | jc stack_overflow |
116 | cmp eax,[stack_limit] |
116 | cmp eax,[stack_limit] |
117 | jb stack_overflow |
117 | jb stack_overflow |
118 | inc esi |
118 | inc esi |
119 | call convert_expression |
119 | push [current_offset] |
- | 120 | call convert_expression |
|
120 | lods byte [esi] |
121 | pop [current_offset] |
- | 122 | lods byte [esi] |
|
121 | cmp al,')' |
123 | cmp al,')' |
122 | jne invalid_expression |
124 | jne invalid_expression |
123 | ret |
125 | ret |
124 | symbol_value: |
126 | symbol_value: |
125 | lods byte [esi] |
127 | push edi |
- | 128 | mov edi,address_registers |
|
- | 129 | call get_operator |
|
- | 130 | or al,al |
|
- | 131 | jnz register_value |
|
- | 132 | mov edi,directive_operators |
|
- | 133 | call get_operator |
|
- | 134 | pop edi |
|
- | 135 | or al,al |
|
- | 136 | jnz broken_value |
|
- | 137 | lods byte [esi] |
|
126 | cmp al,1Ah |
138 | cmp al,1Ah |
127 | jne invalid_value |
139 | jne invalid_value |
128 | lods byte [esi] |
140 | lods byte [esi] |
129 | movzx ecx,al |
141 | movzx ecx,al |
130 | push ecx esi edi |
142 | call get_label_id |
131 | mov edi,address_registers |
- | |
132 | call get_symbol |
- | |
133 | jnc register_value |
- | |
134 | mov edi,directive_operators |
- | |
135 | call get_symbol |
- | |
136 | pop edi esi ecx |
- | |
137 | jnc broken_value |
- | |
138 | call get_label_id |
- | |
139 | store_label_value: |
143 | store_label_value: |
140 | mov byte [edi-1],11h |
144 | mov byte [edi-1],11h |
141 | stos dword [edi] |
145 | stos dword [edi] |
142 | ret |
146 | ret |
143 | broken_value: |
147 | broken_value: |
144 | sub esi,2 |
148 | mov eax,0Fh |
145 | or eax,-1 |
- | |
146 | jmp store_label_value |
149 | jmp store_label_value |
147 | register_value: |
150 | register_value: |
148 | pop edi |
151 | pop edi |
149 | add esp,8 |
152 | mov byte [edi-1],10h |
150 | mov byte [edi-1],10h |
- | |
151 | mov al,ah |
153 | stos byte [edi] |
152 | stos byte [edi] |
- | |
153 | ret |
154 | ret |
154 | 155 | ||
Line 155... | Line 156... | ||
155 | get_number: |
156 | get_number: |
156 | xor ebp,ebp |
157 | xor ebp,ebp |
Line 449... | Line 450... | ||
449 | not_fp_value: |
450 | not_fp_value: |
450 | pop esi edi |
451 | pop esi edi |
451 | stc |
452 | stc |
452 | ret |
453 | ret |
453 | fp_character_exp: |
454 | fp_last_character: |
- | 455 | cmp cl,1 |
|
- | 456 | jne not_fp_value |
|
- | 457 | or ah,4 |
|
- | 458 | jmp fp_character_ok |
|
- | 459 | fp_character_exp: |
|
454 | cmp esi,edx |
460 | cmp esi,edx |
455 | je not_fp_value |
461 | je not_fp_value |
456 | cmp ah,1 |
462 | cmp ah,1 |
457 | ja not_fp_value |
463 | ja not_fp_value |
458 | or ah,2 |
464 | or ah,2 |
Line 461... | Line 467... | ||
461 | cmp byte [esi],'+' |
467 | cmp byte [esi],'+' |
462 | je fp_exp_sign |
468 | je fp_exp_sign |
463 | cmp byte [esi],'-' |
469 | cmp byte [esi],'-' |
464 | jne fp_character_ok |
470 | jne fp_character_ok |
465 | fp_last_character: |
471 | fp_exp_sign: |
466 | cmp cl,1 |
- | |
467 | jne not_fp_value |
- | |
468 | or ah,4 |
- | |
469 | jmp fp_character_ok |
- | |
470 | fp_exp_sign: |
- | |
471 | inc esi |
472 | inc esi |
472 | cmp byte [esi],1Ah |
473 | cmp byte [esi],1Ah |
473 | jne not_fp_value |
474 | jne not_fp_value |
474 | inc esi |
475 | inc esi |
475 | lods byte [esi] |
476 | lods byte [esi] |
Line 807... | Line 808... | ||
807 | 808 | ||
Line 808... | Line 809... | ||
808 | calculate_expression: |
809 | calculate_expression: |
809 | mov [current_offset],edi |
810 | mov [current_offset],edi |
810 | mov [value_undefined],0 |
811 | mov [value_undefined],0 |
- | 812 | cmp byte [esi],0 |
|
- | 813 | je get_string_value |
|
- | 814 | cmp byte [esi],'.' |
|
- | 815 | je convert_fp |
|
811 | calculation_loop: |
816 | calculation_loop: |
812 | lods byte [esi] |
817 | lods byte [esi] |
813 | or al,al |
- | |
814 | jz get_string_value |
- | |
815 | cmp al,'.' |
- | |
816 | je convert_fp |
- | |
817 | cmp al,1 |
818 | cmp al,1 |
818 | je get_byte_number |
819 | je get_byte_number |
819 | cmp al,2 |
820 | cmp al,2 |
820 | je get_word_number |
821 | je get_word_number |
821 | cmp al,4 |
822 | cmp al,4 |
Line 831... | Line 832... | ||
831 | cmp al,')' |
832 | cmp al,')' |
832 | je expression_calculated |
833 | je expression_calculated |
833 | cmp al,']' |
834 | cmp al,']' |
834 | je expression_calculated |
835 | je expression_calculated |
835 | sub edi,14h |
836 | cmp al,'!' |
- | 837 | je invalid_expression |
|
- | 838 | sub edi,14h |
|
836 | mov ebx,edi |
839 | mov ebx,edi |
837 | sub ebx,14h |
840 | sub ebx,14h |
838 | cmp al,0E0h |
841 | cmp al,0E0h |
839 | je calculate_rva |
842 | je calculate_rva |
840 | cmp al,0D0h |
843 | cmp al,0D0h |
841 | je calculate_not |
844 | je calculate_not |
842 | cmp al,0D1h |
845 | cmp al,083h |
843 | je calculate_neg |
846 | je calculate_neg |
844 | mov dx,[ebx+8] |
847 | mov dx,[ebx+8] |
845 | or dx,[edi+8] |
848 | or dx,[edi+8] |
846 | cmp al,80h |
849 | cmp al,80h |
847 | je calculate_add |
850 | je calculate_add |
848 | cmp al,81h |
851 | cmp al,81h |
Line 881... | Line 884... | ||
881 | je expression_value_ok |
884 | je expression_value_ok |
882 | xor eax,eax |
885 | xor eax,eax |
883 | mov [edi],eax |
886 | mov [edi],eax |
884 | mov [edi+4],eax |
887 | mov [edi+4],eax |
885 | expression_value_ok: |
888 | mov [edi+12],al |
- | 889 | expression_value_ok: |
|
886 | ret |
890 | ret |
887 | get_byte_number: |
891 | get_byte_number: |
888 | mov word [edi+8],0 |
892 | mov word [edi+8],0 |
889 | mov byte [edi+12],0 |
893 | mov byte [edi+12],0 |
890 | xor eax,eax |
894 | xor eax,eax |
Line 938... | Line 942... | ||
938 | lods dword [esi] |
942 | lods dword [esi] |
939 | cmp eax,0Fh |
943 | cmp eax,0Fh |
940 | jb predefined_label |
944 | jb predefined_label |
941 | je reserved_word_used_as_symbol |
945 | je reserved_word_used_as_symbol |
942 | cmp eax,-1 |
946 | mov ebx,eax |
943 | je invalid_expression |
- | |
944 | mov ebx,eax |
- | |
945 | mov ax,[current_pass] |
947 | mov ax,[current_pass] |
946 | mov [ebx+18],ax |
948 | mov [ebx+18],ax |
947 | or byte [ebx+8],8 |
949 | or byte [ebx+8],8 |
948 | test byte [ebx+8],1 |
950 | test byte [ebx+8],1 |
949 | jz label_undefined |
951 | jz label_undefined |
Line 1048... | Line 1050... | ||
1048 | cmp eax,3 |
1050 | cmp eax,3 |
1049 | je org_origin_label |
1051 | je org_origin_label |
1050 | label_undefined: |
1052 | label_undefined: |
1051 | cmp [current_pass],1 |
1053 | cmp [current_pass],1 |
1052 | jbe force_next_pass |
1054 | ja undefined_value |
1053 | cmp [error_line],0 |
- | |
1054 | jne undefined_value |
- | |
1055 | mov eax,[current_line] |
1055 | force_next_pass: |
1056 | mov [error_line],eax |
- | |
1057 | mov [error],undefined_symbol |
- | |
1058 | jmp undefined_value |
- | |
1059 | force_next_pass: |
- | |
1060 | or [next_pass_needed],-1 |
1056 | or [next_pass_needed],-1 |
1061 | undefined_value: |
1057 | undefined_value: |
1062 | mov byte [edi+12],0 |
1058 | mov byte [edi+12],0 |
1063 | or [value_undefined],-1 |
1059 | or [value_undefined],-1 |
1064 | xor eax,eax |
1060 | xor eax,eax |
1065 | stos dword [edi] |
1061 | stos dword [edi] |
1066 | stos dword [edi] |
1062 | stos dword [edi] |
1067 | add edi,0Ch |
1063 | add edi,0Ch |
1068 | jmp calculation_loop |
1064 | cmp [error_line],0 |
- | 1065 | jne calculation_loop |
|
- | 1066 | mov eax,[current_line] |
|
- | 1067 | mov [error_line],eax |
|
- | 1068 | mov [error],undefined_symbol |
|
- | 1069 | jmp calculation_loop |
|
1069 | calculate_add: |
1070 | calculate_add: |
1070 | mov ecx,[ebx+16] |
1071 | mov ecx,[ebx+16] |
1071 | cmp byte [edi+12],0 |
1072 | cmp byte [edi+12],0 |
1072 | je add_values |
1073 | je add_values |
1073 | mov ecx,[edi+16] |
1074 | mov ecx,[edi+16] |
Line 1309... | Line 1310... | ||
1309 | jz value_out_of_range |
1310 | jz value_out_of_range |
1310 | mov al,[esi+10] |
1311 | mov al,[esi+10] |
1311 | cbw |
1312 | cbw |
1312 | idiv byte [edi] |
1313 | idiv byte [edi] |
1313 | mov [esi+10],al |
1314 | or ah,ah |
- | 1315 | jnz invalid_use_of_symbol |
|
- | 1316 | mov [esi+10],al |
|
1314 | div_first_register_ok: |
1317 | div_first_register_ok: |
1315 | cmp byte [esi+9],0 |
1318 | cmp byte [esi+9],0 |
1316 | je div_calculated |
1319 | je div_calculated |
1317 | mov al,[edi] |
1320 | mov al,[edi] |
1318 | cbw |
1321 | cbw |
Line 1326... | Line 1329... | ||
1326 | jz value_out_of_range |
1329 | jz value_out_of_range |
1327 | mov al,[esi+11] |
1330 | mov al,[esi+11] |
1328 | cbw |
1331 | cbw |
1329 | idiv byte [edi] |
1332 | idiv byte [edi] |
1330 | mov [esi+11],al |
1333 | or ah,ah |
- | 1334 | jnz invalid_use_of_symbol |
|
- | 1335 | mov [esi+11],al |
|
1331 | div_calculated: |
1336 | div_calculated: |
1332 | pop esi |
1337 | pop esi |
1333 | jmp calculation_loop |
1338 | jmp calculation_loop |
1334 | calculate_mod: |
1339 | calculate_mod: |
1335 | push esi |
1340 | push esi |
Line 1495... | Line 1500... | ||
1495 | sbb [edi+4],edx |
1500 | sbb [edi+4],edx |
1496 | add edi,14h |
1501 | add edi,14h |
1497 | jmp calculation_loop |
1502 | jmp calculation_loop |
1498 | calculate_rva: |
1503 | calculate_rva: |
1499 | cmp [output_format],3 |
1504 | cmp word [edi+8],0 |
1500 | jne invalid_expression |
- | |
1501 | cmp word [edi+8],0 |
- | |
1502 | jne invalid_expression |
1505 | jne invalid_expression |
1503 | test [format_flags],8 |
1506 | cmp [output_format],5 |
- | 1507 | je calculate_gotoff |
|
- | 1508 | cmp [output_format],3 |
|
- | 1509 | jne invalid_expression |
|
- | 1510 | test [format_flags],8 |
|
1504 | jnz pe64_rva |
1511 | jnz pe64_rva |
1505 | cmp byte [edi+12],2 |
1512 | mov al,2 |
- | 1513 | bt [resolver_flags],0 |
|
- | 1514 | jc rva_type_ok |
|
- | 1515 | xor al,al |
|
- | 1516 | rva_type_ok: |
|
- | 1517 | cmp byte [edi+12],al |
|
1506 | je rva_ok |
1518 | je rva_ok |
1507 | cmp [error_line],0 |
1519 | cmp [error_line],0 |
1508 | jne rva_ok |
1520 | jne rva_ok |
1509 | mov eax,[current_line] |
1521 | mov eax,[current_line] |
1510 | mov [error_line],eax |
1522 | mov [error_line],eax |
1511 | mov [error],invalid_use_of_symbol |
1523 | mov [error],invalid_use_of_symbol |
Line 1518... | Line 1530... | ||
1518 | sbb [edi+4],edx |
1530 | sbb [edi+4],edx |
1519 | add edi,14h |
1531 | add edi,14h |
1520 | jmp calculation_loop |
1532 | jmp calculation_loop |
1521 | pe64_rva: |
1533 | pe64_rva: |
1522 | cmp byte [edi+12],4 |
1534 | mov al,4 |
- | 1535 | bt [resolver_flags],0 |
|
- | 1536 | jc pe64_rva_type_ok |
|
- | 1537 | xor al,al |
|
- | 1538 | pe64_rva_type_ok: |
|
- | 1539 | cmp byte [edi+12],al |
|
1523 | je pe64_rva_ok |
1540 | je pe64_rva_ok |
1524 | cmp [error_line],0 |
1541 | cmp [error_line],0 |
1525 | jne pe64_rva_ok |
1542 | jne pe64_rva_ok |
1526 | mov eax,[current_line] |
1543 | mov eax,[current_line] |
1527 | mov [error_line],eax |
1544 | mov [error_line],eax |
1528 | mov [error],invalid_use_of_symbol |
1545 | mov [error],invalid_use_of_symbol |
Line 1534... | Line 1551... | ||
1534 | sub [edi],eax |
1551 | sub [edi],eax |
1535 | sbb [edi+4],edx |
1552 | sbb [edi+4],edx |
1536 | add edi,14h |
1553 | add edi,14h |
1537 | jmp calculation_loop |
1554 | jmp calculation_loop |
1538 | div_64: |
1555 | calculate_gotoff: |
- | 1556 | test [format_flags],8+1 |
|
- | 1557 | jnz invalid_expression |
|
- | 1558 | cmp byte [edi+12],2 |
|
- | 1559 | je gotoff_ok |
|
- | 1560 | cmp [error_line],0 |
|
- | 1561 | jne pe64_rva_ok |
|
- | 1562 | mov eax,[current_line] |
|
- | 1563 | mov [error_line],eax |
|
- | 1564 | mov [error],invalid_use_of_symbol |
|
- | 1565 | gotoff_ok: |
|
- | 1566 | mov byte [edi+12],5 |
|
- | 1567 | add edi,14h |
|
- | 1568 | jmp calculation_loop |
|
- | 1569 | div_64: |
|
1539 | xor ebx,ebx |
1570 | xor ebx,ebx |
1540 | cmp dword [edi],0 |
1571 | cmp dword [edi],0 |
1541 | jne divider_ok |
1572 | jne divider_ok |
1542 | cmp dword [edi+4],0 |
1573 | cmp dword [edi+4],0 |
1543 | jne divider_ok |
1574 | jne divider_ok |
Line 1637... | Line 1668... | ||
1637 | adc dword [esi+4],0 |
1668 | adc dword [esi+4],0 |
1638 | div_ok: |
1669 | div_ok: |
1639 | ret |
1670 | ret |
1640 | convert_fp: |
1671 | convert_fp: |
1641 | mov word [edi+8],0 |
1672 | inc esi |
- | 1673 | mov word [edi+8],0 |
|
1642 | mov byte [edi+12],0 |
1674 | mov byte [edi+12],0 |
1643 | mov al,[value_size] |
1675 | mov al,[value_size] |
1644 | cmp al,4 |
1676 | cmp al,4 |
1645 | je convert_fp_dword |
1677 | je convert_fp_dword |
1646 | cmp al,8 |
1678 | cmp al,8 |
Line 1712... | Line 1744... | ||
1712 | mov [edi+4],edx |
1744 | mov [edi+4],edx |
1713 | add esi,13 |
1745 | add esi,13 |
1714 | ret |
1746 | ret |
1715 | get_string_value: |
1747 | get_string_value: |
1716 | lods dword [esi] |
1748 | inc esi |
- | 1749 | lods dword [esi] |
|
1717 | mov ecx,eax |
1750 | mov ecx,eax |
1718 | cmp ecx,8 |
1751 | cmp ecx,8 |
1719 | ja value_out_of_range |
1752 | ja value_out_of_range |
1720 | mov edx,edi |
1753 | mov edx,edi |
1721 | xor eax,eax |
1754 | xor eax,eax |
Line 1810... | Line 1843... | ||
1810 | jne invalid_value |
1843 | jne invalid_value |
1811 | mov al,[edi+12] |
1844 | mov al,[edi+12] |
1812 | mov [value_type],al |
1845 | mov [value_type],al |
1813 | cmp al,4 |
1846 | cmp al,4 |
1814 | jb check_dword_value |
1847 | jne check_dword_value |
1815 | cmp [error_line],0 |
- | |
1816 | jne check_dword_value |
- | |
1817 | mov eax,[current_line] |
1848 | mov [value_type],2 |
1818 | mov [error_line],eax |
1849 | mov eax,[edi] |
1819 | mov [error],invalid_use_of_symbol |
1850 | cdq |
- | 1851 | cmp edx,[edi+4] |
|
- | 1852 | jne range_exceeded |
|
1820 | check_dword_value: |
1853 | ret |
- | 1854 | check_dword_value: |
|
1821 | mov eax,[edi] |
1855 | mov eax,[edi] |
1822 | mov edx,[edi+4] |
1856 | mov edx,[edi+4] |
1823 | or edx,edx |
1857 | or edx,edx |
1824 | jz dword_positive |
1858 | jz dword_positive |
1825 | cmp edx,-1 |
1859 | cmp edx,-1 |
Line 1838... | Line 1872... | ||
1838 | jne invalid_value |
1872 | jne invalid_value |
1839 | mov al,[edi+12] |
1873 | mov al,[edi+12] |
1840 | mov [value_type],al |
1874 | mov [value_type],al |
1841 | cmp al,4 |
1875 | cmp al,4 |
1842 | jb check_pword_value |
1876 | jne check_pword_value |
1843 | cmp [error_line],0 |
1877 | cmp [error_line],0 |
1844 | jne check_pword_value |
1878 | jne check_pword_value |
1845 | mov eax,[current_line] |
1879 | mov eax,[current_line] |
1846 | mov [error_line],eax |
1880 | mov [error_line],eax |
1847 | mov [error],invalid_use_of_symbol |
1881 | mov [error],invalid_use_of_symbol |
1848 | check_pword_value: |
1882 | check_pword_value: |
Line 1916... | Line 1950... | ||
1916 | call calculate_expression |
1950 | call calculate_expression |
1917 | mov eax,[edi+16] |
1951 | mov eax,[edi+16] |
1918 | mov [address_symbol],eax |
1952 | mov [address_symbol],eax |
1919 | mov al,[edi+12] |
1953 | mov al,[edi+12] |
1920 | test al,1 |
1954 | mov [value_type],al |
- | 1955 | cmp al,5 |
|
- | 1956 | je gotoff_address |
|
- | 1957 | test al,1 |
|
1921 | jnz invalid_use_of_symbol |
1958 | jnz invalid_use_of_symbol |
1922 | mov [value_type],al |
1959 | or al,al |
1923 | or al,al |
- | |
1924 | jz address_symbol_ok |
1960 | jz address_size_ok |
1925 | shl al,5 |
1961 | shl al,5 |
1926 | mov ah,[address_size] |
1962 | jmp address_symbol_ok |
- | 1963 | gotoff_address: |
|
- | 1964 | mov al,40h |
|
- | 1965 | address_symbol_ok: |
|
- | 1966 | mov ah,[address_size] |
|
1927 | or [address_size],al |
1967 | or [address_size],al |
1928 | shr al,4 |
1968 | shr al,4 |
1929 | or ah,ah |
1969 | or ah,ah |
1930 | jz address_symbol_ok |
1970 | jz address_size_ok |
1931 | cmp al,ah |
1971 | cmp al,ah |
1932 | jne address_sizes_do_not_agree |
1972 | je address_size_ok |
- | 1973 | cmp ax,0408h |
|
- | 1974 | jne address_sizes_do_not_agree |
|
1933 | address_symbol_ok: |
1975 | mov [value_type],2 |
- | 1976 | mov eax,[edi] |
|
- | 1977 | cdq |
|
- | 1978 | cmp edx,[edi+4] |
|
- | 1979 | je address_size_ok |
|
- | 1980 | cmp [error_line],0 |
|
- | 1981 | jne address_size_ok |
|
- | 1982 | mov ecx,[current_line] |
|
- | 1983 | mov [error_line],ecx |
|
- | 1984 | mov [error],value_out_of_range |
|
- | 1985 | address_size_ok: |
|
1934 | xor bx,bx |
1986 | xor bx,bx |
1935 | xor cl,cl |
1987 | xor cl,cl |
1936 | mov ch,[address_size] |
1988 | mov ch,[address_size] |
1937 | cmp word [edi+8],0 |
1989 | cmp word [edi+8],0 |
1938 | je check_immediate_address |
1990 | je check_immediate_address |
1939 | mov al,[edi+8] |
1991 | mov al,[edi+8] |
Line 2008... | Line 2060... | ||
2008 | jmp check_dword_value |
2060 | jmp check_dword_value |
2009 | check_immediate_address: |
2061 | check_immediate_address: |
2010 | cmp [code_type],64 |
2062 | cmp [code_type],64 |
2011 | jne check_dword_value |
2063 | jne check_dword_value |
2012 | jmp check_qword_value |
2064 | cmp [address_size],4 |
- | 2065 | je check_dword_value |
|
- | 2066 | jmp check_qword_value |
|
2013 | get_relative_offset: |
2067 | get_relative_offset: |
2014 | mov [value_size],4 |
2068 | mov [value_size],4 |
2015 | mov [size_override],-1 |
2069 | mov [size_override],-1 |
2016 | call calculate_expression |
2070 | call calculate_expression |
2017 | calculate_relative_offset: |
2071 | calculate_relative_offset: |
Line 2047... | Line 2101... | ||
2047 | bt eax,31 |
2101 | bt eax,31 |
2048 | jc range_exceeded |
2102 | jc range_exceeded |
2049 | ret |
2103 | ret |
2050 | 2104 | ||
Line 2051... | Line 2105... | ||
2051 | calculate_logical_expression: |
2105 | preevaluate_logical_expression: |
- | 2106 | push edi |
|
2052 | call get_logical_value |
2107 | call preevaluate_logical_value |
2053 | logical_loop: |
2108 | preevaluation_loop: |
- | 2109 | cmp al,0FFh |
|
- | 2110 | je invalid_logical_expression |
|
- | 2111 | mov dl,[esi] |
|
- | 2112 | inc esi |
|
2054 | cmp byte [esi],'|' |
2113 | cmp dl,'|' |
2055 | je logical_or |
2114 | je preevaluate_or |
2056 | cmp byte [esi],'&' |
2115 | cmp dl,'&' |
- | 2116 | je preevaluate_and |
|
- | 2117 | cmp dl,'}' |
|
- | 2118 | je preevaluation_done |
|
- | 2119 | or dl,dl |
|
- | 2120 | jnz invalid_logical_expression |
|
2057 | je logical_and |
2121 | preevaluation_done: |
- | 2122 | pop edx |
|
- | 2123 | dec esi |
|
2058 | ret |
2124 | ret |
2059 | logical_or: |
2125 | preevaluate_or: |
- | 2126 | cmp al,'1' |
|
- | 2127 | je quick_true |
|
2060 | inc esi |
2128 | cmp al,'0' |
- | 2129 | je leave_only_following |
|
2061 | push eax |
2130 | push edi |
- | 2131 | mov al,dl |
|
- | 2132 | stos byte [edi] |
|
2062 | call get_logical_value |
2133 | call preevaluate_logical_value |
2063 | pop ebx |
2134 | pop ebx |
- | 2135 | cmp al,'0' |
|
- | 2136 | je leave_only_preceding |
|
- | 2137 | cmp al,'1' |
|
- | 2138 | jne preevaluation_loop |
|
- | 2139 | stos byte [edi] |
|
2064 | or al,bl |
2140 | xor al,al |
2065 | jmp logical_loop |
2141 | jmp preevaluation_loop |
2066 | logical_and: |
2142 | preevaluate_and: |
- | 2143 | cmp al,'0' |
|
- | 2144 | je quick_false |
|
2067 | inc esi |
2145 | cmp al,'1' |
- | 2146 | je leave_only_following |
|
2068 | push eax |
2147 | push edi |
- | 2148 | mov al,dl |
|
- | 2149 | stos byte [edi] |
|
2069 | call get_logical_value |
2150 | call preevaluate_logical_value |
2070 | pop ebx |
2151 | pop ebx |
2071 | and al,bl |
2152 | cmp al,'1' |
- | 2153 | je leave_only_preceding |
|
2072 | jmp logical_loop |
2154 | cmp al,'0' |
2073 | - | ||
- | 2155 | jne preevaluation_loop |
|
2074 | get_logical_value: |
2156 | stos byte [edi] |
2075 | xor al,al |
2157 | xor al,al |
- | 2158 | jmp preevaluation_loop |
|
- | 2159 | leave_only_following: |
|
- | 2160 | mov edi,[esp] |
|
- | 2161 | call preevaluate_logical_value |
|
- | 2162 | jmp preevaluation_loop |
|
- | 2163 | leave_only_preceding: |
|
- | 2164 | mov edi,ebx |
|
- | 2165 | xor al,al |
|
- | 2166 | jmp preevaluation_loop |
|
- | 2167 | quick_true: |
|
- | 2168 | call skip_logical_value |
|
- | 2169 | jc invalid_logical_expression |
|
- | 2170 | mov edi,[esp] |
|
- | 2171 | mov al,'1' |
|
- | 2172 | jmp preevaluation_loop |
|
2076 | check_for_negation: |
2173 | quick_false: |
- | 2174 | call skip_logical_value |
|
- | 2175 | jc invalid_logical_expression |
|
- | 2176 | mov edi,[esp] |
|
- | 2177 | mov al,'0' |
|
- | 2178 | jmp preevaluation_loop |
|
- | 2179 | invalid_logical_expression: |
|
- | 2180 | pop edi |
|
- | 2181 | mov esi,edi |
|
- | 2182 | mov al,0FFh |
|
- | 2183 | stos byte [edi] |
|
- | 2184 | ret |
|
- | 2185 | skip_logical_value: |
|
2077 | cmp byte [esi],'~' |
2186 | cmp byte [esi],'~' |
2078 | jne negation_ok |
2187 | jne negation_skipped |
2079 | inc esi |
2188 | inc esi |
- | 2189 | jmp skip_logical_value |
|
- | 2190 | negation_skipped: |
|
- | 2191 | cmp byte [esi],'{' |
|
- | 2192 | jne skip_simple_logical_value |
|
- | 2193 | inc esi |
|
- | 2194 | skip_logical_expression: |
|
- | 2195 | call skip_logical_value |
|
- | 2196 | lods byte [esi] |
|
2080 | xor al,-1 |
2197 | or al,al |
- | 2198 | jz wrongly_structured_logical_expression |
|
- | 2199 | cmp al,0Fh |
|
- | 2200 | je wrongly_structured_logical_expression |
|
- | 2201 | cmp al,'|' |
|
- | 2202 | je skip_logical_expression |
|
- | 2203 | cmp al,'&' |
|
- | 2204 | je skip_logical_expression |
|
2081 | jmp check_for_negation |
2205 | cmp al,'}' |
- | 2206 | je logical_value_skipped |
|
- | 2207 | wrongly_structured_logical_expression: |
|
2082 | negation_ok: |
2208 | stc |
2083 | push eax |
2209 | ret |
- | 2210 | skip_simple_logical_value: |
|
2084 | mov al,[esi] |
2211 | mov al,[esi] |
2085 | cmp al,'{' |
2212 | or al,al |
2086 | je logical_expression |
2213 | jz logical_value_skipped |
2087 | cmp al,88h |
2214 | cmp al,0Fh |
2088 | je check_for_defined |
2215 | je logical_value_skipped |
2089 | cmp al,89h |
2216 | cmp al,'}' |
2090 | je check_for_used |
2217 | je logical_value_skipped |
2091 | push esi |
- | |
2092 | cmp al,11h |
- | |
2093 | jne check_for_values |
2218 | cmp al,'|' |
2094 | add esi,2 |
- | |
2095 | check_for_values: |
2219 | je logical_value_skipped |
2096 | xor bl,bl |
- | |
2097 | cmp byte [esi],'(' |
2220 | cmp al,'&' |
2098 | jne find_eq_symbol |
2221 | je logical_value_skipped |
2099 | call skip_symbol |
2222 | call skip_symbol |
- | 2223 | jmp skip_simple_logical_value |
|
- | 2224 | logical_value_skipped: |
|
- | 2225 | clc |
|
- | 2226 | ret |
|
- | 2227 | ||
- | 2228 | preevaluate_logical_value: |
|
- | 2229 | mov ebp,edi |
|
- | 2230 | preevaluate_negation: |
|
- | 2231 | cmp byte [esi],'~' |
|
- | 2232 | jne preevaluate_negation_ok |
|
2100 | lods byte [esi] |
2233 | movs byte [edi],[esi] |
- | 2234 | jmp preevaluate_negation |
|
- | 2235 | preevaluate_negation_ok: |
|
- | 2236 | mov ebx,esi |
|
- | 2237 | xor edx,edx |
|
- | 2238 | cmp byte [esi],'{' |
|
- | 2239 | jne find_logical_value_boundaries |
|
- | 2240 | movs byte [edi],[esi] |
|
- | 2241 | push ebp |
|
- | 2242 | call preevaluate_logical_expression |
|
- | 2243 | pop ebp |
|
2101 | cmp al,'=' |
2244 | cmp al,0FFh |
- | 2245 | je invalid_logical_value |
|
- | 2246 | cmp byte [esi],'}' |
|
- | 2247 | jne invalid_logical_value |
|
2102 | je compare_values |
2248 | or al,al |
- | 2249 | jnz preevaluated_expression_value |
|
- | 2250 | movs byte [edi],[esi] |
|
2103 | cmp al,'>' |
2251 | ret |
- | 2252 | preevaluated_expression_value: |
|
2104 | je compare_values |
2253 | inc esi |
- | 2254 | lea edx,[edi-1] |
|
- | 2255 | sub edx,ebp |
|
- | 2256 | test edx,1 |
|
- | 2257 | jz expression_negation_ok |
|
- | 2258 | xor al,1 |
|
- | 2259 | expression_negation_ok: |
|
- | 2260 | mov edi,ebp |
|
2105 | cmp al,'<' |
2261 | ret |
2106 | je compare_values |
2262 | invalid_logical_value: |
- | 2263 | mov edi,ebp |
|
2107 | cmp al,0F1h |
2264 | mov al,0FFh |
- | 2265 | ret |
|
- | 2266 | find_logical_value_boundaries: |
|
- | 2267 | mov al,[esi] |
|
- | 2268 | or al,al |
|
- | 2269 | jz logical_value_boundaries_found |
|
2108 | je compare_values |
2270 | cmp al,'}' |
- | 2271 | je logical_value_boundaries_found |
|
2109 | cmp al,0F2h |
2272 | cmp al,'|' |
- | 2273 | je logical_value_boundaries_found |
|
2110 | je compare_values |
2274 | cmp al,'&' |
- | 2275 | je logical_value_boundaries_found |
|
- | 2276 | or edx,edx |
|
- | 2277 | jnz next_symbol_in_logical_value |
|
- | 2278 | cmp al,0F0h |
|
- | 2279 | je preevaluable_logical_operator |
|
2111 | cmp al,0F3h |
2280 | cmp al,0F7h |
- | 2281 | je preevaluable_logical_operator |
|
2112 | je compare_values |
2282 | cmp al,0F6h |
- | 2283 | jne next_symbol_in_logical_value |
|
- | 2284 | preevaluable_logical_operator: |
|
2113 | dec esi |
2285 | mov edx,esi |
- | 2286 | next_symbol_in_logical_value: |
|
2114 | find_eq_symbol: |
2287 | call skip_symbol |
- | 2288 | jmp find_logical_value_boundaries |
|
- | 2289 | logical_value_boundaries_found: |
|
- | 2290 | or edx,edx |
|
- | 2291 | jz non_preevaluable_logical_value |
|
- | 2292 | mov al,[edx] |
|
2115 | cmp byte [esi],0F0h |
2293 | cmp al,0F0h |
2116 | je compare_symbols |
2294 | je compare_symbols |
2117 | cmp byte [esi],0F7h |
2295 | cmp al,0F7h |
2118 | je compare_symbol_types |
2296 | je compare_symbol_types |
2119 | cmp byte [esi],0F6h |
2297 | cmp al,0F6h |
2120 | je scan_symbols_list |
2298 | je scan_symbols_list |
2121 | call check_character |
- | |
2122 | jc logical_number |
- | |
2123 | cmp al,',' |
- | |
2124 | jne next_eq_symbol |
- | |
2125 | mov bl,1 |
- | |
2126 | next_eq_symbol: |
- | |
2127 | call skip_symbol |
- | |
2128 | jmp find_eq_symbol |
- | |
2129 | compare_symbols: |
2299 | non_preevaluable_logical_value: |
2130 | inc esi |
- | |
2131 | pop ebx |
- | |
2132 | mov edx,esi |
- | |
2133 | push edi |
- | |
2134 | mov edi,ebx |
- | |
2135 | mov ecx,esi |
2300 | mov ecx,esi |
- | 2301 | mov esi,ebx |
|
- | 2302 | sub ecx,esi |
|
- | 2303 | jz invalid_logical_value |
|
- | 2304 | cmp esi,edi |
|
- | 2305 | je leave_logical_value_intact |
|
- | 2306 | rep movs byte [edi],[esi] |
|
- | 2307 | xor al,al |
|
2136 | dec ecx |
2308 | ret |
- | 2309 | leave_logical_value_intact: |
|
- | 2310 | add edi,ecx |
|
- | 2311 | add esi,ecx |
|
- | 2312 | xor al,al |
|
- | 2313 | ret |
|
- | 2314 | compare_symbols: |
|
- | 2315 | lea ecx,[esi-1] |
|
2137 | sub ecx,edi |
2316 | sub ecx,edx |
- | 2317 | mov eax,edx |
|
- | 2318 | sub eax,ebx |
|
- | 2319 | cmp ecx,eax |
|
- | 2320 | jne preevaluated_false |
|
- | 2321 | push esi edi |
|
- | 2322 | mov esi,ebx |
|
- | 2323 | lea edi,[edx+1] |
|
2138 | repe cmps byte [esi],[edi] |
2324 | repe cmps byte [esi],[edi] |
2139 | pop edi |
2325 | pop edi esi |
- | 2326 | je preevaluated_true |
|
2140 | je symbols_equal |
2327 | preevaluated_false: |
2141 | mov esi,edx |
2328 | mov eax,edi |
2142 | symbols_different: |
2329 | sub eax,ebp |
2143 | call check_character |
2330 | test eax,1 |
- | 2331 | jnz store_true |
|
2144 | jc return_false |
2332 | store_false: |
- | 2333 | mov edi,ebp |
|
2145 | call skip_symbol |
2334 | mov al,'0' |
- | 2335 | ret |
|
- | 2336 | preevaluated_true: |
|
2146 | jmp symbols_different |
2337 | mov eax,edi |
2147 | symbols_equal: |
2338 | sub eax,ebp |
2148 | call check_character |
2339 | test eax,1 |
- | 2340 | jnz store_false |
|
2149 | jc return_true |
2341 | store_true: |
2150 | jmp symbols_different |
2342 | mov edi,ebp |
- | 2343 | mov al,'1' |
|
- | 2344 | ret |
|
2151 | compare_symbol_types: |
2345 | compare_symbol_types: |
2152 | inc esi |
2346 | push esi |
2153 | pop ebx |
2347 | lea esi,[edx+1] |
2154 | type_comparision: |
2348 | type_comparison: |
2155 | call check_character |
2349 | cmp esi,[esp] |
2156 | jc types_compared |
2350 | je types_compared |
2157 | mov al,[esi] |
2351 | mov al,[esi] |
2158 | cmp al,[ebx] |
2352 | cmp al,[ebx] |
2159 | jne symbols_different |
2353 | jne different_type |
2160 | cmp al,'(' |
2354 | cmp al,'(' |
2161 | jne equal_type |
2355 | jne equal_type |
2162 | mov al,[esi+1] |
2356 | mov al,[esi+1] |
2163 | mov ah,[ebx+1] |
2357 | mov ah,[ebx+1] |
2164 | cmp al,ah |
2358 | cmp al,ah |
2165 | je equal_type |
2359 | je equal_type |
2166 | or al,al |
2360 | or al,al |
2167 | jz symbols_different |
2361 | jz different_type |
2168 | or ah,ah |
2362 | or ah,ah |
2169 | jz symbols_different |
2363 | jz different_type |
2170 | cmp al,'.' |
2364 | cmp al,'.' |
2171 | je symbols_different |
2365 | je different_type |
2172 | cmp ah,'.' |
2366 | cmp ah,'.' |
2173 | je symbols_different |
2367 | je different_type |
2174 | equal_type: |
2368 | equal_type: |
2175 | call skip_symbol |
2369 | call skip_symbol |
2176 | xchg esi,ebx |
2370 | xchg esi,ebx |
2177 | call skip_symbol |
2371 | call skip_symbol |
2178 | xchg esi,ebx |
2372 | xchg esi,ebx |
2179 | jmp type_comparision |
2373 | jmp type_comparison |
2180 | types_compared: |
2374 | types_compared: |
- | 2375 | pop esi |
|
2181 | cmp byte [ebx],0F7h |
2376 | cmp byte [ebx],0F7h |
2182 | jne return_false |
2377 | jne preevaluated_false |
- | 2378 | jmp preevaluated_true |
|
2183 | jmp return_true |
2379 | different_type: |
- | 2380 | pop esi |
|
- | 2381 | jmp preevaluated_false |
|
2184 | scan_symbols_list: |
2382 | scan_symbols_list: |
2185 | or bl,bl |
2383 | push edi esi |
2186 | jnz invalid_expression |
2384 | lea esi,[edx+1] |
2187 | xor bp,bp |
2385 | sub edx,ebx |
2188 | inc esi |
- | |
2189 | lods byte [esi] |
2386 | lods byte [esi] |
2190 | cmp al,'<' |
2387 | cmp al,'<' |
2191 | jne invalid_expression |
2388 | jne invalid_symbols_list |
2192 | pop ebx |
- | |
2193 | mov ecx,esi |
- | |
2194 | sub ecx,2 |
- | |
2195 | sub ecx,ebx |
- | |
2196 | compare_in_list: |
2389 | get_next_from_list: |
2197 | mov edx,esi |
2390 | mov edi,esi |
2198 | push ecx edi |
- | |
2199 | mov edi,ebx |
- | |
2200 | repe cmps byte [esi],[edi] |
- | |
2201 | pop edi ecx |
- | |
2202 | jne not_equal_in_list |
2391 | get_from_list: |
2203 | cmp byte [esi],',' |
2392 | cmp byte [esi],',' |
2204 | je skip_rest_of_list |
2393 | je compare_in_list |
2205 | cmp byte [esi],'>' |
2394 | cmp byte [esi],'>' |
- | 2395 | je compare_in_list |
|
- | 2396 | cmp esi,[esp] |
|
- | 2397 | jae invalid_symbols_list |
|
- | 2398 | call skip_symbol |
|
- | 2399 | jmp get_from_list |
|
- | 2400 | compare_in_list: |
|
- | 2401 | mov ecx,esi |
|
- | 2402 | sub ecx,edi |
|
- | 2403 | cmp ecx,edx |
|
- | 2404 | jne not_equal_length_in_list |
|
- | 2405 | mov esi,ebx |
|
- | 2406 | repe cmps byte [esi],[edi] |
|
- | 2407 | mov esi,edi |
|
2206 | jne not_equal_in_list |
2408 | jne not_equal_in_list |
2207 | skip_rest_of_list: |
2409 | skip_rest_of_list: |
2208 | mov al,[esi] |
2410 | cmp byte [esi],'>' |
2209 | or al,al |
- | |
2210 | jz invalid_expression |
2411 | je check_list_end |
2211 | cmp al,0Fh |
2412 | cmp esi,[esp] |
2212 | je invalid_expression |
2413 | jae invalid_symbols_list |
2213 | cmp al,'>' |
- | |
2214 | je list_return_true |
- | |
2215 | call skip_symbol |
2414 | call skip_symbol |
2216 | jmp skip_rest_of_list |
2415 | jmp skip_rest_of_list |
2217 | list_return_true: |
2416 | check_list_end: |
2218 | inc esi |
2417 | inc esi |
- | 2418 | cmp esi,[esp] |
|
- | 2419 | jne invalid_symbols_list |
|
- | 2420 | pop esi edi |
|
2219 | jmp return_true |
2421 | jmp preevaluated_true |
2220 | not_equal_in_list: |
2422 | not_equal_in_list: |
2221 | mov esi,edx |
2423 | add esi,ecx |
2222 | skip_list_item: |
2424 | not_equal_length_in_list: |
2223 | mov al,[esi] |
- | |
2224 | or al,al |
- | |
2225 | jz invalid_expression |
- | |
2226 | cmp al,0Fh |
- | |
2227 | je invalid_expression |
- | |
2228 | cmp al,'<' |
- | |
2229 | je invalid_expression |
2425 | lods byte [esi] |
2230 | cmp al,'>' |
- | |
2231 | je list_return_false |
- | |
2232 | cmp al,',' |
2426 | cmp al,',' |
2233 | je next_in_list |
2427 | je get_next_from_list |
- | 2428 | cmp esi,[esp] |
|
- | 2429 | jne invalid_symbols_list |
|
- | 2430 | pop esi edi |
|
- | 2431 | jmp preevaluated_false |
|
2234 | call skip_symbol |
2432 | invalid_symbols_list: |
2235 | jmp skip_list_item |
2433 | pop esi edi |
- | 2434 | jmp invalid_logical_value |
|
- | 2435 | ||
- | 2436 | calculate_logical_expression: |
|
- | 2437 | call get_logical_value |
|
2236 | next_in_list: |
2438 | logical_loop: |
- | 2439 | cmp byte [esi],'|' |
|
- | 2440 | je logical_or |
|
- | 2441 | cmp byte [esi],'&' |
|
- | 2442 | je logical_and |
|
- | 2443 | ret |
|
- | 2444 | logical_or: |
|
2237 | inc esi |
2445 | inc esi |
- | 2446 | or al,al |
|
- | 2447 | jnz logical_value_already_determined |
|
- | 2448 | push eax |
|
- | 2449 | call get_logical_value |
|
2238 | jmp compare_in_list |
2450 | pop ebx |
- | 2451 | or al,bl |
|
- | 2452 | jmp logical_loop |
|
2239 | list_return_false: |
2453 | logical_and: |
2240 | inc esi |
2454 | inc esi |
- | 2455 | or al,al |
|
- | 2456 | jz logical_value_already_determined |
|
- | 2457 | push eax |
|
- | 2458 | call get_logical_value |
|
- | 2459 | pop ebx |
|
- | 2460 | and al,bl |
|
- | 2461 | jmp logical_loop |
|
- | 2462 | logical_value_already_determined: |
|
- | 2463 | push eax |
|
- | 2464 | call skip_logical_value |
|
- | 2465 | jc invalid_expression |
|
- | 2466 | pop eax |
|
- | 2467 | jmp logical_loop |
|
2241 | jmp return_false |
2468 | get_logical_value: |
- | 2469 | xor al,al |
|
2242 | check_character: |
2470 | check_for_negation: |
- | 2471 | cmp byte [esi],'~' |
|
- | 2472 | jne negation_ok |
|
- | 2473 | inc esi |
|
- | 2474 | xor al,-1 |
|
- | 2475 | jmp check_for_negation |
|
- | 2476 | negation_ok: |
|
- | 2477 | push eax |
|
- | 2478 | mov al,[esi] |
|
- | 2479 | cmp al,'{' |
|
- | 2480 | je logical_expression |
|
- | 2481 | cmp al,0FFh |
|
- | 2482 | je invalid_expression |
|
- | 2483 | cmp al,88h |
|
- | 2484 | je check_for_defined |
|
- | 2485 | cmp al,89h |
|
- | 2486 | je check_for_used |
|
- | 2487 | cmp al,'0' |
|
- | 2488 | je given_false |
|
- | 2489 | cmp al,'1' |
|
- | 2490 | je given_true |
|
- | 2491 | call get_value |
|
- | 2492 | mov bl,[value_type] |
|
- | 2493 | push eax edx ebx |
|
2243 | mov al,[esi] |
2494 | mov al,[esi] |
2244 | or al,al |
2495 | or al,al |
2245 | jz stop |
2496 | jz logical_number |
2246 | cmp al,0Fh |
2497 | cmp al,0Fh |
2247 | je stop |
2498 | je logical_number |
2248 | cmp al,'}' |
2499 | cmp al,'}' |
2249 | je stop |
- | |
2250 | cmp al,'|' |
2500 | je logical_number |
2251 | je stop |
- | |
2252 | cmp al,'&' |
2501 | cmp al,'&' |
2253 | je stop |
- | |
2254 | clc |
- | |
2255 | ret |
- | |
2256 | stop: |
2502 | je logical_number |
2257 | stc |
- | |
2258 | ret |
- | |
2259 | compare_values: |
2503 | cmp al,'|' |
2260 | pop esi |
- | |
2261 | call get_value |
- | |
2262 | mov bl,[value_type] |
2504 | je logical_number |
2263 | push eax edx ebx |
2505 | inc esi |
2264 | lods byte [esi] |
- | |
2265 | mov [compare_type],al |
2506 | mov [compare_type],al |
2266 | call get_value |
2507 | call get_value |
2267 | pop ebx |
2508 | pop ebx |
2268 | cmp [next_pass_needed],0 |
2509 | cmp [next_pass_needed],0 |
2269 | jne values_ok |
2510 | jne values_ok |
Line 2324... | Line 2565... | ||
2324 | cmp edx,ecx |
2565 | cmp edx,ecx |
2325 | jne return_true |
2566 | jne return_true |
2326 | jmp return_false |
2567 | jmp return_false |
2327 | logical_number: |
2568 | logical_number: |
2328 | pop esi |
2569 | pop ebx edx eax |
2329 | call get_value |
- | |
2330 | cmp [value_type],0 |
2570 | or bl,bl |
2331 | jne invalid_expression |
2571 | jnz invalid_expression |
2332 | or eax,edx |
2572 | or eax,edx |
2333 | jnz return_true |
2573 | jnz return_true |
2334 | jmp return_false |
2574 | jmp return_false |
2335 | check_for_defined: |
2575 | check_for_defined: |
2336 | or bl,-1 |
2576 | or bl,-1 |
2337 | lods word [esi] |
2577 | lods word [esi] |
Line 2421... | Line 2661... | ||
2421 | jmp return_true |
2661 | jmp return_true |
2422 | not_used: |
2662 | not_used: |
2423 | or byte [eax+8],10h |
2663 | or byte [eax+8],10h |
2424 | and byte [eax+8],not 20h |
2664 | and byte [eax+8],not 20h |
2425 | return_false: |
2665 | jmp return_false |
- | 2666 | given_false: |
|
- | 2667 | inc esi |
|
- | 2668 | return_false: |
|
2426 | xor al,al |
2669 | xor al,al |
2427 | jmp logical_value_ok |
2670 | jmp logical_value_ok |
2428 | return_true: |
2671 | given_true: |
- | 2672 | inc esi |
|
- | 2673 | return_true: |
|
2429 | or al,-1 |
2674 | or al,-1 |
2430 | jmp logical_value_ok |
2675 | jmp logical_value_ok |
2431 | logical_expression: |
2676 | logical_expression: |
2432 | inc esi |
2677 | inc esi |
2433 | call calculate_logical_expression |
2678 | call calculate_logical_expression |