Subversion Repositories Kolibri OS

Rev

Rev 157 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 157 Rev 174
Line 839... Line 839...
839
	mov	ebx,edi
839
	mov	ebx,edi
840
	sub	ebx,14h
840
	sub	ebx,14h
841
	cmp	al,0E0h
841
	cmp	al,0E0h
842
	je	calculate_rva
842
	je	calculate_rva
843
	cmp	al,0D0h
843
	cmp	al,0E1h
-
 
844
	je	calculate_plt
-
 
845
	cmp	al,0D0h
844
	je	calculate_not
846
	je	calculate_not
845
	cmp	al,083h
847
	cmp	al,083h
846
	je	calculate_neg
848
	je	calculate_neg
847
	mov	dx,[ebx+8]
849
	mov	dx,[ebx+8]
848
	or	dx,[edi+8]
850
	or	dx,[edi+8]
Line 1143... Line 1145...
1143
	jne	invalid_sub
1145
	jne	invalid_sub
1144
	xor	ah,ah
1146
	xor	ah,ah
1145
	mov	ecx,[edi+16]
1147
	mov	ecx,[edi+16]
1146
	cmp	ecx,[ebx+16]
1148
	cmp	ecx,[ebx+16]
1147
	je	sub_values
1149
	jne	invalid_sub
1148
	cmp	ecx,[org_symbol]
-
 
1149
	jne	invalid_sub
-
 
1150
	test	byte [ebx+12],1
1150
      sub_values:
1151
	jnz	invalid_sub
-
 
1152
	mov	ah,3
-
 
1153
      sub_values:
-
 
1154
	mov	[ebx+12],ah
1151
	mov	[ebx+12],ah
1155
	mov	eax,[edi]
1152
	mov	eax,[edi]
1156
	sub	[ebx],eax
1153
	sub	[ebx],eax
1157
	mov	eax,[edi+4]
1154
	mov	eax,[edi+4]
1158
	sbb	[ebx+4],eax
1155
	sbb	[ebx+4],eax
Line 1554... Line 1551...
1554
	jmp	calculation_loop
1551
	jmp	calculation_loop
1555
      calculate_gotoff:
1552
      calculate_gotoff:
1556
	test	[format_flags],8+1
1553
	test	[format_flags],8+1
1557
	jnz	invalid_expression
1554
	jnz	invalid_expression
1558
	cmp	byte [edi+12],2
1555
	mov	dl,5
-
 
1556
	cmp	byte [edi+12],2
1559
	je	gotoff_ok
1557
	je	change_value_type
1560
	cmp	[error_line],0
1558
      incorrect_change_of_value_type:
-
 
1559
	cmp	[error_line],0
1561
	jne	pe64_rva_ok
1560
	jne	change_value_type
1562
	mov	eax,[current_line]
1561
	mov	eax,[current_line]
1563
	mov	[error_line],eax
1562
	mov	[error_line],eax
1564
	mov	[error],invalid_use_of_symbol
1563
	mov	[error],invalid_use_of_symbol
1565
      gotoff_ok:
1564
      change_value_type:
1566
	mov	byte [edi+12],5
1565
	mov	byte [edi+12],dl
1567
	add	edi,14h
1566
	add	edi,14h
1568
	jmp	calculation_loop
1567
	jmp	calculation_loop
1569
      div_64:
1568
      calculate_plt:
-
 
1569
	cmp	word [edi+8],0
-
 
1570
	jne	invalid_expression
-
 
1571
	cmp	[output_format],5
-
 
1572
	jne	invalid_expression
-
 
1573
	test	[format_flags],1
-
 
1574
	jnz	invalid_expression
-
 
1575
	mov	dl,6
-
 
1576
	mov	dh,2
-
 
1577
	test	[format_flags],8
-
 
1578
	jz	check_value_for_plt
-
 
1579
	mov	dh,4
-
 
1580
      check_value_for_plt:
-
 
1581
	mov	eax,[edi]
-
 
1582
	or	eax,[edi+4]
-
 
1583
	jnz	incorrect_change_of_value_type
-
 
1584
	cmp	byte [edi+12],dh
-
 
1585
	jne	incorrect_change_of_value_type
-
 
1586
	mov	eax,[edi+16]
-
 
1587
	cmp	byte [eax],81h
-
 
1588
	jne	incorrect_change_of_value_type
-
 
1589
	jmp	change_value_type
-
 
1590
      div_64:
1570
	xor	ebx,ebx
1591
	xor	ebx,ebx
1571
	cmp	dword [edi],0
1592
	cmp	dword [edi],0
1572
	jne	divider_ok
1593
	jne	divider_ok
1573
	cmp	dword [edi+4],0
1594
	cmp	dword [edi+4],0
1574
	jne	divider_ok
1595
	jne	divider_ok
Line 1953... Line 1974...
1953
	mov	al,[edi+12]
1974
	mov	al,[edi+12]
1954
	mov	[value_type],al
1975
	mov	[value_type],al
1955
	cmp	al,5
1976
	cmp	al,5
1956
	je	gotoff_address
1977
	je	gotoff_address
1957
	test	al,1
1978
	ja	invalid_use_of_symbol
-
 
1979
	test	al,1
1958
	jnz	invalid_use_of_symbol
1980
	jnz	invalid_use_of_symbol
1959
	or	al,al
1981
	or	al,al
1960
	jz	address_size_ok
1982
	jz	address_size_ok
1961
	shl	al,5
1983
	shl	al,5
1962
	jmp	address_symbol_ok
1984
	jmp	address_symbol_ok
Line 1982... Line 2004...
1982
	mov	ecx,[current_line]
2004
	mov	ecx,[current_line]
1983
	mov	[error_line],ecx
2005
	mov	[error_line],ecx
1984
	mov	[error],value_out_of_range
2006
	mov	[error],value_out_of_range
1985
      address_size_ok:
2007
      address_size_ok:
1986
	xor	bx,bx
2008
	xor	ebx,ebx
1987
	xor	cl,cl
2009
	xor	ecx,ecx
1988
	mov	ch,[address_size]
2010
	mov	cl,[value_type]
-
 
2011
	shl	ecx,16
-
 
2012
	mov	ch,[address_size]
1989
	cmp	word [edi+8],0
2013
	cmp	word [edi+8],0
1990
	je	check_immediate_address
2014
	je	check_immediate_address
1991
	mov	al,[edi+8]
2015
	mov	al,[edi+8]
1992
	mov	dl,[edi+10]
2016
	mov	dl,[edi+10]
1993
	call	get_address_register
2017
	call	get_address_register
Line 2069... Line 2093...
2069
	jne	check_dword_value
2093
	jne	check_dword_value
2070
	cmp	[address_size],4
2094
	cmp	[address_size],4
2071
	je	check_dword_value
2095
	je	check_dword_value
2072
	jmp	check_qword_value
2096
	jmp	check_qword_value
2073
get_relative_offset:
2097
calculate_relative_offset:
2074
	mov	[value_size],4
-
 
2075
	mov	[size_override],-1
-
 
2076
	call	calculate_expression
-
 
2077
      calculate_relative_offset:
-
 
2078
	push	esi
2098
	cmp	[value_undefined],0
2079
	add	edi,14h
2099
	jne	relative_offset_ok
2080
	mov	esi,[display_buffer]
2100
	add	eax,dword [org_origin]
2081
	sub	esi,7
2101
	adc	edx,dword [org_origin+4]
2082
	lea	eax,[esi-14h]
-
 
2083
	cmp	eax,edi
2102
	sub	eax,edi
2084
	jb	out_of_memory
2103
	sbb	edx,0
2085
	mov	byte [esi],11h
2104
	mov	bl,[value_type]
2086
	xor	eax,eax
2105
	or	bl,bl
2087
	mov	dword [esi+1],eax
2106
	je	relative_offset_ok
2088
	mov	word [esi+5],')' shl 8 + 81h
2107
	test	bl,1
2089
	call	calculation_loop
2108
	jnz	invalid_use_of_symbol
2090
	pop	esi
2109
	cmp	bl,6
2091
	cmp	word [edi+8],0
2110
	je	plt_relative_offset
2092
	jne	invalid_value
2111
	cmp	bl,[labels_type]
2093
	mov	al,[edi+12]
2112
	jne	invalid_use_of_symbol
2094
	mov	[value_type],al
2113
	mov	[value_type],0
2095
	mov	eax,[edi+16]
2114
	mov	ecx,[symbol_identifier]
2096
	mov	[symbol_identifier],eax
-
 
2097
	mov	eax,[edi]
2115
	cmp	ecx,[org_symbol]
2098
	mov	edx,[edi+4]
-
 
2099
	or	edx,edx
2116
	je	relative_offset_ok
2100
	jz	offset_positive
-
 
2101
	cmp	edx,-1
2117
	mov	[value_type],3
2102
	jne	range_exceeded
-
 
2103
	bt	eax,31
2118
      relative_offset_ok:
2104
	jnc	range_exceeded
-
 
2105
	ret
2119
	ret
2106
      offset_positive:
2120
      plt_relative_offset:
2107
	bt	eax,31
2121
	mov	[value_type],7
2108
	jc	range_exceeded
-
 
2109
	ret
2122
	ret
2110
 
2123
 
Line 2111... Line 2124...
2111
preevaluate_logical_expression:
2124
preevaluate_logical_expression:
2112
	push	edi
2125
	push	edi
2113
	call	preevaluate_logical_value
2126
	call	preevaluate_logical_value