Subversion Repositories Kolibri OS

Rev

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