Subversion Repositories Kolibri OS

Rev

Rev 226 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 226 Rev 242
1
; flat assembler core
1
; flat assembler core
2
; Copyright (c) 1999-2006, Tomasz Grysztar.
2
; Copyright (c) 1999-2006, Tomasz Grysztar.
3
; All rights reserved.
3
; All rights reserved.
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	[current_offset],esp
9
	mov	[current_offset],esp
10
      expression_loop:
10
      expression_loop:
11
	push	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
14
	pop	edi
15
	or	al,al
15
	or	al,al
16
	jz	expression_element
16
	jz	expression_element
17
	push	eax
17
	push	eax
18
	jmp	expression_loop
18
	jmp	expression_loop
19
      expression_element:
19
      expression_element:
20
	mov	al,[esi]
20
	mov	al,[esi]
21
	cmp	al,1Ah
21
	cmp	al,1Ah
22
	je	expression_number
22
	je	expression_number
23
	cmp	al,22h
23
	cmp	al,22h
24
	je	expression_number
24
	je	expression_number
25
	cmp	al,'('
25
	cmp	al,'('
26
	je	expression_number
26
	je	expression_number
27
	mov	al,'!'
27
	mov	al,'!'
28
	stos	byte [edi]
28
	stos	byte [edi]
29
	jmp	expression_operator
29
	jmp	expression_operator
30
      expression_number:
30
      expression_number:
31
	call	convert_number
31
	call	convert_number
32
      expression_operator:
32
      expression_operator:
33
	push	edi
33
	push	edi
34
	mov	edi,operators
34
	mov	edi,operators
35
	call	get_operator
35
	call	get_operator
36
	pop	edi
36
	pop	edi
37
	or	al,al
37
	or	al,al
38
	jz	expression_end
38
	jz	expression_end
39
      operators_loop:
39
      operators_loop:
40
	cmp	esp,[current_offset]
40
	cmp	esp,[current_offset]
41
	je	push_operator
41
	je	push_operator
42
	mov	bl,al
42
	mov	bl,al
43
	and	bl,0F0h
43
	and	bl,0F0h
44
	mov	bh,byte [esp]
44
	mov	bh,byte [esp]
45
	and	bh,0F0h
45
	and	bh,0F0h
46
	cmp	bl,bh
46
	cmp	bl,bh
47
	ja	push_operator
47
	ja	push_operator
48
	pop	ebx
48
	pop	ebx
49
	mov	byte [edi],bl
49
	mov	byte [edi],bl
50
	inc	edi
50
	inc	edi
51
	jmp	operators_loop
51
	jmp	operators_loop
52
      push_operator:
52
      push_operator:
53
	push	eax
53
	push	eax
54
	jmp	expression_loop
54
	jmp	expression_loop
55
      expression_end:
55
      expression_end:
56
	cmp	esp,[current_offset]
56
	cmp	esp,[current_offset]
57
	je	expression_converted
57
	je	expression_converted
58
	pop	eax
58
	pop	eax
59
	stos	byte [edi]
59
	stos	byte [edi]
60
	jmp	expression_end
60
	jmp	expression_end
61
      expression_converted:
61
      expression_converted:
62
	pop	ebp
62
	pop	ebp
63
	ret
63
	ret
64
      fp_expression:
64
      fp_expression:
65
	mov	al,'.'
65
	mov	al,'.'
66
	stos	byte [edi]
66
	stos	byte [edi]
67
	mov	eax,[fp_value]
67
	mov	eax,[fp_value]
68
	stos	dword [edi]
68
	stos	dword [edi]
69
	mov	eax,[fp_value+4]
69
	mov	eax,[fp_value+4]
70
	stos	dword [edi]
70
	stos	dword [edi]
71
	mov	eax,[fp_value+8]
71
	mov	eax,[fp_value+8]
72
	stos	dword [edi]
72
	stos	dword [edi]
73
	pop	ebp
73
	pop	ebp
74
	ret
74
	ret
75
 
75
 
76
convert_number:
76
convert_number:
77
	lea	eax,[edi-10h]
77
	lea	eax,[edi-10h]
78
	cmp	eax,[labels_list]
78
	cmp	eax,[labels_list]
79
	jae	out_of_memory
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
85
	or	ebp,ebp
85
	or	ebp,ebp
86
	jz	valid_number
86
	jz	valid_number
87
	mov	byte [edi-1],0Fh
87
	mov	byte [edi-1],0Fh
88
	ret
88
	ret
89
      valid_number:
89
      valid_number:
90
	cmp	dword [edi+4],0
90
	cmp	dword [edi+4],0
91
	jne	qword_number
91
	jne	qword_number
92
	cmp	word [edi+2],0
92
	cmp	word [edi+2],0
93
	jne	dword_number
93
	jne	dword_number
94
	cmp	byte [edi+1],0
94
	cmp	byte [edi+1],0
95
	jne	word_number
95
	jne	word_number
96
      byte_number:
96
      byte_number:
97
	mov	byte [edi-1],1
97
	mov	byte [edi-1],1
98
	inc	edi
98
	inc	edi
99
	ret
99
	ret
100
      qword_number:
100
      qword_number:
101
	mov	byte [edi-1],8
101
	mov	byte [edi-1],8
102
	add	edi,8
102
	add	edi,8
103
	ret
103
	ret
104
      dword_number:
104
      dword_number:
105
	mov	byte [edi-1],4
105
	mov	byte [edi-1],4
106
	scas	dword [edi]
106
	scas	dword [edi]
107
	ret
107
	ret
108
      word_number:
108
      word_number:
109
	mov	byte [edi-1],2
109
	mov	byte [edi-1],2
110
	scas	word [edi]
110
	scas	word [edi]
111
	ret
111
	ret
112
      expression_value:
112
      expression_value:
113
	mov	eax,esp
113
	mov	eax,esp
114
	sub	eax,100h
114
	sub	eax,100h
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
	push	[current_offset]
119
	push	[current_offset]
120
	call	convert_expression
120
	call	convert_expression
121
	pop	[current_offset]
121
	pop	[current_offset]
122
	lods	byte [esi]
122
	lods	byte [esi]
123
	cmp	al,')'
123
	cmp	al,')'
124
	jne	invalid_expression
124
	jne	invalid_expression
125
	ret
125
	ret
126
      symbol_value:
126
      symbol_value:
127
	push	edi
127
	push	edi
128
	mov	edi,address_registers
128
	mov	edi,address_registers
129
	call	get_operator
129
	call	get_operator
130
	or	al,al
130
	or	al,al
131
	jnz	register_value
131
	jnz	register_value
132
	mov	edi,directive_operators
132
	mov	edi,directive_operators
133
	call	get_operator
133
	call	get_operator
134
	pop	edi
134
	pop	edi
135
	or	al,al
135
	or	al,al
136
	jnz	broken_value
136
	jnz	broken_value
137
	lods	byte [esi]
137
	lods	byte [esi]
138
	cmp	al,1Ah
138
	cmp	al,1Ah
139
	jne	invalid_value
139
	jne	invalid_value
140
	lods	byte [esi]
140
	lods	byte [esi]
141
	movzx	ecx,al
141
	movzx	ecx,al
142
	call	get_label_id
142
	call	get_label_id
143
      store_label_value:
143
      store_label_value:
144
	mov	byte [edi-1],11h
144
	mov	byte [edi-1],11h
145
	stos	dword [edi]
145
	stos	dword [edi]
146
	ret
146
	ret
147
      broken_value:
147
      broken_value:
148
	mov	eax,0Fh
148
	mov	eax,0Fh
149
	jmp	store_label_value
149
	jmp	store_label_value
150
      register_value:
150
      register_value:
151
	pop	edi
151
	pop	edi
152
	mov	byte [edi-1],10h
152
	mov	byte [edi-1],10h
153
	stos	byte [edi]
153
	stos	byte [edi]
154
	ret
154
	ret
155
 
155
 
156
get_number:
156
get_number:
157
	xor	ebp,ebp
157
	xor	ebp,ebp
158
	lods	byte [esi]
158
	lods	byte [esi]
159
	cmp	al,22h
159
	cmp	al,22h
160
	je	get_text_number
160
	je	get_text_number
161
	cmp	al,1Ah
161
	cmp	al,1Ah
162
	jne	not_number
162
	jne	not_number
163
	lods	byte [esi]
163
	lods	byte [esi]
164
	movzx	ecx,al
164
	movzx	ecx,al
165
	mov	[number_start],esi
165
	mov	[number_start],esi
166
	mov	al,[esi]
166
	mov	al,[esi]
167
	cmp	al,'$'
167
	cmp	al,'$'
168
	je	number_begin
168
	je	number_begin
169
	sub	al,30h
169
	sub	al,30h
170
	cmp	al,9
170
	cmp	al,9
171
	ja	invalid_number
171
	ja	invalid_number
172
      number_begin:
172
      number_begin:
173
	mov	ebx,esi
173
	mov	ebx,esi
174
	add	esi,ecx
174
	add	esi,ecx
175
	push	esi
175
	push	esi
176
	dec	esi
176
	dec	esi
177
	mov	dword [edi],0
177
	mov	dword [edi],0
178
	mov	dword [edi+4],0
178
	mov	dword [edi+4],0
179
	cmp	byte [ebx],'$'
179
	cmp	byte [ebx],'$'
180
	je	pascal_hex_number
180
	je	pascal_hex_number
181
	cmp	word [ebx],'0x'
181
	cmp	word [ebx],'0x'
182
	je	c_hex_number
182
	je	get_hex_number
183
	mov	al,[esi]
183
	mov	al,[esi]
184
	dec	esi
184
	dec	esi
185
	cmp	al,'h'
185
	cmp	al,'h'
186
	je	get_hex_number
186
	je	get_hex_number
187
	cmp	al,'b'
187
	cmp	al,'b'
188
	je	get_bin_number
188
	je	get_bin_number
189
	cmp	al,'d'
189
	cmp	al,'d'
190
	je	get_dec_number
190
	je	get_dec_number
191
	cmp	al,'o'
191
	cmp	al,'o'
192
	je	get_oct_number
192
	je	get_oct_number
193
	cmp	al,'H'
193
	cmp	al,'H'
194
	je	get_hex_number
194
	je	get_hex_number
195
	cmp	al,'B'
195
	cmp	al,'B'
196
	je	get_bin_number
196
	je	get_bin_number
197
	cmp	al,'D'
197
	cmp	al,'D'
198
	je	get_dec_number
198
	je	get_dec_number
199
	cmp	al,'O'
199
	cmp	al,'O'
200
	je	get_oct_number
200
	je	get_oct_number
201
	inc	esi
201
	inc	esi
202
      get_dec_number:
202
      get_dec_number:
203
	mov	ebx,esi
203
	mov	ebx,esi
204
	mov	esi,[number_start]
204
	mov	esi,[number_start]
205
      get_dec_digit:
205
      get_dec_digit:
206
	cmp	esi,ebx
206
	cmp	esi,ebx
207
	ja	number_ok
207
	ja	number_ok
208
	xor	edx,edx
208
	xor	edx,edx
209
	mov	eax,[edi]
209
	mov	eax,[edi]
210
	shld	edx,eax,2
210
	shld	edx,eax,2
211
	shl	eax,2
211
	shl	eax,2
212
	add	eax,[edi]
212
	add	eax,[edi]
213
	adc	edx,0
213
	adc	edx,0
214
	add	eax,eax
214
	add	eax,eax
215
	adc	edx,edx
215
	adc	edx,edx
216
	mov	[edi],eax
216
	mov	[edi],eax
217
	mov	eax,[edi+4]
217
	mov	eax,[edi+4]
218
	add	eax,eax
218
	add	eax,eax
219
	jc	dec_out_of_range
219
	jc	dec_out_of_range
220
	add	eax,eax
220
	add	eax,eax
221
	jc	dec_out_of_range
221
	jc	dec_out_of_range
222
	add	eax,[edi+4]
222
	add	eax,[edi+4]
223
	jc	dec_out_of_range
223
	jc	dec_out_of_range
224
	add	eax,eax
224
	add	eax,eax
225
	jc	dec_out_of_range
225
	jc	dec_out_of_range
226
	add	eax,edx
226
	add	eax,edx
227
	jc	dec_out_of_range
227
	jc	dec_out_of_range
228
	mov	[edi+4],eax
228
	mov	[edi+4],eax
229
	movzx	eax,byte [esi]
229
	movzx	eax,byte [esi]
230
	sub	al,30h
230
	sub	al,30h
231
	cmp	al,9
231
	cmp	al,9
232
	ja	bad_number
232
	ja	bad_number
233
	add	[edi],eax
233
	add	[edi],eax
234
	adc	dword [edi+4],0
234
	adc	dword [edi+4],0
235
	jc	dec_out_of_range
235
	jc	dec_out_of_range
236
	inc	esi
236
	inc	esi
237
	jmp	get_dec_digit
237
	jmp	get_dec_digit
238
      dec_out_of_range:
238
      dec_out_of_range:
239
	or	ebp,-1
239
	or	ebp,-1
240
	inc	esi
240
	inc	esi
241
	jmp	get_dec_digit
241
	jmp	get_dec_digit
242
      bad_number:
242
      bad_number:
243
	pop	eax
243
	pop	eax
244
      invalid_number:
244
      invalid_number:
245
	mov	esi,[number_start]
245
	mov	esi,[number_start]
246
	dec	esi
246
	dec	esi
247
      not_number:
247
      not_number:
248
	dec	esi
248
	dec	esi
249
	stc
249
	stc
250
	ret
250
	ret
251
      get_bin_number:
251
      get_bin_number:
252
	xor	bl,bl
252
	xor	bl,bl
253
      get_bin_digit:
253
      get_bin_digit:
254
	cmp	esi,[number_start]
254
	cmp	esi,[number_start]
255
	jb	number_ok
255
	jb	number_ok
256
	movzx	eax,byte [esi]
256
	movzx	eax,byte [esi]
257
	sub	al,30h
257
	sub	al,30h
258
	cmp	al,1
258
	cmp	al,1
259
	ja	bad_number
259
	ja	bad_number
260
	xor	edx,edx
260
	xor	edx,edx
261
	mov	cl,bl
261
	mov	cl,bl
262
	dec	esi
262
	dec	esi
263
	cmp	bl,64
263
	cmp	bl,64
264
	je	bin_out_of_range
264
	je	bin_out_of_range
265
	inc	bl
265
	inc	bl
266
	cmp	cl,32
266
	cmp	cl,32
267
	jae	bin_digit_high
267
	jae	bin_digit_high
268
	shl	eax,cl
268
	shl	eax,cl
269
	or	dword [edi],eax
269
	or	dword [edi],eax
270
	jmp	get_bin_digit
270
	jmp	get_bin_digit
271
      bin_digit_high:
271
      bin_digit_high:
272
	sub	cl,32
272
	sub	cl,32
273
	shl	eax,cl
273
	shl	eax,cl
274
	or	dword [edi+4],eax
274
	or	dword [edi+4],eax
275
	jmp	get_bin_digit
275
	jmp	get_bin_digit
276
      bin_out_of_range:
276
      bin_out_of_range:
277
	or	al,al
277
	or	al,al
278
	jz	get_bin_digit
278
	jz	get_bin_digit
279
	or	ebp,-1
279
	or	ebp,-1
280
	jmp	get_bin_digit
280
	jmp	get_bin_digit
281
      c_hex_number:
281
      pascal_hex_number:
282
	cmp	cl,2
-
 
283
	je	bad_number
-
 
284
      pascal_hex_number:
-
 
285
	cmp	cl,1
282
	cmp	cl,1
286
	je	bad_number
283
	je	bad_number
287
      get_hex_number:
284
      get_hex_number:
288
	xor	bl,bl
285
	xor	bl,bl
289
      get_hex_digit:
286
      get_hex_digit:
290
	cmp	esi,[number_start]
287
	cmp	esi,[number_start]
291
	jb	number_ok
288
	jb	number_ok
292
	movzx	eax,byte [esi]
289
	movzx	eax,byte [esi]
293
	cmp	al,'x'
290
	cmp	al,'x'
294
	je	hex_number_ok
291
	je	hex_number_ok
295
	cmp	al,'$'
292
	cmp	al,'$'
296
	je	pascal_hex_ok
293
	je	pascal_hex_ok
297
	sub	al,30h
294
	sub	al,30h
298
	cmp	al,9
295
	cmp	al,9
299
	jbe	hex_digit_ok
296
	jbe	hex_digit_ok
300
	sub	al,7
297
	sub	al,7
301
	cmp	al,15
298
	cmp	al,15
302
	jbe	hex_letter_digit_ok
299
	jbe	hex_letter_digit_ok
303
	sub	al,20h
300
	sub	al,20h
304
	cmp	al,15
301
	cmp	al,15
305
	ja	bad_number
302
	ja	bad_number
306
      hex_letter_digit_ok:
303
      hex_letter_digit_ok:
307
	cmp	al,10
304
	cmp	al,10
308
	jb	bad_number
305
	jb	bad_number
309
      hex_digit_ok:
306
      hex_digit_ok:
310
	xor	edx,edx
307
	xor	edx,edx
311
	mov	cl,bl
308
	mov	cl,bl
312
	dec	esi
309
	dec	esi
313
	cmp	bl,64
310
	cmp	bl,64
314
	je	hex_out_of_range
311
	je	hex_out_of_range
315
	add	bl,4
312
	add	bl,4
316
	cmp	cl,32
313
	cmp	cl,32
317
	jae	hex_digit_high
314
	jae	hex_digit_high
318
	shl	eax,cl
315
	shl	eax,cl
319
	or	dword [edi],eax
316
	or	dword [edi],eax
320
	jmp	get_hex_digit
317
	jmp	get_hex_digit
321
      hex_digit_high:
318
      hex_digit_high:
322
	sub	cl,32
319
	sub	cl,32
323
	shl	eax,cl
320
	shl	eax,cl
324
	or	dword [edi+4],eax
321
	or	dword [edi+4],eax
325
	jmp	get_hex_digit
322
	jmp	get_hex_digit
326
      hex_out_of_range:
323
      hex_out_of_range:
327
	or	al,al
324
	or	al,al
328
	jz	get_hex_digit
325
	jz	get_hex_digit
329
	or	ebp,-1
326
	or	ebp,-1
330
	jmp	get_hex_digit
327
	jmp	get_hex_digit
331
      get_oct_number:
328
      get_oct_number:
332
	xor	bl,bl
329
	xor	bl,bl
333
      get_oct_digit:
330
      get_oct_digit:
334
	cmp	esi,[number_start]
331
	cmp	esi,[number_start]
335
	jb	number_ok
332
	jb	number_ok
336
	movzx	eax,byte [esi]
333
	movzx	eax,byte [esi]
337
	sub	al,30h
334
	sub	al,30h
338
	cmp	al,7
335
	cmp	al,7
339
	ja	bad_number
336
	ja	bad_number
340
      oct_digit_ok:
337
      oct_digit_ok:
341
	xor	edx,edx
338
	xor	edx,edx
342
	mov	cl,bl
339
	mov	cl,bl
343
	dec	esi
340
	dec	esi
344
	cmp	bl,64
341
	cmp	bl,64
345
	jae	oct_out_of_range
342
	jae	oct_out_of_range
346
	add	bl,3
343
	add	bl,3
347
	cmp	cl,30
344
	cmp	cl,30
348
	je	oct_digit_wrap
345
	je	oct_digit_wrap
349
	ja	oct_digit_high
346
	ja	oct_digit_high
350
	shl	eax,cl
347
	shl	eax,cl
351
	or	dword [edi],eax
348
	or	dword [edi],eax
352
	jmp	get_oct_digit
349
	jmp	get_oct_digit
353
      oct_digit_wrap:
350
      oct_digit_wrap:
354
	shl	eax,cl
351
	shl	eax,cl
355
	adc	dword [edi+4],0
352
	adc	dword [edi+4],0
356
	or	dword [edi],eax
353
	or	dword [edi],eax
357
	jmp	get_oct_digit
354
	jmp	get_oct_digit
358
      oct_digit_high:
355
      oct_digit_high:
359
	sub	cl,32
356
	sub	cl,32
360
	shl	eax,cl
357
	shl	eax,cl
361
	or	dword [edi+4],eax
358
	or	dword [edi+4],eax
362
	jmp	get_oct_digit
359
	jmp	get_oct_digit
363
      oct_out_of_range:
360
      oct_out_of_range:
364
	or	al,al
361
	or	al,al
365
	jz	get_oct_digit
362
	jz	get_oct_digit
366
	or	ebp,-1
363
	or	ebp,-1
367
	jmp	get_oct_digit
364
	jmp	get_oct_digit
368
      hex_number_ok:
365
      hex_number_ok:
369
	dec	esi
366
	dec	esi
370
      pascal_hex_ok:
367
      pascal_hex_ok:
371
	cmp	esi,[number_start]
368
	cmp	esi,[number_start]
372
	jne	bad_number
369
	jne	bad_number
373
      number_ok:
370
      number_ok:
374
	pop	esi
371
	pop	esi
375
      number_done:
372
      number_done:
376
	clc
373
	clc
377
	ret
374
	ret
378
      get_text_number:
375
      get_text_number:
379
	lods	dword [esi]
376
	lods	dword [esi]
380
	mov	edx,eax
377
	mov	edx,eax
381
	xor	bl,bl
378
	xor	bl,bl
382
	mov	dword [edi],0
379
	mov	dword [edi],0
383
	mov	dword [edi+4],0
380
	mov	dword [edi+4],0
384
      get_text_character:
381
      get_text_character:
385
	sub	edx,1
382
	sub	edx,1
386
	jc	number_done
383
	jc	number_done
387
	movzx	eax,byte [esi]
384
	movzx	eax,byte [esi]
388
	inc	esi
385
	inc	esi
389
	mov	cl,bl
386
	mov	cl,bl
390
	cmp	bl,64
387
	cmp	bl,64
391
	je	text_out_of_range
388
	je	text_out_of_range
392
	add	bl,8
389
	add	bl,8
393
	cmp	cl,32
390
	cmp	cl,32
394
	jae	text_character_high
391
	jae	text_character_high
395
	shl	eax,cl
392
	shl	eax,cl
396
	or	dword [edi],eax
393
	or	dword [edi],eax
397
	jmp	get_text_character
394
	jmp	get_text_character
398
      text_character_high:
395
      text_character_high:
399
	sub	cl,32
396
	sub	cl,32
400
	shl	eax,cl
397
	shl	eax,cl
401
	or	dword [edi+4],eax
398
	or	dword [edi+4],eax
402
	jmp	get_text_character
399
	jmp	get_text_character
403
      text_out_of_range:
400
      text_out_of_range:
404
	or	ebp,-1
401
	or	ebp,-1
405
	jmp	get_text_character
402
	jmp	get_text_character
406
 
403
 
407
get_fp_value:
404
get_fp_value:
408
	push	edi esi
405
	push	edi esi
409
	lods	byte [esi]
406
	lods	byte [esi]
410
	cmp	al,1Ah
407
	cmp	al,1Ah
411
	je	fp_value_start
408
	je	fp_value_start
412
	cmp	al,'-'
409
	cmp	al,'-'
413
	je	fp_sign_ok
410
	je	fp_sign_ok
414
	cmp	al,'+'
411
	cmp	al,'+'
415
	jne	not_fp_value
412
	jne	not_fp_value
416
      fp_sign_ok:
413
      fp_sign_ok:
417
	lods	byte [esi]
414
	lods	byte [esi]
418
	cmp	al,1Ah
415
	cmp	al,1Ah
419
	jne	not_fp_value
416
	jne	not_fp_value
420
      fp_value_start:
417
      fp_value_start:
421
	lods	byte [esi]
418
	lods	byte [esi]
422
	movzx	ecx,al
419
	movzx	ecx,al
423
	cmp	cl,1
420
	cmp	cl,1
424
	jbe	not_fp_value
421
	jbe	not_fp_value
425
	lea	edx,[esi+1]
422
	lea	edx,[esi+1]
426
	xor	ah,ah
423
	xor	ah,ah
427
      check_fp_value:
424
      check_fp_value:
428
	lods	byte [esi]
425
	lods	byte [esi]
429
	cmp	al,'.'
426
	cmp	al,'.'
430
	je	fp_character_dot
427
	je	fp_character_dot
431
	cmp	al,'E'
428
	cmp	al,'E'
432
	je	fp_character_exp
429
	je	fp_character_exp
433
	cmp	al,'e'
430
	cmp	al,'e'
434
	je	fp_character_exp
431
	je	fp_character_exp
435
	cmp	al,'F'
432
	cmp	al,'F'
436
	je	fp_last_character
433
	je	fp_last_character
437
	cmp	al,'f'
434
	cmp	al,'f'
438
	je	fp_last_character
435
	je	fp_last_character
439
      digit_expected:
436
      digit_expected:
440
	cmp	al,'0'
437
	cmp	al,'0'
441
	jb	not_fp_value
438
	jb	not_fp_value
442
	cmp	al,'9'
439
	cmp	al,'9'
443
	ja	not_fp_value
440
	ja	not_fp_value
444
	jmp	fp_character_ok
441
	jmp	fp_character_ok
445
      fp_character_dot:
442
      fp_character_dot:
446
	cmp	esi,edx
443
	cmp	esi,edx
447
	je	not_fp_value
444
	je	not_fp_value
448
	or	ah,ah
445
	or	ah,ah
449
	jnz	not_fp_value
446
	jnz	not_fp_value
450
	or	ah,1
447
	or	ah,1
451
	lods	byte [esi]
448
	lods	byte [esi]
452
	loop	digit_expected
449
	loop	digit_expected
453
      not_fp_value:
450
      not_fp_value:
454
	pop	esi edi
451
	pop	esi edi
455
	stc
452
	stc
456
	ret
453
	ret
457
      fp_last_character:
454
      fp_last_character:
458
	cmp	cl,1
455
	cmp	cl,1
459
	jne	not_fp_value
456
	jne	not_fp_value
460
	or	ah,4
457
	or	ah,4
461
	jmp	fp_character_ok
458
	jmp	fp_character_ok
462
      fp_character_exp:
459
      fp_character_exp:
463
	cmp	esi,edx
460
	cmp	esi,edx
464
	je	not_fp_value
461
	je	not_fp_value
465
	cmp	ah,1
462
	cmp	ah,1
466
	ja	not_fp_value
463
	ja	not_fp_value
467
	or	ah,2
464
	or	ah,2
468
	cmp	ecx,1
465
	cmp	ecx,1
469
	jne	fp_character_ok
466
	jne	fp_character_ok
470
	cmp	byte [esi],'+'
467
	cmp	byte [esi],'+'
471
	je	fp_exp_sign
468
	je	fp_exp_sign
472
	cmp	byte [esi],'-'
469
	cmp	byte [esi],'-'
473
	jne	fp_character_ok
470
	jne	fp_character_ok
474
      fp_exp_sign:
471
      fp_exp_sign:
475
	inc	esi
472
	inc	esi
476
	cmp	byte [esi],1Ah
473
	cmp	byte [esi],1Ah
477
	jne	not_fp_value
474
	jne	not_fp_value
478
	inc	esi
475
	inc	esi
479
	lods	byte [esi]
476
	lods	byte [esi]
480
	movzx	ecx,al
477
	movzx	ecx,al
481
	inc	ecx
478
	inc	ecx
482
      fp_character_ok:
479
      fp_character_ok:
483
	dec	ecx
480
	dec	ecx
484
	jnz	check_fp_value
481
	jnz	check_fp_value
485
	or	ah,ah
482
	or	ah,ah
486
	jz	not_fp_value
483
	jz	not_fp_value
487
	pop	esi
484
	pop	esi
488
	lods	byte [esi]
485
	lods	byte [esi]
489
	mov	[fp_sign],0
486
	mov	[fp_sign],0
490
	cmp	al,1Ah
487
	cmp	al,1Ah
491
	je	fp_get
488
	je	fp_get
492
	inc	esi
489
	inc	esi
493
	cmp	al,'+'
490
	cmp	al,'+'
494
	je	fp_get
491
	je	fp_get
495
	mov	[fp_sign],1
492
	mov	[fp_sign],1
496
      fp_get:
493
      fp_get:
497
	lods	byte [esi]
494
	lods	byte [esi]
498
	movzx	ecx,al
495
	movzx	ecx,al
499
	xor	edx,edx
496
	xor	edx,edx
500
	mov	edi,fp_value
497
	mov	edi,fp_value
501
	mov	[edi],edx
498
	mov	[edi],edx
502
	mov	[edi+4],edx
499
	mov	[edi+4],edx
503
	mov	[edi+12],edx
500
	mov	[edi+12],edx
504
	call	fp_optimize
501
	call	fp_optimize
505
	mov	[fp_format],0
502
	mov	[fp_format],0
506
	mov	al,[esi]
503
	mov	al,[esi]
507
      fp_before_dot:
504
      fp_before_dot:
508
	lods	byte [esi]
505
	lods	byte [esi]
509
	cmp	al,'.'
506
	cmp	al,'.'
510
	je	fp_dot
507
	je	fp_dot
511
	cmp	al,'E'
508
	cmp	al,'E'
512
	je	fp_exponent
509
	je	fp_exponent
513
	cmp	al,'e'
510
	cmp	al,'e'
514
	je	fp_exponent
511
	je	fp_exponent
515
	cmp	al,'F'
512
	cmp	al,'F'
516
	je	fp_done
513
	je	fp_done
517
	cmp	al,'f'
514
	cmp	al,'f'
518
	je	fp_done
515
	je	fp_done
519
	sub	al,30h
516
	sub	al,30h
520
	mov	edi,fp_value+16
517
	mov	edi,fp_value+16
521
	xor	edx,edx
518
	xor	edx,edx
522
	mov	dword [edi+12],edx
519
	mov	dword [edi+12],edx
523
	mov	dword [edi],edx
520
	mov	dword [edi],edx
524
	mov	dword [edi+4],edx
521
	mov	dword [edi+4],edx
525
	mov	[edi+7],al
522
	mov	[edi+7],al
526
	mov	dl,7
523
	mov	dl,7
527
	mov	dword [edi+8],edx
524
	mov	dword [edi+8],edx
528
	call	fp_optimize
525
	call	fp_optimize
529
	mov	edi,fp_value
526
	mov	edi,fp_value
530
	push	ecx
527
	push	ecx
531
	mov	ecx,10
528
	mov	ecx,10
532
	call	fp_mul
529
	call	fp_mul
533
	pop	ecx
530
	pop	ecx
534
	mov	ebx,fp_value+16
531
	mov	ebx,fp_value+16
535
	call	fp_add
532
	call	fp_add
536
	loop	fp_before_dot
533
	loop	fp_before_dot
537
      fp_dot:
534
      fp_dot:
538
	mov	edi,fp_value+16
535
	mov	edi,fp_value+16
539
	xor	edx,edx
536
	xor	edx,edx
540
	mov	[edi],edx
537
	mov	[edi],edx
541
	mov	[edi+4],edx
538
	mov	[edi+4],edx
542
	mov	byte [edi+7],80h
539
	mov	byte [edi+7],80h
543
	mov	[edi+8],edx
540
	mov	[edi+8],edx
544
	mov	dword [edi+12],edx
541
	mov	dword [edi+12],edx
545
	dec	ecx
542
	dec	ecx
546
	jz	fp_done
543
	jz	fp_done
547
      fp_after_dot:
544
      fp_after_dot:
548
	lods	byte [esi]
545
	lods	byte [esi]
549
	cmp	al,'E'
546
	cmp	al,'E'
550
	je	fp_exponent
547
	je	fp_exponent
551
	cmp	al,'e'
548
	cmp	al,'e'
552
	je	fp_exponent
549
	je	fp_exponent
553
	cmp	al,'F'
550
	cmp	al,'F'
554
	je	fp_done
551
	je	fp_done
555
	cmp	al,'f'
552
	cmp	al,'f'
556
	je	fp_done
553
	je	fp_done
557
	inc	[fp_format]
554
	inc	[fp_format]
558
	cmp	[fp_format],80h
555
	cmp	[fp_format],80h
559
	jne	fp_counter_ok
556
	jne	fp_counter_ok
560
	mov	[fp_format],7Fh
557
	mov	[fp_format],7Fh
561
      fp_counter_ok:
558
      fp_counter_ok:
562
	dec	esi
559
	dec	esi
563
	mov	edi,fp_value+16
560
	mov	edi,fp_value+16
564
	push	ecx
561
	push	ecx
565
	mov	ecx,10
562
	mov	ecx,10
566
	call	fp_div
563
	call	fp_div
567
	push	dword [edi]
564
	push	dword [edi]
568
	push	dword [edi+4]
565
	push	dword [edi+4]
569
	push	dword [edi+8]
566
	push	dword [edi+8]
570
	push	dword [edi+12]
567
	push	dword [edi+12]
571
	lods	byte [esi]
568
	lods	byte [esi]
572
	sub	al,30h
569
	sub	al,30h
573
	movzx	ecx,al
570
	movzx	ecx,al
574
	call	fp_mul
571
	call	fp_mul
575
	mov	ebx,edi
572
	mov	ebx,edi
576
	mov	edi,fp_value
573
	mov	edi,fp_value
577
	call	fp_add
574
	call	fp_add
578
	mov	edi,fp_value+16
575
	mov	edi,fp_value+16
579
	pop	dword [edi+12]
576
	pop	dword [edi+12]
580
	pop	dword [edi+8]
577
	pop	dword [edi+8]
581
	pop	dword [edi+4]
578
	pop	dword [edi+4]
582
	pop	dword [edi]
579
	pop	dword [edi]
583
	pop	ecx
580
	pop	ecx
584
	loop	fp_after_dot
581
	loop	fp_after_dot
585
	jmp	fp_done
582
	jmp	fp_done
586
      fp_exponent:
583
      fp_exponent:
587
	or	[fp_format],80h
584
	or	[fp_format],80h
588
	xor	edx,edx
585
	xor	edx,edx
589
	xor	ebp,ebp
586
	xor	ebp,ebp
590
	dec	ecx
587
	dec	ecx
591
	jnz	get_exponent
588
	jnz	get_exponent
592
	cmp	byte [esi],'+'
589
	cmp	byte [esi],'+'
593
	je	fp_exponent_sign
590
	je	fp_exponent_sign
594
	cmp	byte [esi],'-'
591
	cmp	byte [esi],'-'
595
	jne	fp_done
592
	jne	fp_done
596
	not	ebp
593
	not	ebp
597
      fp_exponent_sign:
594
      fp_exponent_sign:
598
	add	esi,2
595
	add	esi,2
599
	lods	byte [esi]
596
	lods	byte [esi]
600
	movzx	ecx,al
597
	movzx	ecx,al
601
      get_exponent:
598
      get_exponent:
602
	movzx	eax,byte [esi]
599
	movzx	eax,byte [esi]
603
	inc	esi
600
	inc	esi
604
	sub	al,30h
601
	sub	al,30h
605
	cmp	al,10
602
	cmp	al,10
606
	jae	exponent_ok
603
	jae	exponent_ok
607
	imul	edx,10
604
	imul	edx,10
608
	cmp	edx,8000h
605
	cmp	edx,8000h
609
	jae	value_out_of_range
606
	jae	value_out_of_range
610
	add	edx,eax
607
	add	edx,eax
611
	loop	get_exponent
608
	loop	get_exponent
612
      exponent_ok:
609
      exponent_ok:
613
	mov	edi,fp_value
610
	mov	edi,fp_value
614
	or	edx,edx
611
	or	edx,edx
615
	jz	fp_done
612
	jz	fp_done
616
	mov	ecx,edx
613
	mov	ecx,edx
617
	or	ebp,ebp
614
	or	ebp,ebp
618
	jnz	fp_negative_power
615
	jnz	fp_negative_power
619
      fp_power:
616
      fp_power:
620
	push	ecx
617
	push	ecx
621
	mov	ecx,10
618
	mov	ecx,10
622
	call	fp_mul
619
	call	fp_mul
623
	pop	ecx
620
	pop	ecx
624
	loop	fp_power
621
	loop	fp_power
625
	jmp	fp_done
622
	jmp	fp_done
626
      fp_negative_power:
623
      fp_negative_power:
627
	push	ecx
624
	push	ecx
628
	mov	ecx,10
625
	mov	ecx,10
629
	call	fp_div
626
	call	fp_div
630
	pop	ecx
627
	pop	ecx
631
	loop	fp_negative_power
628
	loop	fp_negative_power
632
      fp_done:
629
      fp_done:
633
	mov	edi,fp_value
630
	mov	edi,fp_value
634
	mov	al,[fp_format]
631
	mov	al,[fp_format]
635
	mov	[edi+10],al
632
	mov	[edi+10],al
636
	mov	al,[fp_sign]
633
	mov	al,[fp_sign]
637
	mov	[edi+11],al
634
	mov	[edi+11],al
638
	test	byte [edi+15],80h
635
	test	byte [edi+15],80h
639
	jz	fp_ok
636
	jz	fp_ok
640
	add	dword [edi],1
637
	add	dword [edi],1
641
	adc	dword [edi+4],0
638
	adc	dword [edi+4],0
642
	jnc	fp_ok
639
	jnc	fp_ok
643
	mov	eax,[edi+4]
640
	mov	eax,[edi+4]
644
	shrd	[edi],eax,1
641
	shrd	[edi],eax,1
645
	shr	eax,1
642
	shr	eax,1
646
	or	eax,80000000h
643
	or	eax,80000000h
647
	mov	[edi+4],eax
644
	mov	[edi+4],eax
648
	inc	word [edi+8]
645
	inc	word [edi+8]
649
      fp_ok:
646
      fp_ok:
650
	pop	edi
647
	pop	edi
651
	clc
648
	clc
652
	ret
649
	ret
653
      fp_mul:
650
      fp_mul:
654
	or	ecx,ecx
651
	or	ecx,ecx
655
	jz	fp_zero
652
	jz	fp_zero
656
	mov	eax,[edi+12]
653
	mov	eax,[edi+12]
657
	mul	ecx
654
	mul	ecx
658
	mov	[edi+12],eax
655
	mov	[edi+12],eax
659
	mov	ebx,edx
656
	mov	ebx,edx
660
	mov	eax,[edi]
657
	mov	eax,[edi]
661
	mul	ecx
658
	mul	ecx
662
	add	eax,ebx
659
	add	eax,ebx
663
	adc	edx,0
660
	adc	edx,0
664
	mov	[edi],eax
661
	mov	[edi],eax
665
	mov	ebx,edx
662
	mov	ebx,edx
666
	mov	eax,[edi+4]
663
	mov	eax,[edi+4]
667
	mul	ecx
664
	mul	ecx
668
	add	eax,ebx
665
	add	eax,ebx
669
	adc	edx,0
666
	adc	edx,0
670
	mov	[edi+4],eax
667
	mov	[edi+4],eax
671
      .loop:
668
      .loop:
672
	or	edx,edx
669
	or	edx,edx
673
	jz	.done
670
	jz	.done
674
	mov	eax,[edi]
671
	mov	eax,[edi]
675
	shrd	[edi+12],eax,1
672
	shrd	[edi+12],eax,1
676
	mov	eax,[edi+4]
673
	mov	eax,[edi+4]
677
	shrd	[edi],eax,1
674
	shrd	[edi],eax,1
678
	shrd	eax,edx,1
675
	shrd	eax,edx,1
679
	mov	[edi+4],eax
676
	mov	[edi+4],eax
680
	shr	edx,1
677
	shr	edx,1
681
	inc	dword [edi+8]
678
	inc	dword [edi+8]
682
	cmp	dword [edi+8],8000h
679
	cmp	dword [edi+8],8000h
683
	jge	value_out_of_range
680
	jge	value_out_of_range
684
	jmp	.loop
681
	jmp	.loop
685
      .done:
682
      .done:
686
	ret
683
	ret
687
      fp_div:
684
      fp_div:
688
	mov	eax,[edi+4]
685
	mov	eax,[edi+4]
689
	xor	edx,edx
686
	xor	edx,edx
690
	div	ecx
687
	div	ecx
691
	mov	[edi+4],eax
688
	mov	[edi+4],eax
692
	mov	eax,[edi]
689
	mov	eax,[edi]
693
	div	ecx
690
	div	ecx
694
	mov	[edi],eax
691
	mov	[edi],eax
695
	mov	eax,[edi+12]
692
	mov	eax,[edi+12]
696
	div	ecx
693
	div	ecx
697
	mov	[edi+12],eax
694
	mov	[edi+12],eax
698
	mov	ebx,eax
695
	mov	ebx,eax
699
	or	ebx,[edi]
696
	or	ebx,[edi]
700
	or	ebx,[edi+4]
697
	or	ebx,[edi+4]
701
	jz	fp_zero
698
	jz	fp_zero
702
      .loop:
699
      .loop:
703
	test	byte [edi+7],80h
700
	test	byte [edi+7],80h
704
	jnz	.exp_ok
701
	jnz	.exp_ok
705
	mov	eax,[edi]
702
	mov	eax,[edi]
706
	shld	[edi+4],eax,1
703
	shld	[edi+4],eax,1
707
	mov	eax,[edi+12]
704
	mov	eax,[edi+12]
708
	shld	[edi],eax,1
705
	shld	[edi],eax,1
709
	add	eax,eax
706
	add	eax,eax
710
	mov	[edi+12],eax
707
	mov	[edi+12],eax
711
	dec	dword [edi+8]
708
	dec	dword [edi+8]
712
	add	edx,edx
709
	add	edx,edx
713
	jmp	.loop
710
	jmp	.loop
714
      .exp_ok:
711
      .exp_ok:
715
	mov	eax,edx
712
	mov	eax,edx
716
	xor	edx,edx
713
	xor	edx,edx
717
	div	ecx
714
	div	ecx
718
	add	[edi+12],eax
715
	add	[edi+12],eax
719
	adc	dword [edi],0
716
	adc	dword [edi],0
720
	adc	dword [edi+4],0
717
	adc	dword [edi+4],0
721
	jnc	.done
718
	jnc	.done
722
	mov	eax,[edi+4]
719
	mov	eax,[edi+4]
723
	mov	ebx,[edi]
720
	mov	ebx,[edi]
724
	shrd	[edi],eax,1
721
	shrd	[edi],eax,1
725
	shrd	[edi+12],ebx,1
722
	shrd	[edi+12],ebx,1
726
	shr	eax,1
723
	shr	eax,1
727
	or	eax,80000000h
724
	or	eax,80000000h
728
	mov	[edi+4],eax
725
	mov	[edi+4],eax
729
	inc	dword [edi+8]
726
	inc	dword [edi+8]
730
      .done:
727
      .done:
731
	ret
728
	ret
732
      fp_add:
729
      fp_add:
733
	cmp	dword [ebx+8],8000h
730
	cmp	dword [ebx+8],8000h
734
	je	.done
731
	je	.done
735
	cmp	dword [edi+8],8000h
732
	cmp	dword [edi+8],8000h
736
	je	.copy
733
	je	.copy
737
	mov	eax,[ebx+8]
734
	mov	eax,[ebx+8]
738
	cmp	eax,[edi+8]
735
	cmp	eax,[edi+8]
739
	jge	.exp_ok
736
	jge	.exp_ok
740
	mov	eax,[edi+8]
737
	mov	eax,[edi+8]
741
      .exp_ok:
738
      .exp_ok:
742
	call	.change_exp
739
	call	.change_exp
743
	xchg	ebx,edi
740
	xchg	ebx,edi
744
	call	.change_exp
741
	call	.change_exp
745
	xchg	ebx,edi
742
	xchg	ebx,edi
746
	mov	edx,[ebx+12]
743
	mov	edx,[ebx+12]
747
	mov	eax,[ebx]
744
	mov	eax,[ebx]
748
	mov	ebx,[ebx+4]
745
	mov	ebx,[ebx+4]
749
	add	[edi+12],edx
746
	add	[edi+12],edx
750
	adc	[edi],eax
747
	adc	[edi],eax
751
	adc	[edi+4],ebx
748
	adc	[edi+4],ebx
752
	jnc	.done
749
	jnc	.done
753
	mov	eax,[edi]
750
	mov	eax,[edi]
754
	shrd	[edi+12],eax,1
751
	shrd	[edi+12],eax,1
755
	mov	eax,[edi+4]
752
	mov	eax,[edi+4]
756
	shrd	[edi],eax,1
753
	shrd	[edi],eax,1
757
	shr	eax,1
754
	shr	eax,1
758
	or	eax,80000000h
755
	or	eax,80000000h
759
	mov	[edi+4],eax
756
	mov	[edi+4],eax
760
	inc	dword [edi+8]
757
	inc	dword [edi+8]
761
      .done:
758
      .done:
762
	ret
759
	ret
763
      .copy:
760
      .copy:
764
	mov	eax,[ebx]
761
	mov	eax,[ebx]
765
	mov	[edi],eax
762
	mov	[edi],eax
766
	mov	eax,[ebx+4]
763
	mov	eax,[ebx+4]
767
	mov	[edi+4],eax
764
	mov	[edi+4],eax
768
	mov	eax,[ebx+8]
765
	mov	eax,[ebx+8]
769
	mov	[edi+8],eax
766
	mov	[edi+8],eax
770
	mov	eax,[ebx+12]
767
	mov	eax,[ebx+12]
771
	mov	[edi+12],eax
768
	mov	[edi+12],eax
772
	ret
769
	ret
773
      .change_exp:
770
      .change_exp:
774
	push	ecx
771
	push	ecx
775
	mov	ecx,eax
772
	mov	ecx,eax
776
	sub	ecx,[ebx+8]
773
	sub	ecx,[ebx+8]
777
	mov	edx,[ebx+4]
774
	mov	edx,[ebx+4]
778
	jecxz	.exp_done
775
	jecxz	.exp_done
779
      .exp_loop:
776
      .exp_loop:
780
	mov	ebp,[ebx]
777
	mov	ebp,[ebx]
781
	shrd	[ebx+12],ebp,1
778
	shrd	[ebx+12],ebp,1
782
	shrd	[ebx],edx,1
779
	shrd	[ebx],edx,1
783
	shr	edx,1
780
	shr	edx,1
784
	inc	dword [ebx+8]
781
	inc	dword [ebx+8]
785
	loop	.exp_loop
782
	loop	.exp_loop
786
      .exp_done:
783
      .exp_done:
787
	mov	[ebx+4],edx
784
	mov	[ebx+4],edx
788
	pop	ecx
785
	pop	ecx
789
	ret
786
	ret
790
      fp_optimize:
787
      fp_optimize:
791
	mov	eax,[edi]
788
	mov	eax,[edi]
792
	mov	ebp,[edi+4]
789
	mov	ebp,[edi+4]
793
	or	ebp,[edi]
790
	or	ebp,[edi]
794
	or	ebp,[edi+12]
791
	or	ebp,[edi+12]
795
	jz	fp_zero
792
	jz	fp_zero
796
      .loop:
793
      .loop:
797
	test	byte [edi+7],80h
794
	test	byte [edi+7],80h
798
	jnz	.done
795
	jnz	.done
799
	shld	[edi+4],eax,1
796
	shld	[edi+4],eax,1
800
	mov	ebp,[edi+12]
797
	mov	ebp,[edi+12]
801
	shld	eax,ebp,1
798
	shld	eax,ebp,1
802
	mov	[edi],eax
799
	mov	[edi],eax
803
	shl	dword [edi+12],1
800
	shl	dword [edi+12],1
804
	dec	dword [edi+8]
801
	dec	dword [edi+8]
805
	jmp	.loop
802
	jmp	.loop
806
      .done:
803
      .done:
807
	ret
804
	ret
808
      fp_zero:
805
      fp_zero:
809
	mov	dword [edi+8],8000h
806
	mov	dword [edi+8],8000h
810
	ret
807
	ret
811
 
808
 
812
calculate_expression:
809
calculate_expression:
813
	mov	[current_offset],edi
810
	mov	[current_offset],edi
814
	mov	[value_undefined],0
811
	mov	[value_undefined],0
815
	cmp	byte [esi],0
812
	cmp	byte [esi],0
816
	je	get_string_value
813
	je	get_string_value
817
	cmp	byte [esi],'.'
814
	cmp	byte [esi],'.'
818
	je	convert_fp
815
	je	convert_fp
819
      calculation_loop:
816
      calculation_loop:
820
	lods	byte [esi]
817
	lods	byte [esi]
821
	cmp	al,1
818
	cmp	al,1
822
	je	get_byte_number
819
	je	get_byte_number
823
	cmp	al,2
820
	cmp	al,2
824
	je	get_word_number
821
	je	get_word_number
825
	cmp	al,4
822
	cmp	al,4
826
	je	get_dword_number
823
	je	get_dword_number
827
	cmp	al,8
824
	cmp	al,8
828
	je	get_qword_number
825
	je	get_qword_number
829
	cmp	al,0Fh
826
	cmp	al,0Fh
830
	je	value_out_of_range
827
	je	value_out_of_range
831
	cmp	al,10h
828
	cmp	al,10h
832
	je	get_register
829
	je	get_register
833
	cmp	al,11h
830
	cmp	al,11h
834
	je	get_label
831
	je	get_label
835
	cmp	al,')'
832
	cmp	al,')'
836
	je	expression_calculated
833
	je	expression_calculated
837
	cmp	al,']'
834
	cmp	al,']'
838
	je	expression_calculated
835
	je	expression_calculated
839
	cmp	al,'!'
836
	cmp	al,'!'
840
	je	invalid_expression
837
	je	invalid_expression
841
	sub	edi,14h
838
	sub	edi,14h
842
	mov	ebx,edi
839
	mov	ebx,edi
843
	sub	ebx,14h
840
	sub	ebx,14h
844
	cmp	al,0E0h
841
	cmp	al,0E0h
845
	je	calculate_rva
842
	je	calculate_rva
846
	cmp	al,0E1h
843
	cmp	al,0E1h
847
	je	calculate_plt
844
	je	calculate_plt
848
	cmp	al,0D0h
845
	cmp	al,0D0h
849
	je	calculate_not
846
	je	calculate_not
850
	cmp	al,083h
847
	cmp	al,083h
851
	je	calculate_neg
848
	je	calculate_neg
852
	mov	dx,[ebx+8]
849
	mov	dx,[ebx+8]
853
	or	dx,[edi+8]
850
	or	dx,[edi+8]
854
	cmp	al,80h
851
	cmp	al,80h
855
	je	calculate_add
852
	je	calculate_add
856
	cmp	al,81h
853
	cmp	al,81h
857
	je	calculate_sub
854
	je	calculate_sub
858
	mov	ah,[ebx+12]
855
	mov	ah,[ebx+12]
859
	or	ah,[edi+12]
856
	or	ah,[edi+12]
860
	jz	absolute_values_calculation
857
	jz	absolute_values_calculation
861
	cmp	[error_line],0
858
	cmp	[error_line],0
862
	jne	absolute_values_calculation
859
	jne	absolute_values_calculation
863
	mov	eax,[current_line]
860
	mov	eax,[current_line]
864
	mov	[error_line],eax
861
	mov	[error_line],eax
865
	mov	[error],invalid_use_of_symbol
862
	mov	[error],invalid_use_of_symbol
866
      absolute_values_calculation:
863
      absolute_values_calculation:
867
	cmp	al,90h
864
	cmp	al,90h
868
	je	calculate_mul
865
	je	calculate_mul
869
	cmp	al,91h
866
	cmp	al,91h
870
	je	calculate_div
867
	je	calculate_div
871
	or	dx,dx
868
	or	dx,dx
872
	jnz	invalid_expression
869
	jnz	invalid_expression
873
	cmp	al,0A0h
870
	cmp	al,0A0h
874
	je	calculate_mod
871
	je	calculate_mod
875
	cmp	al,0B0h
872
	cmp	al,0B0h
876
	je	calculate_and
873
	je	calculate_and
877
	cmp	al,0B1h
874
	cmp	al,0B1h
878
	je	calculate_or
875
	je	calculate_or
879
	cmp	al,0B2h
876
	cmp	al,0B2h
880
	je	calculate_xor
877
	je	calculate_xor
881
	cmp	al,0C0h
878
	cmp	al,0C0h
882
	je	calculate_shl
879
	je	calculate_shl
883
	cmp	al,0C1h
880
	cmp	al,0C1h
884
	je	calculate_shr
881
	je	calculate_shr
885
	jmp	invalid_expression
882
	jmp	invalid_expression
886
      expression_calculated:
883
      expression_calculated:
887
	sub	edi,14h
884
	sub	edi,14h
888
	cmp	[value_undefined],0
885
	cmp	[value_undefined],0
889
	je	expression_value_ok
886
	je	expression_value_ok
890
	xor	eax,eax
887
	xor	eax,eax
891
	mov	[edi],eax
888
	mov	[edi],eax
892
	mov	[edi+4],eax
889
	mov	[edi+4],eax
893
	mov	[edi+12],al
890
	mov	[edi+12],al
894
      expression_value_ok:
891
      expression_value_ok:
895
	ret
892
	ret
896
      get_byte_number:
893
      get_byte_number:
897
	mov	word [edi+8],0
894
	mov	word [edi+8],0
898
	mov	byte [edi+12],0
895
	mov	byte [edi+12],0
899
	xor	eax,eax
896
	xor	eax,eax
900
	lods	byte [esi]
897
	lods	byte [esi]
901
	stos	dword [edi]
898
	stos	dword [edi]
902
	xor	al,al
899
	xor	al,al
903
	stos	dword [edi]
900
	stos	dword [edi]
904
	add	edi,0Ch
901
	add	edi,0Ch
905
	jmp	calculation_loop
902
	jmp	calculation_loop
906
      get_word_number:
903
      get_word_number:
907
	mov	word [edi+8],0
904
	mov	word [edi+8],0
908
	mov	byte [edi+12],0
905
	mov	byte [edi+12],0
909
	xor	eax,eax
906
	xor	eax,eax
910
	lods	word [esi]
907
	lods	word [esi]
911
	stos	dword [edi]
908
	stos	dword [edi]
912
	xor	ax,ax
909
	xor	ax,ax
913
	stos	dword [edi]
910
	stos	dword [edi]
914
	add	edi,0Ch
911
	add	edi,0Ch
915
	jmp	calculation_loop
912
	jmp	calculation_loop
916
      get_dword_number:
913
      get_dword_number:
917
	mov	word [edi+8],0
914
	mov	word [edi+8],0
918
	mov	byte [edi+12],0
915
	mov	byte [edi+12],0
919
	movs	dword [edi],[esi]
916
	movs	dword [edi],[esi]
920
	xor	eax,eax
917
	xor	eax,eax
921
	stos	dword [edi]
918
	stos	dword [edi]
922
	add	edi,0Ch
919
	add	edi,0Ch
923
	jmp	calculation_loop
920
	jmp	calculation_loop
924
      get_qword_number:
921
      get_qword_number:
925
	mov	word [edi+8],0
922
	mov	word [edi+8],0
926
	mov	byte [edi+12],0
923
	mov	byte [edi+12],0
927
	movs	dword [edi],[esi]
924
	movs	dword [edi],[esi]
928
	movs	dword [edi],[esi]
925
	movs	dword [edi],[esi]
929
	add	edi,0Ch
926
	add	edi,0Ch
930
	jmp	calculation_loop
927
	jmp	calculation_loop
931
      get_register:
928
      get_register:
932
	mov	byte [edi+9],0
929
	mov	byte [edi+9],0
933
	mov	byte [edi+12],0
930
	mov	byte [edi+12],0
934
	lods	byte [esi]
931
	lods	byte [esi]
935
	mov	[edi+8],al
932
	mov	[edi+8],al
936
	mov	byte [edi+10],1
933
	mov	byte [edi+10],1
937
	xor	eax,eax
934
	xor	eax,eax
938
	stos	dword [edi]
935
	stos	dword [edi]
939
	stos	dword [edi]
936
	stos	dword [edi]
940
	add	edi,0Ch
937
	add	edi,0Ch
941
	jmp	calculation_loop
938
	jmp	calculation_loop
942
      get_label:
939
      get_label:
943
	xor	eax,eax
940
	xor	eax,eax
944
	mov	[edi+8],eax
941
	mov	[edi+8],eax
945
	mov	[edi+12],al
942
	mov	[edi+12],al
946
	mov	[edi+20],eax
943
	mov	[edi+20],eax
947
	lods	dword [esi]
944
	lods	dword [esi]
948
	cmp	eax,0Fh
945
	cmp	eax,0Fh
949
	jb	predefined_label
946
	jb	predefined_label
950
	je	reserved_word_used_as_symbol
947
	je	reserved_word_used_as_symbol
951
	mov	ebx,eax
948
	mov	ebx,eax
952
	mov	ax,[current_pass]
949
	mov	ax,[current_pass]
953
	mov	[ebx+18],ax
950
	mov	[ebx+18],ax
954
	or	byte [ebx+8],8
951
	or	byte [ebx+8],8
955
	test	byte [ebx+8],1
952
	test	byte [ebx+8],1
956
	jz	label_undefined
953
	jz	label_undefined
957
	cmp	ax,[ebx+16]
954
	cmp	ax,[ebx+16]
958
	je	label_defined
955
	je	label_defined
959
	test	byte [ebx+8],4
956
	test	byte [ebx+8],4
960
	jnz	label_undefined
957
	jnz	label_undefined
961
	test	byte [ebx+9],1
958
	test	byte [ebx+9],1
962
	jz	label_defined
959
	jz	label_defined
963
	mov	eax,[ebx]
960
	mov	eax,[ebx]
964
	sub	eax,dword [adjustment]
961
	sub	eax,dword [adjustment]
965
	stos	dword [edi]
962
	stos	dword [edi]
966
	mov	eax,[ebx+4]
963
	mov	eax,[ebx+4]
967
	sbb	eax,dword [adjustment+4]
964
	sbb	eax,dword [adjustment+4]
968
	stos	dword [edi]
965
	stos	dword [edi]
969
	mov	eax,dword [adjustment]
966
	mov	eax,dword [adjustment]
970
	or	eax,dword [adjustment+4]
967
	or	eax,dword [adjustment+4]
971
	jz	got_label
968
	jz	got_label
972
	or	[next_pass_needed],-1
969
	or	[next_pass_needed],-1
973
	jmp	got_label
970
	jmp	got_label
974
      label_defined:
971
      label_defined:
975
	mov	eax,[ebx]
972
	mov	eax,[ebx]
976
	stos	dword [edi]
973
	stos	dword [edi]
977
	mov	eax,[ebx+4]
974
	mov	eax,[ebx+4]
978
	stos	dword [edi]
975
	stos	dword [edi]
979
      got_label:
976
      got_label:
980
	mov	al,[ebx+11]
977
	mov	al,[ebx+11]
981
	mov	[edi-8+12],al
978
	mov	[edi-8+12],al
982
	mov	eax,[ebx+12]
979
	mov	eax,[ebx+12]
983
	mov	[edi-8+8],eax
980
	mov	[edi-8+8],eax
984
	mov	eax,[ebx+20]
981
	mov	eax,[ebx+20]
985
	mov	[edi-8+16],eax
982
	mov	[edi-8+16],eax
986
	add	edi,0Ch
983
	add	edi,0Ch
987
	mov	al,[ebx+10]
984
	mov	al,[ebx+10]
988
	or	al,al
985
	or	al,al
989
	jz	calculation_loop
986
	jz	calculation_loop
990
	cmp	[size_override],-1
987
	cmp	[size_override],-1
991
	je	calculation_loop
988
	je	calculation_loop
992
	cmp	[size_override],0
989
	cmp	[size_override],0
993
	je	check_size
990
	je	check_size
994
	cmp	[operand_size],0
991
	cmp	[operand_size],0
995
	jne	calculation_loop
992
	jne	calculation_loop
996
	mov	[operand_size],al
993
	mov	[operand_size],al
997
	jmp	calculation_loop
994
	jmp	calculation_loop
998
      check_size:
995
      check_size:
999
	xchg	[operand_size],al
996
	xchg	[operand_size],al
1000
	or	al,al
997
	or	al,al
1001
	jz	calculation_loop
998
	jz	calculation_loop
1002
	cmp	al,[operand_size]
999
	cmp	al,[operand_size]
1003
	jne	operand_sizes_do_not_match
1000
	jne	operand_sizes_do_not_match
1004
	jmp	calculation_loop
1001
	jmp	calculation_loop
1005
      current_offset_label:
1002
      current_offset_label:
1006
	mov	al,[labels_type]
1003
	mov	al,[labels_type]
1007
	mov	[edi+12],al
1004
	mov	[edi+12],al
1008
	mov	eax,[org_symbol]
1005
	mov	eax,[org_symbol]
1009
	mov	[edi+16],eax
1006
	mov	[edi+16],eax
1010
	mov	eax,[current_offset]
1007
	mov	eax,[current_offset]
1011
	xor	edx,edx
1008
	xor	edx,edx
1012
	sub	eax,dword [org_origin]
1009
	sub	eax,dword [org_origin]
1013
	sbb	edx,dword [org_origin+4]
1010
	sbb	edx,dword [org_origin+4]
1014
	stos	dword [edi]
1011
	stos	dword [edi]
1015
	mov	eax,edx
1012
	mov	eax,edx
1016
	stos	dword [edi]
1013
	stos	dword [edi]
1017
	mov	eax,[org_registers]
1014
	mov	eax,[org_registers]
1018
	stos	dword [edi]
1015
	stos	dword [edi]
1019
	add	edi,8
1016
	add	edi,8
1020
	jmp	calculation_loop
1017
	jmp	calculation_loop
1021
      org_origin_label:
1018
      org_origin_label:
1022
	mov	al,[labels_type]
1019
	mov	al,[labels_type]
1023
	mov	[edi+12],al
1020
	mov	[edi+12],al
1024
	mov	eax,[org_symbol]
1021
	mov	eax,[org_symbol]
1025
	mov	[edi+16],eax
1022
	mov	[edi+16],eax
1026
	mov	eax,[org_start]
1023
	mov	eax,[org_start]
1027
	xor	edx,edx
1024
	xor	edx,edx
1028
	sub	eax,dword [org_origin]
1025
	sub	eax,dword [org_origin]
1029
	sbb	edx,dword [org_origin+4]
1026
	sbb	edx,dword [org_origin+4]
1030
	stos	dword [edi]
1027
	stos	dword [edi]
1031
	mov	eax,edx
1028
	mov	eax,edx
1032
	stos	dword [edi]
1029
	stos	dword [edi]
1033
	mov	eax,[org_registers]
1030
	mov	eax,[org_registers]
1034
	stos	dword [edi]
1031
	stos	dword [edi]
1035
	add	edi,8
1032
	add	edi,8
1036
	jmp	calculation_loop
1033
	jmp	calculation_loop
1037
      counter_label:
1034
      counter_label:
1038
	mov	eax,[counter]
1035
	mov	eax,[counter]
1039
      make_dword_label_value:
1036
      make_dword_label_value:
1040
	stos	dword [edi]
1037
	stos	dword [edi]
1041
	xor	eax,eax
1038
	xor	eax,eax
1042
	stos	dword [edi]
1039
	stos	dword [edi]
1043
	add	edi,0Ch
1040
	add	edi,0Ch
1044
	jmp	calculation_loop
1041
	jmp	calculation_loop
1045
      timestamp_label:
1042
      timestamp_label:
1046
	call	make_timestamp
1043
	call	make_timestamp
1047
	jmp	make_dword_label_value
1044
	jmp	make_dword_label_value
1048
      predefined_label:
1045
      predefined_label:
1049
	or	eax,eax
1046
	or	eax,eax
1050
	jz	current_offset_label
1047
	jz	current_offset_label
1051
	cmp	eax,1
1048
	cmp	eax,1
1052
	je	counter_label
1049
	je	counter_label
1053
	cmp	eax,2
1050
	cmp	eax,2
1054
	je	timestamp_label
1051
	je	timestamp_label
1055
	cmp	eax,3
1052
	cmp	eax,3
1056
	je	org_origin_label
1053
	je	org_origin_label
1057
      label_undefined:
1054
      label_undefined:
1058
	cmp	[current_pass],1
1055
	cmp	[current_pass],1
1059
	ja	undefined_value
1056
	ja	undefined_value
1060
      force_next_pass:
1057
      force_next_pass:
1061
	or	[next_pass_needed],-1
1058
	or	[next_pass_needed],-1
1062
      undefined_value:
1059
      undefined_value:
1063
	mov	byte [edi+12],0
1060
	mov	byte [edi+12],0
1064
	or	[value_undefined],-1
1061
	or	[value_undefined],-1
1065
	xor	eax,eax
1062
	xor	eax,eax
1066
	stos	dword [edi]
1063
	stos	dword [edi]
1067
	stos	dword [edi]
1064
	stos	dword [edi]
1068
	add	edi,0Ch
1065
	add	edi,0Ch
1069
	cmp	[error_line],0
1066
	cmp	[error_line],0
1070
	jne	calculation_loop
1067
	jne	calculation_loop
1071
	mov	eax,[current_line]
1068
	mov	eax,[current_line]
1072
	mov	[error_line],eax
1069
	mov	[error_line],eax
1073
	mov	[error],undefined_symbol
1070
	mov	[error],undefined_symbol
1074
	jmp	calculation_loop
1071
	jmp	calculation_loop
1075
      calculate_add:
1072
      calculate_add:
1076
	mov	ecx,[ebx+16]
1073
	mov	ecx,[ebx+16]
1077
	cmp	byte [edi+12],0
1074
	cmp	byte [edi+12],0
1078
	je	add_values
1075
	je	add_values
1079
	mov	ecx,[edi+16]
1076
	mov	ecx,[edi+16]
1080
	cmp	byte [ebx+12],0
1077
	cmp	byte [ebx+12],0
1081
	je	add_values
1078
	je	add_values
1082
	cmp	[error_line],0
1079
	cmp	[error_line],0
1083
	jne	add_values
1080
	jne	add_values
1084
	mov	eax,[current_line]
1081
	mov	eax,[current_line]
1085
	mov	[error_line],eax
1082
	mov	[error_line],eax
1086
	mov	[error],invalid_use_of_symbol
1083
	mov	[error],invalid_use_of_symbol
1087
      add_values:
1084
      add_values:
1088
	mov	al,[edi+12]
1085
	mov	al,[edi+12]
1089
	or	[ebx+12],al
1086
	or	[ebx+12],al
1090
	mov	[ebx+16],ecx
1087
	mov	[ebx+16],ecx
1091
	mov	eax,[edi]
1088
	mov	eax,[edi]
1092
	add	[ebx],eax
1089
	add	[ebx],eax
1093
	mov	eax,[edi+4]
1090
	mov	eax,[edi+4]
1094
	adc	[ebx+4],eax
1091
	adc	[ebx+4],eax
1095
	or	dx,dx
1092
	or	dx,dx
1096
	jz	calculation_loop
1093
	jz	calculation_loop
1097
	push	esi
1094
	push	esi
1098
	mov	esi,ebx
1095
	mov	esi,ebx
1099
	lea	ebx,[edi+10]
1096
	lea	ebx,[edi+10]
1100
	mov	cl,[edi+8]
1097
	mov	cl,[edi+8]
1101
	call	add_register
1098
	call	add_register
1102
	lea	ebx,[edi+11]
1099
	lea	ebx,[edi+11]
1103
	mov	cl,[edi+9]
1100
	mov	cl,[edi+9]
1104
	call	add_register
1101
	call	add_register
1105
	pop	esi
1102
	pop	esi
1106
	jmp	calculation_loop
1103
	jmp	calculation_loop
1107
      add_register:
1104
      add_register:
1108
	or	cl,cl
1105
	or	cl,cl
1109
	jz	add_register_done
1106
	jz	add_register_done
1110
      add_register_start:
1107
      add_register_start:
1111
	cmp	[esi+8],cl
1108
	cmp	[esi+8],cl
1112
	jne	add_in_second_slot
1109
	jne	add_in_second_slot
1113
	mov	al,[ebx]
1110
	mov	al,[ebx]
1114
	add	[esi+10],al
1111
	add	[esi+10],al
1115
	jnz	add_register_done
1112
	jnz	add_register_done
1116
	mov	byte [esi+8],0
1113
	mov	byte [esi+8],0
1117
	ret
1114
	ret
1118
      add_in_second_slot:
1115
      add_in_second_slot:
1119
	cmp	[esi+9],cl
1116
	cmp	[esi+9],cl
1120
	jne	create_in_first_slot
1117
	jne	create_in_first_slot
1121
	mov	al,[ebx]
1118
	mov	al,[ebx]
1122
	add	[esi+11],al
1119
	add	[esi+11],al
1123
	jnz	add_register_done
1120
	jnz	add_register_done
1124
	mov	byte [esi+9],0
1121
	mov	byte [esi+9],0
1125
	ret
1122
	ret
1126
      create_in_first_slot:
1123
      create_in_first_slot:
1127
	cmp	byte [esi+8],0
1124
	cmp	byte [esi+8],0
1128
	jne	create_in_second_slot
1125
	jne	create_in_second_slot
1129
	mov	[esi+8],cl
1126
	mov	[esi+8],cl
1130
	mov	al,[ebx]
1127
	mov	al,[ebx]
1131
	mov	[esi+10],al
1128
	mov	[esi+10],al
1132
	ret
1129
	ret
1133
      create_in_second_slot:
1130
      create_in_second_slot:
1134
	cmp	byte [esi+9],0
1131
	cmp	byte [esi+9],0
1135
	jne	invalid_expression
1132
	jne	invalid_expression
1136
	mov	[esi+9],cl
1133
	mov	[esi+9],cl
1137
	mov	al,[ebx]
1134
	mov	al,[ebx]
1138
	mov	[esi+11],al
1135
	mov	[esi+11],al
1139
      add_register_done:
1136
      add_register_done:
1140
	ret
1137
	ret
1141
      calculate_sub:
1138
      calculate_sub:
1142
	xor	ah,ah
1139
	xor	ah,ah
1143
	mov	ah,[ebx+12]
1140
	mov	ah,[ebx+12]
1144
	mov	al,[edi+12]
1141
	mov	al,[edi+12]
1145
	or	al,al
1142
	or	al,al
1146
	jz	sub_values
1143
	jz	sub_values
1147
	cmp	al,ah
1144
	cmp	al,ah
1148
	jne	invalid_sub
1145
	jne	invalid_sub
1149
	xor	ah,ah
1146
	xor	ah,ah
1150
	mov	ecx,[edi+16]
1147
	mov	ecx,[edi+16]
1151
	cmp	ecx,[ebx+16]
1148
	cmp	ecx,[ebx+16]
1152
	jne	invalid_sub
1149
	jne	invalid_sub
1153
      sub_values:
1150
      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
1159
	or	dx,dx
1156
	or	dx,dx
1160
	jz	calculation_loop
1157
	jz	calculation_loop
1161
	push	esi
1158
	push	esi
1162
	mov	esi,ebx
1159
	mov	esi,ebx
1163
	lea	ebx,[edi+10]
1160
	lea	ebx,[edi+10]
1164
	mov	cl,[edi+8]
1161
	mov	cl,[edi+8]
1165
	call	sub_register
1162
	call	sub_register
1166
	lea	ebx,[edi+11]
1163
	lea	ebx,[edi+11]
1167
	mov	cl,[edi+9]
1164
	mov	cl,[edi+9]
1168
	call	sub_register
1165
	call	sub_register
1169
	pop	esi
1166
	pop	esi
1170
	jmp	calculation_loop
1167
	jmp	calculation_loop
1171
      invalid_sub:
1168
      invalid_sub:
1172
	cmp	[error_line],0
1169
	cmp	[error_line],0
1173
	jne	sub_values
1170
	jne	sub_values
1174
	mov	eax,[current_line]
1171
	mov	eax,[current_line]
1175
	mov	[error_line],eax
1172
	mov	[error_line],eax
1176
	mov	[error],invalid_use_of_symbol
1173
	mov	[error],invalid_use_of_symbol
1177
	jmp	sub_values
1174
	jmp	sub_values
1178
      sub_register:
1175
      sub_register:
1179
	or	cl,cl
1176
	or	cl,cl
1180
	jz	add_register_done
1177
	jz	add_register_done
1181
	neg	byte [ebx]
1178
	neg	byte [ebx]
1182
	jmp	add_register_start
1179
	jmp	add_register_start
1183
      calculate_mul:
1180
      calculate_mul:
1184
	or	dx,dx
1181
	or	dx,dx
1185
	jz	mul_start
1182
	jz	mul_start
1186
	cmp	word [ebx+8],0
1183
	cmp	word [ebx+8],0
1187
	jne	mul_start
1184
	jne	mul_start
1188
	mov	eax,[ebx]
1185
	mov	eax,[ebx]
1189
	xchg	eax,[edi]
1186
	xchg	eax,[edi]
1190
	mov	[ebx],eax
1187
	mov	[ebx],eax
1191
	mov	eax,[ebx+4]
1188
	mov	eax,[ebx+4]
1192
	xchg	eax,[edi+4]
1189
	xchg	eax,[edi+4]
1193
	mov	[ebx+4],eax
1190
	mov	[ebx+4],eax
1194
	mov	eax,[ebx+8]
1191
	mov	eax,[ebx+8]
1195
	xchg	eax,[edi+8]
1192
	xchg	eax,[edi+8]
1196
	mov	[ebx+8],eax
1193
	mov	[ebx+8],eax
1197
	mov	eax,[ebx+12]
1194
	mov	eax,[ebx+12]
1198
	xchg	eax,[edi+12]
1195
	xchg	eax,[edi+12]
1199
	mov	[ebx+12],eax
1196
	mov	[ebx+12],eax
1200
      mul_start:
1197
      mul_start:
1201
	push	esi edx
1198
	push	esi edx
1202
	mov	esi,ebx
1199
	mov	esi,ebx
1203
	xor	bl,bl
1200
	xor	bl,bl
1204
	bt	dword [esi+4],31
1201
	bt	dword [esi+4],31
1205
	jnc	mul_first_sign_ok
1202
	jnc	mul_first_sign_ok
1206
	not	dword [esi]
1203
	not	dword [esi]
1207
	not	dword [esi+4]
1204
	not	dword [esi+4]
1208
	add	dword [esi],1
1205
	add	dword [esi],1
1209
	adc	dword [esi+4],0
1206
	adc	dword [esi+4],0
1210
	not	bl
1207
	not	bl
1211
      mul_first_sign_ok:
1208
      mul_first_sign_ok:
1212
	bt	dword [edi+4],31
1209
	bt	dword [edi+4],31
1213
	jnc	mul_second_sign_ok
1210
	jnc	mul_second_sign_ok
1214
	not	dword [edi]
1211
	not	dword [edi]
1215
	not	dword [edi+4]
1212
	not	dword [edi+4]
1216
	add	dword [edi],1
1213
	add	dword [edi],1
1217
	adc	dword [edi+4],0
1214
	adc	dword [edi+4],0
1218
	not	bl
1215
	not	bl
1219
      mul_second_sign_ok:
1216
      mul_second_sign_ok:
1220
	cmp	dword [esi+4],0
1217
	cmp	dword [esi+4],0
1221
	jz	mul_numbers
1218
	jz	mul_numbers
1222
	cmp	dword [edi+4],0
1219
	cmp	dword [edi+4],0
1223
	jnz	value_out_of_range
1220
	jnz	value_out_of_range
1224
      mul_numbers:
1221
      mul_numbers:
1225
	mov	eax,[esi+4]
1222
	mov	eax,[esi+4]
1226
	mul	dword [edi]
1223
	mul	dword [edi]
1227
	or	edx,edx
1224
	or	edx,edx
1228
	jnz	value_out_of_range
1225
	jnz	value_out_of_range
1229
	mov	ecx,eax
1226
	mov	ecx,eax
1230
	mov	eax,[esi]
1227
	mov	eax,[esi]
1231
	mul	dword [edi+4]
1228
	mul	dword [edi+4]
1232
	or	edx,edx
1229
	or	edx,edx
1233
	jnz	value_out_of_range
1230
	jnz	value_out_of_range
1234
	add	ecx,eax
1231
	add	ecx,eax
1235
	jc	value_out_of_range
1232
	jc	value_out_of_range
1236
	mov	eax,[esi]
1233
	mov	eax,[esi]
1237
	mul	dword [edi]
1234
	mul	dword [edi]
1238
	add	edx,ecx
1235
	add	edx,ecx
1239
	jc	value_out_of_range
1236
	jc	value_out_of_range
1240
	test	edx,1 shl 31
1237
	test	edx,1 shl 31
1241
	jnz	value_out_of_range
1238
	jnz	value_out_of_range
1242
	mov	[esi],eax
1239
	mov	[esi],eax
1243
	mov	[esi+4],edx
1240
	mov	[esi+4],edx
1244
	or	bl,bl
1241
	or	bl,bl
1245
	jz	mul_ok
1242
	jz	mul_ok
1246
	not	dword [esi]
1243
	not	dword [esi]
1247
	not	dword [esi+4]
1244
	not	dword [esi+4]
1248
	add	dword [esi],1
1245
	add	dword [esi],1
1249
	adc	dword [esi+4],0
1246
	adc	dword [esi+4],0
1250
      mul_ok:
1247
      mul_ok:
1251
	pop	edx
1248
	pop	edx
1252
	or	dx,dx
1249
	or	dx,dx
1253
	jz	mul_calculated
1250
	jz	mul_calculated
1254
	cmp	word [edi+8],0
1251
	cmp	word [edi+8],0
1255
	jne	invalid_value
1252
	jne	invalid_value
1256
	cmp	byte [esi+8],0
1253
	cmp	byte [esi+8],0
1257
	je	mul_first_register_ok
1254
	je	mul_first_register_ok
1258
	mov	al,[edi]
1255
	mov	al,[edi]
1259
	cbw
1256
	cbw
1260
	cwde
1257
	cwde
1261
	cdq
1258
	cdq
1262
	cmp	edx,[edi+4]
1259
	cmp	edx,[edi+4]
1263
	jne	value_out_of_range
1260
	jne	value_out_of_range
1264
	cmp	eax,[edi]
1261
	cmp	eax,[edi]
1265
	jne	value_out_of_range
1262
	jne	value_out_of_range
1266
	imul	byte [esi+10]
1263
	imul	byte [esi+10]
1267
	mov	dl,ah
1264
	mov	dl,ah
1268
	cbw
1265
	cbw
1269
	cmp	ah,dl
1266
	cmp	ah,dl
1270
	jne	value_out_of_range
1267
	jne	value_out_of_range
1271
	mov	[esi+10],al
1268
	mov	[esi+10],al
1272
      mul_first_register_ok:
1269
	or	al,al
-
 
1270
	jnz	mul_first_register_ok
-
 
1271
	mov	[esi+8],al
-
 
1272
      mul_first_register_ok:
1273
	cmp	byte [esi+9],0
1273
	cmp	byte [esi+9],0
1274
	je	mul_calculated
1274
	je	mul_calculated
1275
	mov	al,[edi]
1275
	mov	al,[edi]
1276
	cbw
1276
	cbw
1277
	cwde
1277
	cwde
1278
	cdq
1278
	cdq
1279
	cmp	edx,[edi+4]
1279
	cmp	edx,[edi+4]
1280
	jne	value_out_of_range
1280
	jne	value_out_of_range
1281
	cmp	eax,[edi]
1281
	cmp	eax,[edi]
1282
	jne	value_out_of_range
1282
	jne	value_out_of_range
1283
	imul	byte [esi+11]
1283
	imul	byte [esi+11]
1284
	mov	dl,ah
1284
	mov	dl,ah
1285
	cbw
1285
	cbw
1286
	cmp	ah,dl
1286
	cmp	ah,dl
1287
	jne	value_out_of_range
1287
	jne	value_out_of_range
1288
	mov	[esi+11],al
1288
	mov	[esi+11],al
1289
      mul_calculated:
1289
	or	al,al
-
 
1290
	jnz	mul_calculated
-
 
1291
	mov	[esi+9],al
-
 
1292
      mul_calculated:
1290
	pop	esi
1293
	pop	esi
1291
	jmp	calculation_loop
1294
	jmp	calculation_loop
1292
      calculate_div:
1295
      calculate_div:
1293
	push	esi edx
1296
	push	esi edx
1294
	mov	esi,ebx
1297
	mov	esi,ebx
1295
	call	div_64
1298
	call	div_64
1296
	pop	edx
1299
	pop	edx
1297
	or	dx,dx
1300
	or	dx,dx
1298
	jz	div_calculated
1301
	jz	div_calculated
1299
	cmp	byte [esi+8],0
1302
	cmp	byte [esi+8],0
1300
	je	div_first_register_ok
1303
	je	div_first_register_ok
1301
	mov	al,[edi]
1304
	mov	al,[edi]
1302
	cbw
1305
	cbw
1303
	cwde
1306
	cwde
1304
	cdq
1307
	cdq
1305
	cmp	edx,[edi+4]
1308
	cmp	edx,[edi+4]
1306
	jne	value_out_of_range
1309
	jne	value_out_of_range
1307
	cmp	eax,[edi]
1310
	cmp	eax,[edi]
1308
	jne	value_out_of_range
1311
	jne	value_out_of_range
1309
	or	al,al
1312
	or	al,al
1310
	jz	value_out_of_range
1313
	jz	value_out_of_range
1311
	mov	al,[esi+10]
1314
	mov	al,[esi+10]
1312
	cbw
1315
	cbw
1313
	idiv	byte [edi]
1316
	idiv	byte [edi]
1314
	or	ah,ah
1317
	or	ah,ah
1315
	jnz	invalid_use_of_symbol
1318
	jnz	invalid_use_of_symbol
1316
	mov	[esi+10],al
1319
	mov	[esi+10],al
1317
      div_first_register_ok:
1320
      div_first_register_ok:
1318
	cmp	byte [esi+9],0
1321
	cmp	byte [esi+9],0
1319
	je	div_calculated
1322
	je	div_calculated
1320
	mov	al,[edi]
1323
	mov	al,[edi]
1321
	cbw
1324
	cbw
1322
	cwde
1325
	cwde
1323
	cdq
1326
	cdq
1324
	cmp	edx,[edi+4]
1327
	cmp	edx,[edi+4]
1325
	jne	value_out_of_range
1328
	jne	value_out_of_range
1326
	cmp	eax,[edi]
1329
	cmp	eax,[edi]
1327
	jne	value_out_of_range
1330
	jne	value_out_of_range
1328
	or	al,al
1331
	or	al,al
1329
	jz	value_out_of_range
1332
	jz	value_out_of_range
1330
	mov	al,[esi+11]
1333
	mov	al,[esi+11]
1331
	cbw
1334
	cbw
1332
	idiv	byte [edi]
1335
	idiv	byte [edi]
1333
	or	ah,ah
1336
	or	ah,ah
1334
	jnz	invalid_use_of_symbol
1337
	jnz	invalid_use_of_symbol
1335
	mov	[esi+11],al
1338
	mov	[esi+11],al
1336
      div_calculated:
1339
      div_calculated:
1337
	pop	esi
1340
	pop	esi
1338
	jmp	calculation_loop
1341
	jmp	calculation_loop
1339
      calculate_mod:
1342
      calculate_mod:
1340
	push	esi
1343
	push	esi
1341
	mov	esi,ebx
1344
	mov	esi,ebx
1342
	call	div_64
1345
	call	div_64
1343
	mov	[esi],eax
1346
	mov	[esi],eax
1344
	mov	[esi+4],edx
1347
	mov	[esi+4],edx
1345
	pop	esi
1348
	pop	esi
1346
	jmp	calculation_loop
1349
	jmp	calculation_loop
1347
      calculate_and:
1350
      calculate_and:
1348
	mov	eax,[edi]
1351
	mov	eax,[edi]
1349
	and	[ebx],eax
1352
	and	[ebx],eax
1350
	mov	eax,[edi+4]
1353
	mov	eax,[edi+4]
1351
	and	[ebx+4],eax
1354
	and	[ebx+4],eax
1352
	jmp	calculation_loop
1355
	jmp	calculation_loop
1353
      calculate_or:
1356
      calculate_or:
1354
	mov	eax,[edi]
1357
	mov	eax,[edi]
1355
	or	[ebx],eax
1358
	or	[ebx],eax
1356
	mov	eax,[edi+4]
1359
	mov	eax,[edi+4]
1357
	or	[ebx+4],eax
1360
	or	[ebx+4],eax
1358
	jmp	calculation_loop
1361
	jmp	calculation_loop
1359
      calculate_xor:
1362
      calculate_xor:
1360
	mov	eax,[edi]
1363
	mov	eax,[edi]
1361
	xor	[ebx],eax
1364
	xor	[ebx],eax
1362
	mov	eax,[edi+4]
1365
	mov	eax,[edi+4]
1363
	xor	[ebx+4],eax
1366
	xor	[ebx+4],eax
1364
	jmp	calculation_loop
1367
	jmp	calculation_loop
1365
      shr_negative:
1368
      shr_negative:
1366
	not	dword [edi]
1369
	not	dword [edi]
1367
	not	dword [edi+4]
1370
	not	dword [edi+4]
1368
	add	dword [edi],1
1371
	add	dword [edi],1
1369
	adc	dword [edi+4],0
1372
	adc	dword [edi+4],0
1370
      calculate_shl:
1373
      calculate_shl:
1371
	mov	eax,dword [edi+4]
1374
	mov	eax,dword [edi+4]
1372
	bt	eax,31
1375
	bt	eax,31
1373
	jc	shl_negative
1376
	jc	shl_negative
1374
	or	eax,eax
1377
	or	eax,eax
1375
	jnz	zero_value
1378
	jnz	zero_value
1376
	mov	ecx,[edi]
1379
	mov	ecx,[edi]
1377
	cmp	ecx,64
1380
	cmp	ecx,64
1378
	jae	zero_value
1381
	jae	zero_value
1379
	cmp	ecx,32
1382
	cmp	ecx,32
1380
	jae	shl_high
1383
	jae	shl_high
1381
	mov	edx,[ebx+4]
1384
	mov	edx,[ebx+4]
1382
	mov	eax,[ebx]
1385
	mov	eax,[ebx]
1383
	shld	edx,eax,cl
1386
	shld	edx,eax,cl
1384
	shl	eax,cl
1387
	shl	eax,cl
1385
	mov	[ebx],eax
1388
	mov	[ebx],eax
1386
	mov	[ebx+4],edx
1389
	mov	[ebx+4],edx
1387
	jmp	calculation_loop
1390
	jmp	calculation_loop
1388
      shl_high:
1391
      shl_high:
1389
	sub	cl,32
1392
	sub	cl,32
1390
	mov	eax,[ebx]
1393
	mov	eax,[ebx]
1391
	shl	eax,cl
1394
	shl	eax,cl
1392
	mov	[ebx+4],eax
1395
	mov	[ebx+4],eax
1393
	mov	dword [ebx],0
1396
	mov	dword [ebx],0
1394
	jmp	calculation_loop
1397
	jmp	calculation_loop
1395
      shl_negative:
1398
      shl_negative:
1396
	not	dword [edi]
1399
	not	dword [edi]
1397
	not	dword [edi+4]
1400
	not	dword [edi+4]
1398
	add	dword [edi],1
1401
	add	dword [edi],1
1399
	adc	dword [edi+4],0
1402
	adc	dword [edi+4],0
1400
      calculate_shr:
1403
      calculate_shr:
1401
	mov	eax,dword [edi+4]
1404
	mov	eax,dword [edi+4]
1402
	bt	eax,31
1405
	bt	eax,31
1403
	jc	shr_negative
1406
	jc	shr_negative
1404
	or	eax,eax
1407
	or	eax,eax
1405
	jnz	zero_value
1408
	jnz	zero_value
1406
	mov	ecx,[edi]
1409
	mov	ecx,[edi]
1407
	cmp	ecx,64
1410
	cmp	ecx,64
1408
	jae	zero_value
1411
	jae	zero_value
1409
	cmp	ecx,32
1412
	cmp	ecx,32
1410
	jae	shr_high
1413
	jae	shr_high
1411
	mov	edx,[ebx+4]
1414
	mov	edx,[ebx+4]
1412
	mov	eax,[ebx]
1415
	mov	eax,[ebx]
1413
	shrd	eax,edx,cl
1416
	shrd	eax,edx,cl
1414
	shr	edx,cl
1417
	shr	edx,cl
1415
	mov	[ebx],eax
1418
	mov	[ebx],eax
1416
	mov	[ebx+4],edx
1419
	mov	[ebx+4],edx
1417
	jmp	calculation_loop
1420
	jmp	calculation_loop
1418
      shr_high:
1421
      shr_high:
1419
	sub	cl,32
1422
	sub	cl,32
1420
	mov	eax,[ebx+4]
1423
	mov	eax,[ebx+4]
1421
	shr	eax,cl
1424
	shr	eax,cl
1422
	mov	[ebx],eax
1425
	mov	[ebx],eax
1423
	mov	dword [ebx+4],0
1426
	mov	dword [ebx+4],0
1424
	jmp	calculation_loop
1427
	jmp	calculation_loop
1425
      zero_value:
1428
      zero_value:
1426
	mov	dword [ebx],0
1429
	mov	dword [ebx],0
1427
	mov	dword [ebx+4],0
1430
	mov	dword [ebx+4],0
1428
	jmp	calculation_loop
1431
	jmp	calculation_loop
1429
      calculate_not:
1432
      calculate_not:
1430
	cmp	word [edi+8],0
1433
	cmp	word [edi+8],0
1431
	jne	invalid_expression
1434
	jne	invalid_expression
1432
	cmp	byte [edi+12],0
1435
	cmp	byte [edi+12],0
1433
	je	not_ok
1436
	je	not_ok
1434
	cmp	[error_line],0
1437
	cmp	[error_line],0
1435
	jne	not_ok
1438
	jne	not_ok
1436
	mov	eax,[current_line]
1439
	mov	eax,[current_line]
1437
	mov	[error_line],eax
1440
	mov	[error_line],eax
1438
	mov	[error],invalid_use_of_symbol
1441
	mov	[error],invalid_use_of_symbol
1439
      not_ok:
1442
      not_ok:
1440
	cmp	[value_size],1
1443
	cmp	[value_size],1
1441
	je	not_byte
1444
	je	not_byte
1442
	cmp	[value_size],2
1445
	cmp	[value_size],2
1443
	je	not_word
1446
	je	not_word
1444
	cmp	[value_size],4
1447
	cmp	[value_size],4
1445
	je	not_dword
1448
	je	not_dword
1446
	cmp	[value_size],6
1449
	cmp	[value_size],6
1447
	je	not_pword
1450
	je	not_pword
1448
      not_qword:
1451
      not_qword:
1449
	not	dword [edi]
1452
	not	dword [edi]
1450
	not	dword [edi+4]
1453
	not	dword [edi+4]
1451
	add	edi,14h
1454
	add	edi,14h
1452
	jmp	calculation_loop
1455
	jmp	calculation_loop
1453
      not_byte:
1456
      not_byte:
1454
	cmp	dword [edi+4],0
1457
	cmp	dword [edi+4],0
1455
	jne	not_qword
1458
	jne	not_qword
1456
	cmp	word [edi+2],0
1459
	cmp	word [edi+2],0
1457
	jne	not_qword
1460
	jne	not_qword
1458
	cmp	byte [edi+1],0
1461
	cmp	byte [edi+1],0
1459
	jne	not_qword
1462
	jne	not_qword
1460
	not	byte [edi]
1463
	not	byte [edi]
1461
	add	edi,14h
1464
	add	edi,14h
1462
	jmp	calculation_loop
1465
	jmp	calculation_loop
1463
      not_word:
1466
      not_word:
1464
	cmp	dword [edi+4],0
1467
	cmp	dword [edi+4],0
1465
	jne	not_qword
1468
	jne	not_qword
1466
	cmp	word [edi+2],0
1469
	cmp	word [edi+2],0
1467
	jne	not_qword
1470
	jne	not_qword
1468
	not	word [edi]
1471
	not	word [edi]
1469
	add	edi,14h
1472
	add	edi,14h
1470
	jmp	calculation_loop
1473
	jmp	calculation_loop
1471
      not_dword:
1474
      not_dword:
1472
	cmp	dword [edi+4],0
1475
	cmp	dword [edi+4],0
1473
	jne	not_qword
1476
	jne	not_qword
1474
	not	dword [edi]
1477
	not	dword [edi]
1475
	add	edi,14h
1478
	add	edi,14h
1476
	jmp	calculation_loop
1479
	jmp	calculation_loop
1477
      not_pword:
1480
      not_pword:
1478
	cmp	word [edi+6],0
1481
	cmp	word [edi+6],0
1479
	jne	not_qword
1482
	jne	not_qword
1480
	not	dword [edi]
1483
	not	dword [edi]
1481
	not	word [edi+4]
1484
	not	word [edi+4]
1482
	add	edi,14h
1485
	add	edi,14h
1483
	jmp	calculation_loop
1486
	jmp	calculation_loop
1484
      calculate_neg:
1487
      calculate_neg:
1485
	cmp	word [edi+8],0
1488
	cmp	word [edi+8],0
1486
	jne	invalid_expression
1489
	jne	invalid_expression
1487
	cmp	byte [edi+12],0
1490
	cmp	byte [edi+12],0
1488
	je	neg_ok
1491
	je	neg_ok
1489
	cmp	[error_line],0
1492
	cmp	[error_line],0
1490
	jne	neg_ok
1493
	jne	neg_ok
1491
	mov	eax,[current_line]
1494
	mov	eax,[current_line]
1492
	mov	[error_line],eax
1495
	mov	[error_line],eax
1493
	mov	[error],invalid_use_of_symbol
1496
	mov	[error],invalid_use_of_symbol
1494
      neg_ok:
1497
      neg_ok:
1495
	mov	eax,[edi]
1498
	mov	eax,[edi]
1496
	mov	edx,[edi+4]
1499
	mov	edx,[edi+4]
1497
	mov	dword [edi],0
1500
	mov	dword [edi],0
1498
	mov	dword [edi+4],0
1501
	mov	dword [edi+4],0
1499
	sub	[edi],eax
1502
	sub	[edi],eax
1500
	sbb	[edi+4],edx
1503
	sbb	[edi+4],edx
1501
	add	edi,14h
1504
	add	edi,14h
1502
	jmp	calculation_loop
1505
	jmp	calculation_loop
1503
      calculate_rva:
1506
      calculate_rva:
1504
	cmp	word [edi+8],0
1507
	cmp	word [edi+8],0
1505
	jne	invalid_expression
1508
	jne	invalid_expression
1506
	cmp	[output_format],5
1509
	cmp	[output_format],5
1507
	je	calculate_gotoff
1510
	je	calculate_gotoff
1508
	cmp	[output_format],3
1511
	cmp	[output_format],3
1509
	jne	invalid_expression
1512
	jne	invalid_expression
1510
	test	[format_flags],8
1513
	test	[format_flags],8
1511
	jnz	pe64_rva
1514
	jnz	pe64_rva
1512
	mov	al,2
1515
	mov	al,2
1513
	bt	[resolver_flags],0
1516
	bt	[resolver_flags],0
1514
	jc	rva_type_ok
1517
	jc	rva_type_ok
1515
	xor	al,al
1518
	xor	al,al
1516
      rva_type_ok:
1519
      rva_type_ok:
1517
	cmp	byte [edi+12],al
1520
	cmp	byte [edi+12],al
1518
	je	rva_ok
1521
	je	rva_ok
1519
	cmp	[error_line],0
1522
	cmp	[error_line],0
1520
	jne	rva_ok
1523
	jne	rva_ok
1521
	mov	eax,[current_line]
1524
	mov	eax,[current_line]
1522
	mov	[error_line],eax
1525
	mov	[error_line],eax
1523
	mov	[error],invalid_use_of_symbol
1526
	mov	[error],invalid_use_of_symbol
1524
      rva_ok:
1527
      rva_ok:
1525
	mov	byte [edi+12],0
1528
	mov	byte [edi+12],0
1526
	mov	eax,[code_start]
1529
	mov	eax,[code_start]
1527
	mov	eax,[eax+34h]
1530
	mov	eax,[eax+34h]
1528
	cdq
1531
	cdq
1529
	sub	[edi],eax
1532
	sub	[edi],eax
1530
	sbb	[edi+4],edx
1533
	sbb	[edi+4],edx
1531
	add	edi,14h
1534
	add	edi,14h
1532
	jmp	calculation_loop
1535
	jmp	calculation_loop
1533
      pe64_rva:
1536
      pe64_rva:
1534
	mov	al,4
1537
	mov	al,4
1535
	bt	[resolver_flags],0
1538
	bt	[resolver_flags],0
1536
	jc	pe64_rva_type_ok
1539
	jc	pe64_rva_type_ok
1537
	xor	al,al
1540
	xor	al,al
1538
      pe64_rva_type_ok:
1541
      pe64_rva_type_ok:
1539
	cmp	byte [edi+12],al
1542
	cmp	byte [edi+12],al
1540
	je	pe64_rva_ok
1543
	je	pe64_rva_ok
1541
	cmp	[error_line],0
1544
	cmp	[error_line],0
1542
	jne	pe64_rva_ok
1545
	jne	pe64_rva_ok
1543
	mov	eax,[current_line]
1546
	mov	eax,[current_line]
1544
	mov	[error_line],eax
1547
	mov	[error_line],eax
1545
	mov	[error],invalid_use_of_symbol
1548
	mov	[error],invalid_use_of_symbol
1546
      pe64_rva_ok:
1549
      pe64_rva_ok:
1547
	mov	byte [edi+12],0
1550
	mov	byte [edi+12],0
1548
	mov	eax,[code_start]
1551
	mov	eax,[code_start]
1549
	mov	edx,[eax+34h]
1552
	mov	edx,[eax+34h]
1550
	mov	eax,[eax+30h]
1553
	mov	eax,[eax+30h]
1551
	sub	[edi],eax
1554
	sub	[edi],eax
1552
	sbb	[edi+4],edx
1555
	sbb	[edi+4],edx
1553
	add	edi,14h
1556
	add	edi,14h
1554
	jmp	calculation_loop
1557
	jmp	calculation_loop
1555
      calculate_gotoff:
1558
      calculate_gotoff:
1556
	test	[format_flags],8+1
1559
	test	[format_flags],8+1
1557
	jnz	invalid_expression
1560
	jnz	invalid_expression
1558
	mov	dl,5
1561
	mov	dl,5
1559
	cmp	byte [edi+12],2
1562
	cmp	byte [edi+12],2
1560
	je	change_value_type
1563
	je	change_value_type
1561
      incorrect_change_of_value_type:
1564
      incorrect_change_of_value_type:
1562
	cmp	[error_line],0
1565
	cmp	[error_line],0
1563
	jne	change_value_type
1566
	jne	change_value_type
1564
	mov	eax,[current_line]
1567
	mov	eax,[current_line]
1565
	mov	[error_line],eax
1568
	mov	[error_line],eax
1566
	mov	[error],invalid_use_of_symbol
1569
	mov	[error],invalid_use_of_symbol
1567
      change_value_type:
1570
      change_value_type:
1568
	mov	byte [edi+12],dl
1571
	mov	byte [edi+12],dl
1569
	add	edi,14h
1572
	add	edi,14h
1570
	jmp	calculation_loop
1573
	jmp	calculation_loop
1571
      calculate_plt:
1574
      calculate_plt:
1572
	cmp	word [edi+8],0
1575
	cmp	word [edi+8],0
1573
	jne	invalid_expression
1576
	jne	invalid_expression
1574
	cmp	[output_format],5
1577
	cmp	[output_format],5
1575
	jne	invalid_expression
1578
	jne	invalid_expression
1576
	test	[format_flags],1
1579
	test	[format_flags],1
1577
	jnz	invalid_expression
1580
	jnz	invalid_expression
1578
	mov	dl,6
1581
	mov	dl,6
1579
	mov	dh,2
1582
	mov	dh,2
1580
	test	[format_flags],8
1583
	test	[format_flags],8
1581
	jz	check_value_for_plt
1584
	jz	check_value_for_plt
1582
	mov	dh,4
1585
	mov	dh,4
1583
      check_value_for_plt:
1586
      check_value_for_plt:
1584
	mov	eax,[edi]
1587
	mov	eax,[edi]
1585
	or	eax,[edi+4]
1588
	or	eax,[edi+4]
1586
	jnz	incorrect_change_of_value_type
1589
	jnz	incorrect_change_of_value_type
1587
	cmp	byte [edi+12],dh
1590
	cmp	byte [edi+12],dh
1588
	jne	incorrect_change_of_value_type
1591
	jne	incorrect_change_of_value_type
1589
	mov	eax,[edi+16]
1592
	mov	eax,[edi+16]
1590
	cmp	byte [eax],81h
1593
	cmp	byte [eax],81h
1591
	jne	incorrect_change_of_value_type
1594
	jne	incorrect_change_of_value_type
1592
	jmp	change_value_type
1595
	jmp	change_value_type
1593
      div_64:
1596
      div_64:
1594
	xor	ebx,ebx
1597
	xor	ebx,ebx
1595
	cmp	dword [edi],0
1598
	cmp	dword [edi],0
1596
	jne	divider_ok
1599
	jne	divider_ok
1597
	cmp	dword [edi+4],0
1600
	cmp	dword [edi+4],0
1598
	jne	divider_ok
1601
	jne	divider_ok
1599
	cmp	[next_pass_needed],0
1602
	cmp	[next_pass_needed],0
1600
	je	value_out_of_range
1603
	je	value_out_of_range
1601
	jmp	div_done
1604
	jmp	div_done
1602
      divider_ok:
1605
      divider_ok:
1603
	bt	dword [esi+4],31
1606
	bt	dword [esi+4],31
1604
	jnc	div_first_sign_ok
1607
	jnc	div_first_sign_ok
1605
	not	dword [esi]
1608
	not	dword [esi]
1606
	not	dword [esi+4]
1609
	not	dword [esi+4]
1607
	add	dword [esi],1
1610
	add	dword [esi],1
1608
	adc	dword [esi+4],0
1611
	adc	dword [esi+4],0
1609
	not	bx
1612
	not	bx
1610
      div_first_sign_ok:
1613
      div_first_sign_ok:
1611
	bt	dword [edi+4],31
1614
	bt	dword [edi+4],31
1612
	jnc	div_second_sign_ok
1615
	jnc	div_second_sign_ok
1613
	not	dword [edi]
1616
	not	dword [edi]
1614
	not	dword [edi+4]
1617
	not	dword [edi+4]
1615
	add	dword [edi],1
1618
	add	dword [edi],1
1616
	adc	dword [edi+4],0
1619
	adc	dword [edi+4],0
1617
	not	bl
1620
	not	bl
1618
      div_second_sign_ok:
1621
      div_second_sign_ok:
1619
	cmp	dword [edi+4],0
1622
	cmp	dword [edi+4],0
1620
	jne	div_high
1623
	jne	div_high
1621
	mov	ecx,[edi]
1624
	mov	ecx,[edi]
1622
	mov	eax,[esi+4]
1625
	mov	eax,[esi+4]
1623
	xor	edx,edx
1626
	xor	edx,edx
1624
	div	ecx
1627
	div	ecx
1625
	mov	[esi+4],eax
1628
	mov	[esi+4],eax
1626
	mov	eax,[esi]
1629
	mov	eax,[esi]
1627
	div	ecx
1630
	div	ecx
1628
	mov	[esi],eax
1631
	mov	[esi],eax
1629
	mov	eax,edx
1632
	mov	eax,edx
1630
	xor	edx,edx
1633
	xor	edx,edx
1631
	jmp	div_done
1634
	jmp	div_done
1632
      div_high:
1635
      div_high:
1633
	mov	eax,[esi+4]
1636
	mov	eax,[esi+4]
1634
	xor	edx,edx
1637
	xor	edx,edx
1635
	div	dword [edi+4]
1638
	div	dword [edi+4]
1636
	mov	ebx,[esi]
1639
	mov	ebx,[esi]
1637
	mov	[esi],eax
1640
	mov	[esi],eax
1638
	mov	dword [esi+4],0
1641
	mov	dword [esi+4],0
1639
	mov	ecx,edx
1642
	mov	ecx,edx
1640
	mul	dword [edi]
1643
	mul	dword [edi]
1641
      div_high_loop:
1644
      div_high_loop:
1642
	cmp	ecx,edx
1645
	cmp	ecx,edx
1643
	ja	div_high_done
1646
	ja	div_high_done
1644
	jb	div_high_large_correction
1647
	jb	div_high_large_correction
1645
	cmp	ebx,eax
1648
	cmp	ebx,eax
1646
	jae	div_high_done
1649
	jae	div_high_done
1647
      div_high_correction:
1650
      div_high_correction:
1648
	dec	dword [esi]
1651
	dec	dword [esi]
1649
	sub	eax,[edi]
1652
	sub	eax,[edi]
1650
	sbb	edx,[edi+4]
1653
	sbb	edx,[edi+4]
1651
	jnc	div_high_loop
1654
	jnc	div_high_loop
1652
      div_high_done:
1655
      div_high_done:
1653
	sub	ebx,eax
1656
	sub	ebx,eax
1654
	sbb	ecx,edx
1657
	sbb	ecx,edx
1655
	mov	edx,ecx
1658
	mov	edx,ecx
1656
	mov	eax,ebx
1659
	mov	eax,ebx
1657
	ret
1660
	ret
1658
      div_high_large_correction:
1661
      div_high_large_correction:
1659
	push	eax edx
1662
	push	eax edx
1660
	mov	eax,edx
1663
	mov	eax,edx
1661
	sub	eax,ecx
1664
	sub	eax,ecx
1662
	xor	edx,edx
1665
	xor	edx,edx
1663
	div	dword [edi+4]
1666
	div	dword [edi+4]
1664
	shr	eax,1
1667
	shr	eax,1
1665
	jz	div_high_small_correction
1668
	jz	div_high_small_correction
1666
	sub	[esi],eax
1669
	sub	[esi],eax
1667
	push	eax
1670
	push	eax
1668
	mul	dword [edi+4]
1671
	mul	dword [edi+4]
1669
	sub	dword [esp+4],eax
1672
	sub	dword [esp+4],eax
1670
	pop	eax
1673
	pop	eax
1671
	mul	dword [edi]
1674
	mul	dword [edi]
1672
	sub	dword [esp+4],eax
1675
	sub	dword [esp+4],eax
1673
	sbb	dword [esp],edx
1676
	sbb	dword [esp],edx
1674
	pop	edx eax
1677
	pop	edx eax
1675
	jmp	div_high_loop
1678
	jmp	div_high_loop
1676
      div_high_small_correction:
1679
      div_high_small_correction:
1677
	pop	edx eax
1680
	pop	edx eax
1678
	jmp	div_high_correction
1681
	jmp	div_high_correction
1679
      div_done:
1682
      div_done:
1680
	or	bh,bh
1683
	or	bh,bh
1681
	jz	remainder_ok
1684
	jz	remainder_ok
1682
	not	eax
1685
	not	eax
1683
	not	edx
1686
	not	edx
1684
	add	eax,1
1687
	add	eax,1
1685
	adc	edx,0
1688
	adc	edx,0
1686
      remainder_ok:
1689
      remainder_ok:
1687
	or	bl,bl
1690
	or	bl,bl
1688
	jz	div_ok
1691
	jz	div_ok
1689
	not	dword [esi]
1692
	not	dword [esi]
1690
	not	dword [esi+4]
1693
	not	dword [esi+4]
1691
	add	dword [esi],1
1694
	add	dword [esi],1
1692
	adc	dword [esi+4],0
1695
	adc	dword [esi+4],0
1693
      div_ok:
1696
      div_ok:
1694
	ret
1697
	ret
1695
      convert_fp:
1698
      convert_fp:
1696
	inc	esi
1699
	inc	esi
1697
	mov	word [edi+8],0
1700
	mov	word [edi+8],0
1698
	mov	byte [edi+12],0
1701
	mov	byte [edi+12],0
1699
	mov	al,[value_size]
1702
	mov	al,[value_size]
1700
	cmp	al,4
1703
	cmp	al,4
1701
	je	convert_fp_dword
1704
	je	convert_fp_dword
1702
	cmp	al,8
1705
	cmp	al,8
1703
	je	convert_fp_qword
1706
	je	convert_fp_qword
1704
	jmp	invalid_value
1707
	jmp	invalid_value
1705
      convert_fp_dword:
1708
      convert_fp_dword:
1706
	xor	eax,eax
1709
	xor	eax,eax
1707
	cmp	word [esi+8],8000h
1710
	cmp	word [esi+8],8000h
1708
	je	fp_dword_store
1711
	je	fp_dword_store
1709
	mov	bx,[esi+8]
1712
	mov	bx,[esi+8]
1710
	mov	eax,[esi+4]
1713
	mov	eax,[esi+4]
1711
	shl	eax,1
1714
	shl	eax,1
1712
	shr	eax,9
1715
	shr	eax,9
1713
	jnc	fp_dword_ok
1716
	jnc	fp_dword_ok
1714
	inc	eax
1717
	inc	eax
1715
	bt	eax,23
1718
	bt	eax,23
1716
	jnc	fp_dword_ok
1719
	jnc	fp_dword_ok
1717
	and	eax,1 shl 23 - 1
1720
	and	eax,1 shl 23 - 1
1718
	inc	bx
1721
	inc	bx
1719
	shr	eax,1
1722
	shr	eax,1
1720
      fp_dword_ok:
1723
      fp_dword_ok:
1721
	add	bx,7Fh
1724
	add	bx,7Fh
1722
	cmp	bx,100h
1725
	cmp	bx,100h
1723
	jae	value_out_of_range
1726
	jae	value_out_of_range
1724
	shl	ebx,23
1727
	shl	ebx,23
1725
	or	eax,ebx
1728
	or	eax,ebx
1726
      fp_dword_store:
1729
      fp_dword_store:
1727
	mov	bl,[esi+11]
1730
	mov	bl,[esi+11]
1728
	shl	ebx,31
1731
	shl	ebx,31
1729
	or	eax,ebx
1732
	or	eax,ebx
1730
	mov	[edi],eax
1733
	mov	[edi],eax
1731
	xor	eax,eax
1734
	xor	eax,eax
1732
	mov	[edi+4],eax
1735
	mov	[edi+4],eax
1733
	add	esi,13
1736
	add	esi,13
1734
	ret
1737
	ret
1735
      convert_fp_qword:
1738
      convert_fp_qword:
1736
	xor	eax,eax
1739
	xor	eax,eax
1737
	xor	edx,edx
1740
	xor	edx,edx
1738
	cmp	word [esi+8],8000h
1741
	cmp	word [esi+8],8000h
1739
	je	fp_qword_store
1742
	je	fp_qword_store
1740
	mov	bx,[esi+8]
1743
	mov	bx,[esi+8]
1741
	mov	eax,[esi]
1744
	mov	eax,[esi]
1742
	mov	edx,[esi+4]
1745
	mov	edx,[esi+4]
1743
	add	eax,eax
1746
	add	eax,eax
1744
	adc	edx,edx
1747
	adc	edx,edx
1745
	mov	ecx,edx
1748
	mov	ecx,edx
1746
	shr	edx,12
1749
	shr	edx,12
1747
	shrd	eax,ecx,12
1750
	shrd	eax,ecx,12
1748
	jnc	fp_qword_ok
1751
	jnc	fp_qword_ok
1749
	add	eax,1
1752
	add	eax,1
1750
	adc	edx,0
1753
	adc	edx,0
1751
	bt	edx,20
1754
	bt	edx,20
1752
	jnc	fp_qword_ok
1755
	jnc	fp_qword_ok
1753
	and	edx,1 shl 20 - 1
1756
	and	edx,1 shl 20 - 1
1754
	inc	bx
1757
	inc	bx
1755
	shr	edx,1
1758
	shr	edx,1
1756
	rcr	eax,1
1759
	rcr	eax,1
1757
      fp_qword_ok:
1760
      fp_qword_ok:
1758
	add	bx,3FFh
1761
	add	bx,3FFh
1759
	cmp	bx,800h
1762
	cmp	bx,800h
1760
	jae	value_out_of_range
1763
	jae	value_out_of_range
1761
	shl	ebx,20
1764
	shl	ebx,20
1762
	or	edx,ebx
1765
	or	edx,ebx
1763
      fp_qword_store:
1766
      fp_qword_store:
1764
	mov	bl,[esi+11]
1767
	mov	bl,[esi+11]
1765
	shl	ebx,31
1768
	shl	ebx,31
1766
	or	edx,ebx
1769
	or	edx,ebx
1767
	mov	[edi],eax
1770
	mov	[edi],eax
1768
	mov	[edi+4],edx
1771
	mov	[edi+4],edx
1769
	add	esi,13
1772
	add	esi,13
1770
	ret
1773
	ret
1771
      get_string_value:
1774
      get_string_value:
1772
	inc	esi
1775
	inc	esi
1773
	lods	dword [esi]
1776
	lods	dword [esi]
1774
	mov	ecx,eax
1777
	mov	ecx,eax
1775
	cmp	ecx,8
1778
	cmp	ecx,8
1776
	ja	value_out_of_range
1779
	ja	value_out_of_range
1777
	mov	edx,edi
1780
	mov	edx,edi
1778
	xor	eax,eax
1781
	xor	eax,eax
1779
	stos	dword [edi]
1782
	stos	dword [edi]
1780
	stos	dword [edi]
1783
	stos	dword [edi]
1781
	mov	edi,edx
1784
	mov	edi,edx
1782
	rep	movs byte [edi],[esi]
1785
	rep	movs byte [edi],[esi]
1783
	mov	edi,edx
1786
	mov	edi,edx
1784
	inc	esi
1787
	inc	esi
1785
	mov	word [edi+8],0
1788
	mov	word [edi+8],0
1786
	mov	byte [edi+12],0
1789
	mov	byte [edi+12],0
1787
	ret
1790
	ret
1788
 
1791
 
1789
get_byte_value:
1792
get_byte_value:
1790
	mov	[value_size],1
1793
	mov	[value_size],1
1791
	mov	[size_override],-1
1794
	mov	[size_override],-1
1792
	call	calculate_expression
1795
	call	calculate_expression
1793
	mov	eax,[edi+16]
1796
	mov	eax,[edi+16]
1794
	mov	[symbol_identifier],eax
1797
	mov	[symbol_identifier],eax
1795
	mov	[value_type],0
1798
	mov	[value_type],0
1796
	cmp	word [edi+8],0
1799
	cmp	word [edi+8],0
1797
	jne	invalid_value
1800
	jne	invalid_value
1798
	cmp	byte [edi+12],0
1801
	cmp	byte [edi+12],0
1799
	je	check_byte_value
1802
	je	check_byte_value
1800
	cmp	[error_line],0
1803
	cmp	[error_line],0
1801
	jne	check_byte_value
1804
	jne	check_byte_value
1802
	mov	eax,[current_line]
1805
	mov	eax,[current_line]
1803
	mov	[error_line],eax
1806
	mov	[error_line],eax
1804
	mov	[error],invalid_use_of_symbol
1807
	mov	[error],invalid_use_of_symbol
1805
      check_byte_value:
1808
      check_byte_value:
1806
	mov	eax,[edi]
1809
	mov	eax,[edi]
1807
	mov	edx,[edi+4]
1810
	mov	edx,[edi+4]
1808
	or	edx,edx
1811
	or	edx,edx
1809
	jz	byte_positive
1812
	jz	byte_positive
1810
	cmp	edx,-1
1813
	cmp	edx,-1
1811
	jne	range_exceeded
1814
	jne	range_exceeded
1812
	cmp	eax,-80h
1815
	cmp	eax,-80h
1813
	jb	range_exceeded
1816
	jb	range_exceeded
1814
	ret
1817
	ret
1815
      byte_positive:
1818
      byte_positive:
1816
	cmp	eax,100h
1819
	cmp	eax,100h
1817
	jae	range_exceeded
1820
	jae	range_exceeded
1818
      return_byte_value:
1821
      return_byte_value:
1819
	ret
1822
	ret
1820
      range_exceeded:
1823
      range_exceeded:
1821
	xor	eax,eax
1824
	xor	eax,eax
1822
	xor	edx,edx
1825
	xor	edx,edx
1823
	cmp	[error_line],0
1826
	cmp	[error_line],0
1824
	jne	return_byte_value
1827
	jne	return_byte_value
1825
	mov	ecx,[current_line]
1828
	mov	ecx,[current_line]
1826
	mov	[error_line],ecx
1829
	mov	[error_line],ecx
1827
	mov	[error],value_out_of_range
1830
	mov	[error],value_out_of_range
1828
	ret
1831
	ret
1829
get_word_value:
1832
get_word_value:
1830
	mov	[value_size],2
1833
	mov	[value_size],2
1831
	mov	[size_override],-1
1834
	mov	[size_override],-1
1832
	call	calculate_expression
1835
	call	calculate_expression
1833
	cmp	word [edi+8],0
1836
	cmp	word [edi+8],0
1834
	jne	invalid_value
1837
	jne	invalid_value
1835
	mov	eax,[edi+16]
1838
	mov	eax,[edi+16]
1836
	mov	[symbol_identifier],eax
1839
	mov	[symbol_identifier],eax
1837
	mov	al,[edi+12]
1840
	mov	al,[edi+12]
1838
	mov	[value_type],al
1841
	mov	[value_type],al
1839
	cmp	al,2
1842
	cmp	al,2
1840
	jb	check_word_value
1843
	jb	check_word_value
1841
	cmp	[error_line],0
1844
	cmp	[error_line],0
1842
	jne	check_word_value
1845
	jne	check_word_value
1843
	mov	eax,[current_line]
1846
	mov	eax,[current_line]
1844
	mov	[error_line],eax
1847
	mov	[error_line],eax
1845
	mov	[error],invalid_use_of_symbol
1848
	mov	[error],invalid_use_of_symbol
1846
      check_word_value:
1849
      check_word_value:
1847
	mov	eax,[edi]
1850
	mov	eax,[edi]
1848
	mov	edx,[edi+4]
1851
	mov	edx,[edi+4]
1849
	or	edx,edx
1852
	or	edx,edx
1850
	jz	word_positive
1853
	jz	word_positive
1851
	cmp	edx,-1
1854
	cmp	edx,-1
1852
	jne	range_exceeded
1855
	jne	range_exceeded
1853
	cmp	eax,-8000h
1856
	cmp	eax,-8000h
1854
	jb	range_exceeded
1857
	jb	range_exceeded
1855
	ret
1858
	ret
1856
      word_positive:
1859
      word_positive:
1857
	cmp	eax,10000h
1860
	cmp	eax,10000h
1858
	jae	range_exceeded
1861
	jae	range_exceeded
1859
	ret
1862
	ret
1860
get_dword_value:
1863
get_dword_value:
1861
	mov	[value_size],4
1864
	mov	[value_size],4
1862
	mov	[size_override],-1
1865
	mov	[size_override],-1
1863
	call	calculate_expression
1866
	call	calculate_expression
1864
	cmp	word [edi+8],0
1867
	cmp	word [edi+8],0
1865
	jne	invalid_value
1868
	jne	invalid_value
1866
	mov	eax,[edi+16]
1869
	mov	eax,[edi+16]
1867
	mov	[symbol_identifier],eax
1870
	mov	[symbol_identifier],eax
1868
	mov	al,[edi+12]
1871
	mov	al,[edi+12]
1869
	mov	[value_type],al
1872
	mov	[value_type],al
1870
	cmp	al,4
1873
	cmp	al,4
1871
	jne	check_dword_value
1874
	jne	check_dword_value
1872
	mov	[value_type],2
1875
	mov	[value_type],2
1873
	mov	eax,[edi]
1876
	mov	eax,[edi]
1874
	cdq
1877
	cdq
1875
	cmp	edx,[edi+4]
1878
	cmp	edx,[edi+4]
1876
	jne	range_exceeded
1879
	jne	range_exceeded
1877
	ret
1880
	ret
1878
      check_dword_value:
1881
      check_dword_value:
1879
	mov	eax,[edi]
1882
	mov	eax,[edi]
1880
	mov	edx,[edi+4]
1883
	mov	edx,[edi+4]
1881
	or	edx,edx
1884
	or	edx,edx
1882
	jz	dword_positive
1885
	jz	dword_positive
1883
	cmp	edx,-1
1886
	cmp	edx,-1
1884
	jne	range_exceeded
1887
	jne	range_exceeded
1885
	bt	eax,31
1888
	bt	eax,31
1886
	jnc	range_exceeded
1889
	jnc	range_exceeded
1887
      dword_positive:
1890
      dword_positive:
1888
	ret
1891
	ret
1889
get_pword_value:
1892
get_pword_value:
1890
	mov	[value_size],6
1893
	mov	[value_size],6
1891
	mov	[size_override],-1
1894
	mov	[size_override],-1
1892
	call	calculate_expression
1895
	call	calculate_expression
1893
	mov	eax,[edi+16]
1896
	mov	eax,[edi+16]
1894
	mov	[symbol_identifier],eax
1897
	mov	[symbol_identifier],eax
1895
	cmp	word [edi+8],0
1898
	cmp	word [edi+8],0
1896
	jne	invalid_value
1899
	jne	invalid_value
1897
	mov	al,[edi+12]
1900
	mov	al,[edi+12]
1898
	mov	[value_type],al
1901
	mov	[value_type],al
1899
	cmp	al,4
1902
	cmp	al,4
1900
	jne	check_pword_value
1903
	jne	check_pword_value
1901
	cmp	[error_line],0
1904
	cmp	[error_line],0
1902
	jne	check_pword_value
1905
	jne	check_pword_value
1903
	mov	eax,[current_line]
1906
	mov	eax,[current_line]
1904
	mov	[error_line],eax
1907
	mov	[error_line],eax
1905
	mov	[error],invalid_use_of_symbol
1908
	mov	[error],invalid_use_of_symbol
1906
      check_pword_value:
1909
      check_pword_value:
1907
	mov	eax,[edi]
1910
	mov	eax,[edi]
1908
	mov	edx,[edi+4]
1911
	mov	edx,[edi+4]
1909
	cmp	edx,10000h
1912
	cmp	edx,10000h
1910
	jge	range_exceeded
1913
	jge	range_exceeded
1911
	cmp	edx,-8000h
1914
	cmp	edx,-8000h
1912
	jl	range_exceeded
1915
	jl	range_exceeded
1913
	ret
1916
	ret
1914
get_qword_value:
1917
get_qword_value:
1915
	mov	[value_size],8
1918
	mov	[value_size],8
1916
	mov	[size_override],-1
1919
	mov	[size_override],-1
1917
	call	calculate_expression
1920
	call	calculate_expression
1918
	cmp	word [edi+8],0
1921
	cmp	word [edi+8],0
1919
	jne	invalid_value
1922
	jne	invalid_value
1920
	mov	eax,[edi+16]
1923
	mov	eax,[edi+16]
1921
	mov	[symbol_identifier],eax
1924
	mov	[symbol_identifier],eax
1922
	mov	al,[edi+12]
1925
	mov	al,[edi+12]
1923
	mov	[value_type],al
1926
	mov	[value_type],al
1924
      check_qword_value:
1927
      check_qword_value:
1925
	mov	eax,[edi]
1928
	mov	eax,[edi]
1926
	mov	edx,[edi+4]
1929
	mov	edx,[edi+4]
1927
	ret
1930
	ret
1928
get_value:
1931
get_value:
1929
	mov	[operand_size],0
1932
	mov	[operand_size],0
1930
	lods	byte [esi]
1933
	lods	byte [esi]
1931
	call	get_size_operator
1934
	call	get_size_operator
1932
	cmp	al,'('
1935
	cmp	al,'('
1933
	jne	invalid_value
1936
	jne	invalid_value
1934
	mov	al,[operand_size]
1937
	mov	al,[operand_size]
1935
	cmp	al,1
1938
	cmp	al,1
1936
	je	value_byte
1939
	je	value_byte
1937
	cmp	al,2
1940
	cmp	al,2
1938
	je	value_word
1941
	je	value_word
1939
	cmp	al,4
1942
	cmp	al,4
1940
	je	value_dword
1943
	je	value_dword
1941
	cmp	al,6
1944
	cmp	al,6
1942
	je	value_pword
1945
	je	value_pword
1943
	cmp	al,8
1946
	cmp	al,8
1944
	je	value_qword
1947
	je	value_qword
1945
	or	al,al
1948
	or	al,al
1946
	jnz	invalid_value
1949
	jnz	invalid_value
1947
      value_qword:
1950
      value_qword:
1948
	call	get_qword_value
1951
	call	get_qword_value
1949
	ret
1952
	ret
1950
      value_pword:
1953
      value_pword:
1951
	call	get_pword_value
1954
	call	get_pword_value
1952
	movzx	edx,dx
1955
	movzx	edx,dx
1953
	ret
1956
	ret
1954
      value_dword:
1957
      value_dword:
1955
	call	get_dword_value
1958
	call	get_dword_value
1956
	xor	edx,edx
1959
	xor	edx,edx
1957
	ret
1960
	ret
1958
      value_word:
1961
      value_word:
1959
	call	get_word_value
1962
	call	get_word_value
1960
	xor	edx,edx
1963
	xor	edx,edx
1961
	movzx	eax,ax
1964
	movzx	eax,ax
1962
	ret
1965
	ret
1963
      value_byte:
1966
      value_byte:
1964
	call	get_byte_value
1967
	call	get_byte_value
1965
	xor	edx,edx
1968
	xor	edx,edx
1966
	movzx	eax,al
1969
	movzx	eax,al
1967
	ret
1970
	ret
1968
get_address_word_value:
1971
get_address_word_value:
1969
	mov	[address_size],2
1972
	mov	[address_size],2
1970
	mov	[value_size],2
1973
	mov	[value_size],2
1971
	jmp	calculate_address
1974
	jmp	calculate_address
1972
get_address_dword_value:
1975
get_address_dword_value:
1973
	mov	[address_size],4
1976
	mov	[address_size],4
1974
	mov	[value_size],4
1977
	mov	[value_size],4
1975
	jmp	calculate_address
1978
	jmp	calculate_address
1976
get_address_qword_value:
1979
get_address_qword_value:
1977
	mov	[address_size],8
1980
	mov	[address_size],8
1978
	mov	[value_size],8
1981
	mov	[value_size],8
1979
	jmp	calculate_address
1982
	jmp	calculate_address
1980
get_address_value:
1983
get_address_value:
1981
	mov	[address_size],0
1984
	mov	[address_size],0
1982
	mov	[value_size],8
1985
	mov	[value_size],8
1983
      calculate_address:
1986
      calculate_address:
1984
	cmp	byte [esi],'.'
1987
	cmp	byte [esi],'.'
1985
	je	invalid_address
1988
	je	invalid_address
1986
	call	calculate_expression
1989
	call	calculate_expression
1987
	mov	eax,[edi+16]
1990
	mov	eax,[edi+16]
1988
	mov	[address_symbol],eax
1991
	mov	[address_symbol],eax
1989
	mov	al,[edi+12]
1992
	mov	al,[edi+12]
1990
	mov	[value_type],al
1993
	mov	[value_type],al
1991
	cmp	al,5
1994
	cmp	al,5
1992
	je	gotoff_address
1995
	je	gotoff_address
1993
	ja	invalid_use_of_symbol
1996
	ja	invalid_use_of_symbol
1994
	test	al,1
1997
	test	al,1
1995
	jnz	invalid_use_of_symbol
1998
	jnz	invalid_use_of_symbol
1996
	or	al,al
1999
	or	al,al
1997
	jz	address_size_ok
2000
	jz	address_size_ok
1998
	shl	al,5
2001
	shl	al,5
1999
	jmp	address_symbol_ok
2002
	jmp	address_symbol_ok
2000
      gotoff_address:
2003
      gotoff_address:
2001
	mov	al,40h
2004
	mov	al,40h
2002
      address_symbol_ok:
2005
      address_symbol_ok:
2003
	mov	ah,[address_size]
2006
	mov	ah,[address_size]
2004
	or	[address_size],al
2007
	or	[address_size],al
2005
	shr	al,4
2008
	shr	al,4
2006
	or	ah,ah
2009
	or	ah,ah
2007
	jz	address_size_ok
2010
	jz	address_size_ok
2008
	cmp	al,ah
2011
	cmp	al,ah
2009
	je	address_size_ok
2012
	je	address_size_ok
2010
	cmp	ax,0408h
2013
	cmp	ax,0408h
2011
	jne	address_sizes_do_not_agree
2014
	jne	address_sizes_do_not_agree
2012
	mov	[value_type],2
2015
	mov	[value_type],2
2013
	mov	eax,[edi]
2016
	mov	eax,[edi]
2014
	cdq
2017
	cdq
2015
	cmp	edx,[edi+4]
2018
	cmp	edx,[edi+4]
2016
	je	address_size_ok
2019
	je	address_size_ok
2017
	cmp	[error_line],0
2020
	cmp	[error_line],0
2018
	jne	address_size_ok
2021
	jne	address_size_ok
2019
	mov	ecx,[current_line]
2022
	mov	ecx,[current_line]
2020
	mov	[error_line],ecx
2023
	mov	[error_line],ecx
2021
	mov	[error],value_out_of_range
2024
	mov	[error],value_out_of_range
2022
      address_size_ok:
2025
      address_size_ok:
2023
	xor	ebx,ebx
2026
	xor	ebx,ebx
2024
	xor	ecx,ecx
2027
	xor	ecx,ecx
2025
	mov	cl,[value_type]
2028
	mov	cl,[value_type]
2026
	shl	ecx,16
2029
	shl	ecx,16
2027
	mov	ch,[address_size]
2030
	mov	ch,[address_size]
2028
	cmp	word [edi+8],0
2031
	cmp	word [edi+8],0
2029
	je	check_immediate_address
2032
	je	check_immediate_address
2030
	mov	al,[edi+8]
2033
	mov	al,[edi+8]
2031
	mov	dl,[edi+10]
2034
	mov	dl,[edi+10]
2032
	call	get_address_register
2035
	call	get_address_register
2033
	mov	al,[edi+9]
2036
	mov	al,[edi+9]
2034
	mov	dl,[edi+11]
2037
	mov	dl,[edi+11]
2035
	call	get_address_register
2038
	call	get_address_register
2036
	mov	ax,bx
2039
	mov	ax,bx
2037
	shr	ah,4
2040
	shr	ah,4
2038
	shr	al,4
2041
	shr	al,4
2039
	or	bh,bh
2042
	or	bh,bh
2040
	jz	check_address_registers
2043
	jz	check_address_registers
2041
	or	bl,bl
2044
	or	bl,bl
2042
	jz	check_address_registers
2045
	jz	check_address_registers
2043
	cmp	al,ah
2046
	cmp	al,ah
2044
	jne	invalid_address
2047
	jne	invalid_address
2045
      check_address_registers:
2048
      check_address_registers:
2046
	or	al,ah
2049
	or	al,ah
2047
	mov	ah,[address_size]
2050
	mov	ah,[address_size]
2048
	and	ah,0Fh
2051
	and	ah,0Fh
2049
	jz	address_registers_sizes_ok
2052
	jz	address_registers_sizes_ok
2050
	cmp	al,ah
2053
	cmp	al,ah
2051
	jne	address_sizes_do_not_match
2054
	jne	address_sizes_do_not_match
2052
      address_registers_sizes_ok:
2055
      address_registers_sizes_ok:
2053
	cmp	al,4
2056
	cmp	al,4
2054
	je	sib_allowed
2057
	je	sib_allowed
2055
	cmp	al,8
2058
	cmp	al,8
2056
	je	sib_allowed
2059
	je	sib_allowed
2057
	cmp	al,0Fh
2060
	cmp	al,0Fh
2058
	je	check_ip_relative_address
2061
	je	check_ip_relative_address
2059
	or	cl,cl
2062
	or	cl,cl
2060
	jz	check_word_value
2063
	jz	check_word_value
2061
	cmp	cl,1
2064
	cmp	cl,1
2062
	je	check_word_value
2065
	je	check_word_value
2063
	jmp	invalid_address
2066
	jmp	invalid_address
2064
      address_sizes_do_not_match:
2067
      address_sizes_do_not_match:
2065
	cmp	al,0Fh
2068
	cmp	al,0Fh
2066
	jne	invalid_address
2069
	jne	invalid_address
2067
	mov	al,bh
2070
	mov	al,bh
2068
	and	al,0Fh
2071
	and	al,0Fh
2069
	cmp	al,ah
2072
	cmp	al,ah
2070
	jne	invalid_address
2073
	jne	invalid_address
2071
      check_ip_relative_address:
2074
      check_ip_relative_address:
2072
	cmp	bh,0F4h
2075
	cmp	bh,0F4h
2073
	je	check_dword_value
2076
	je	check_dword_value
2074
	cmp	bh,0F8h
2077
	cmp	bh,0F8h
2075
	jne	invalid_address
2078
	jne	invalid_address
2076
	mov	eax,[edi]
2079
	mov	eax,[edi]
2077
	cdq
2080
	cdq
2078
	cmp	edx,[edi+4]
2081
	cmp	edx,[edi+4]
2079
	jne	range_exceeded
2082
	jne	range_exceeded
2080
	ret
2083
	ret
2081
      get_address_register:
2084
      get_address_register:
2082
	or	al,al
2085
	or	al,al
2083
	jz	address_register_ok
2086
	jz	address_register_ok
2084
	cmp	dl,1
2087
	cmp	dl,1
2085
	jne	scaled_register
2088
	jne	scaled_register
2086
	or	bh,bh
2089
	or	bh,bh
2087
	jnz	scaled_register
2090
	jnz	scaled_register
2088
	mov	bh,al
2091
	mov	bh,al
2089
      address_register_ok:
2092
      address_register_ok:
2090
	ret
2093
	ret
2091
      scaled_register:
2094
      scaled_register:
2092
	or	bl,bl
2095
	or	bl,bl
2093
	jnz	invalid_address
2096
	jnz	invalid_address
2094
	mov	bl,al
2097
	mov	bl,al
2095
	mov	cl,dl
2098
	mov	cl,dl
2096
	jmp	address_register_ok
2099
	jmp	address_register_ok
2097
      sib_allowed:
2100
      sib_allowed:
2098
	or	bh,bh
2101
	or	bh,bh
2099
	jnz	check_index_scale
2102
	jnz	check_index_scale
2100
	cmp	cl,2
2103
	cmp	cl,2
2101
	je	special_index_scale
2104
	je	special_index_scale
2102
	cmp	cl,3
2105
	cmp	cl,3
2103
	je	special_index_scale
2106
	je	special_index_scale
2104
	cmp	cl,5
2107
	cmp	cl,5
2105
	je	special_index_scale
2108
	je	special_index_scale
2106
	cmp	cl,9
2109
	cmp	cl,9
2107
	je	special_index_scale
2110
	je	special_index_scale
2108
      check_index_scale:
2111
      check_index_scale:
2109
	or	cl,cl
2112
	or	cl,cl
2110
	jz	check_immediate_address
2113
	jz	check_immediate_address
2111
	cmp	cl,1
2114
	cmp	cl,1
2112
	je	check_immediate_address
2115
	je	check_immediate_address
2113
	cmp	cl,2
2116
	cmp	cl,2
2114
	je	check_immediate_address
2117
	je	check_immediate_address
2115
	cmp	cl,4
2118
	cmp	cl,4
2116
	je	check_immediate_address
2119
	je	check_immediate_address
2117
	cmp	cl,8
2120
	cmp	cl,8
2118
	je	check_immediate_address
2121
	je	check_immediate_address
2119
	jmp	invalid_address
2122
	jmp	invalid_address
2120
      special_index_scale:
2123
      special_index_scale:
2121
	mov	bh,bl
2124
	mov	bh,bl
2122
	dec	cl
2125
	dec	cl
2123
      check_immediate_address:
2126
      check_immediate_address:
2124
	mov	al,[address_size]
2127
	mov	al,[address_size]
2125
	and	al,0Fh
2128
	and	al,0Fh
2126
	cmp	al,2
2129
	cmp	al,2
2127
	je	check_word_value
2130
	je	check_word_value
2128
	cmp	al,4
2131
	cmp	al,4
2129
	je	check_dword_value
2132
	je	check_dword_value
2130
	cmp	al,8
2133
	cmp	al,8
2131
	je	check_qword_value
2134
	je	check_qword_value
2132
	or	al,al
2135
	or	al,al
2133
	jnz	invalid_value
2136
	jnz	invalid_value
2134
	cmp	[code_type],64
2137
	cmp	[code_type],64
2135
	jne	check_dword_value
2138
	jne	check_dword_value
2136
	jmp	check_qword_value
2139
	jmp	check_qword_value
2137
calculate_relative_offset:
2140
calculate_relative_offset:
2138
	cmp	[value_undefined],0
2141
	cmp	[value_undefined],0
2139
	jne	relative_offset_ok
2142
	jne	relative_offset_ok
2140
	test	bh,bh
2143
	test	bh,bh
2141
	setne	ch
2144
	setne	ch
2142
	cmp	bx,word [org_registers]
2145
	cmp	bx,word [org_registers]
2143
	je	origin_registers_ok
2146
	je	origin_registers_ok
2144
	xchg	bh,bl
2147
	xchg	bh,bl
2145
	xchg	ch,cl
2148
	xchg	ch,cl
2146
	cmp	bx,word [org_registers]
2149
	cmp	bx,word [org_registers]
2147
	jne	invalid_value
2150
	jne	invalid_value
2148
      origin_registers_ok:
2151
      origin_registers_ok:
2149
	cmp	cx,word [org_registers+2]
2152
	cmp	cx,word [org_registers+2]
2150
	jne	invalid_value
2153
	jne	invalid_value
2151
	add	eax,dword [org_origin]
2154
	add	eax,dword [org_origin]
2152
	adc	edx,dword [org_origin+4]
2155
	adc	edx,dword [org_origin+4]
2153
	sub	eax,edi
2156
	sub	eax,edi
2154
	sbb	edx,0
2157
	sbb	edx,0
2155
	mov	bl,[value_type]
2158
	mov	bl,[value_type]
2156
	or	bl,bl
2159
	or	bl,bl
2157
	je	relative_offset_ok
2160
	je	relative_offset_ok
2158
	test	bl,1
2161
	test	bl,1
2159
	jnz	invalid_use_of_symbol
2162
	jnz	invalid_use_of_symbol
2160
	cmp	bl,6
2163
	cmp	bl,6
2161
	je	plt_relative_offset
2164
	je	plt_relative_offset
2162
	cmp	bl,[labels_type]
2165
	cmp	bl,[labels_type]
2163
	jne	invalid_use_of_symbol
2166
	jne	invalid_use_of_symbol
2164
	mov	[value_type],0
2167
	mov	[value_type],0
2165
	mov	ecx,[address_symbol]
2168
	mov	ecx,[address_symbol]
2166
	mov	[symbol_identifier],ecx
2169
	mov	[symbol_identifier],ecx
2167
	cmp	ecx,[org_symbol]
2170
	cmp	ecx,[org_symbol]
2168
	je	relative_offset_ok
2171
	je	relative_offset_ok
2169
	mov	[value_type],3
2172
	mov	[value_type],3
2170
      relative_offset_ok:
2173
      relative_offset_ok:
2171
	ret
2174
	ret
2172
      plt_relative_offset:
2175
      plt_relative_offset:
2173
	mov	[value_type],7
2176
	mov	[value_type],7
2174
	ret
2177
	ret
2175
 
2178
 
2176
preevaluate_logical_expression:
2179
preevaluate_logical_expression:
2177
	push	edi
2180
	xor	al,al
-
 
2181
  preevaluate_embedded_logical_expression:
-
 
2182
	mov	[logical_value_wrapping],al
-
 
2183
	push	edi
2178
	call	preevaluate_logical_value
2184
	call	preevaluate_logical_value
2179
      preevaluation_loop:
2185
      preevaluation_loop:
2180
	cmp	al,0FFh
2186
	cmp	al,0FFh
2181
	je	invalid_logical_expression
2187
	je	invalid_logical_expression
2182
	mov	dl,[esi]
2188
	mov	dl,[esi]
2183
	inc	esi
2189
	inc	esi
2184
	cmp	dl,'|'
2190
	cmp	dl,'|'
2185
	je	preevaluate_or
2191
	je	preevaluate_or
2186
	cmp	dl,'&'
2192
	cmp	dl,'&'
2187
	je	preevaluate_and
2193
	je	preevaluate_and
2188
	cmp	dl,'}'
2194
	cmp	dl,'}'
2189
	je	preevaluation_done
2195
	je	preevaluation_done
2190
	or	dl,dl
2196
	or	dl,dl
2191
	jnz	invalid_logical_expression
2197
	jnz	invalid_logical_expression
2192
      preevaluation_done:
2198
      preevaluation_done:
2193
	pop	edx
2199
	pop	edx
2194
	dec	esi
2200
	dec	esi
2195
	ret
2201
	ret
2196
      preevaluate_or:
2202
      preevaluate_or:
2197
	cmp	al,'1'
2203
	cmp	al,'1'
2198
	je	quick_true
2204
	je	quick_true
2199
	cmp	al,'0'
2205
	cmp	al,'0'
2200
	je	leave_only_following
2206
	je	leave_only_following
2201
	push	edi
2207
	push	edi
2202
	mov	al,dl
2208
	mov	al,dl
2203
	stos	byte [edi]
2209
	stos	byte [edi]
2204
	call	preevaluate_logical_value
2210
	call	preevaluate_logical_value
2205
	pop	ebx
2211
	pop	ebx
2206
	cmp	al,'0'
2212
	cmp	al,'0'
2207
	je	leave_only_preceding
2213
	je	leave_only_preceding
2208
	cmp	al,'1'
2214
	cmp	al,'1'
2209
	jne	preevaluation_loop
2215
	jne	preevaluation_loop
2210
	stos	byte [edi]
2216
	stos	byte [edi]
2211
	xor	al,al
2217
	xor	al,al
2212
	jmp	preevaluation_loop
2218
	jmp	preevaluation_loop
2213
      preevaluate_and:
2219
      preevaluate_and:
2214
	cmp	al,'0'
2220
	cmp	al,'0'
2215
	je	quick_false
2221
	je	quick_false
2216
	cmp	al,'1'
2222
	cmp	al,'1'
2217
	je	leave_only_following
2223
	je	leave_only_following
2218
	push	edi
2224
	push	edi
2219
	mov	al,dl
2225
	mov	al,dl
2220
	stos	byte [edi]
2226
	stos	byte [edi]
2221
	call	preevaluate_logical_value
2227
	call	preevaluate_logical_value
2222
	pop	ebx
2228
	pop	ebx
2223
	cmp	al,'1'
2229
	cmp	al,'1'
2224
	je	leave_only_preceding
2230
	je	leave_only_preceding
2225
	cmp	al,'0'
2231
	cmp	al,'0'
2226
	jne	preevaluation_loop
2232
	jne	preevaluation_loop
2227
	stos	byte [edi]
2233
	stos	byte [edi]
2228
	xor	al,al
2234
	xor	al,al
2229
	jmp	preevaluation_loop
2235
	jmp	preevaluation_loop
2230
      leave_only_following:
2236
      leave_only_following:
2231
	mov	edi,[esp]
2237
	mov	edi,[esp]
2232
	call	preevaluate_logical_value
2238
	call	preevaluate_logical_value
2233
	jmp	preevaluation_loop
2239
	jmp	preevaluation_loop
2234
      leave_only_preceding:
2240
      leave_only_preceding:
2235
	mov	edi,ebx
2241
	mov	edi,ebx
2236
	xor	al,al
2242
	xor	al,al
2237
	jmp	preevaluation_loop
2243
	jmp	preevaluation_loop
2238
      quick_true:
2244
      quick_true:
2239
	call	skip_logical_value
2245
	call	skip_logical_value
2240
	jc	invalid_logical_expression
2246
	jc	invalid_logical_expression
2241
	mov	edi,[esp]
2247
	mov	edi,[esp]
2242
	mov	al,'1'
2248
	mov	al,'1'
2243
	jmp	preevaluation_loop
2249
	jmp	preevaluation_loop
2244
      quick_false:
2250
      quick_false:
2245
	call	skip_logical_value
2251
	call	skip_logical_value
2246
	jc	invalid_logical_expression
2252
	jc	invalid_logical_expression
2247
	mov	edi,[esp]
2253
	mov	edi,[esp]
2248
	mov	al,'0'
2254
	mov	al,'0'
2249
	jmp	preevaluation_loop
2255
	jmp	preevaluation_loop
2250
      invalid_logical_expression:
2256
      invalid_logical_expression:
2251
	pop	edi
2257
	pop	edi
2252
	mov	esi,edi
2258
	mov	esi,edi
2253
	mov	al,0FFh
2259
	mov	al,0FFh
2254
	stos	byte [edi]
2260
	stos	byte [edi]
2255
	ret
2261
	ret
2256
skip_logical_value:
2262
  skip_logical_value:
2257
	cmp	byte [esi],'~'
2263
	cmp	byte [esi],'~'
2258
	jne	negation_skipped
2264
	jne	negation_skipped
2259
	inc	esi
2265
	inc	esi
2260
	jmp	skip_logical_value
2266
	jmp	skip_logical_value
2261
      negation_skipped:
2267
      negation_skipped:
2262
	cmp	byte [esi],'{'
2268
	cmp	byte [esi],'{'
2263
	jne	skip_simple_logical_value
2269
	jne	skip_simple_logical_value
2264
	inc	esi
2270
	inc	esi
2265
      skip_logical_expression:
2271
	xchg	al,[logical_value_wrapping]
-
 
2272
	push	eax
-
 
2273
      skip_logical_expression:
2266
	call	skip_logical_value
2274
	call	skip_logical_value
2267
	lods	byte [esi]
2275
	lods	byte [esi]
2268
	or	al,al
2276
	or	al,al
2269
	jz	wrongly_structured_logical_expression
2277
	jz	wrongly_structured_logical_expression
2270
	cmp	al,0Fh
2278
	cmp	al,0Fh
2271
	je	wrongly_structured_logical_expression
2279
	je	wrongly_structured_logical_expression
2272
	cmp	al,'|'
2280
	cmp	al,'|'
2273
	je	skip_logical_expression
2281
	je	skip_logical_expression
2274
	cmp	al,'&'
2282
	cmp	al,'&'
2275
	je	skip_logical_expression
2283
	je	skip_logical_expression
2276
	cmp	al,'}'
2284
	cmp	al,'}'
2277
	je	logical_value_skipped
2285
	jne	wrongly_structured_logical_expression
-
 
2286
	pop	eax
-
 
2287
	mov	[logical_value_wrapping],al
-
 
2288
      logical_value_skipped:
2278
      wrongly_structured_logical_expression:
2289
	clc
-
 
2290
	ret
-
 
2291
      wrongly_structured_logical_expression:
2279
	stc
2292
	stc
2280
	ret
2293
	ret
2281
      skip_simple_logical_value:
2294
      skip_simple_logical_value:
2282
	mov	al,[esi]
2295
	mov	[logical_value_parentheses],0
-
 
2296
      find_simple_logical_value_end:
-
 
2297
	mov	al,[esi]
2283
	or	al,al
2298
	or	al,al
2284
	jz	logical_value_skipped
2299
	jz	logical_value_skipped
2285
	cmp	al,0Fh
2300
	cmp	al,0Fh
2286
	je	logical_value_skipped
2301
	je	logical_value_skipped
2287
	cmp	al,'}'
2302
	cmp	al,'|'
2288
	je	logical_value_skipped
-
 
2289
	cmp	al,'|'
-
 
2290
	je	logical_value_skipped
2303
	je	logical_value_skipped
2291
	cmp	al,'&'
2304
	cmp	al,'&'
2292
	je	logical_value_skipped
2305
	je	logical_value_skipped
2293
	call	skip_symbol
2306
	cmp	al,'{'
-
 
2307
	je	skip_logical_value_internal_parenthesis
-
 
2308
	cmp	al,'}'
-
 
2309
	jne	skip_logical_value_symbol
-
 
2310
	sub	[logical_value_parentheses],1
-
 
2311
	jnc	skip_logical_value_symbol
-
 
2312
	cmp	[logical_value_wrapping],al
-
 
2313
	jne	skip_logical_value_symbol
-
 
2314
	jmp	logical_value_skipped
-
 
2315
      skip_logical_value_internal_parenthesis:
-
 
2316
	inc	[logical_value_parentheses]
-
 
2317
      skip_logical_value_symbol:
-
 
2318
	call	skip_symbol
2294
	jmp	skip_simple_logical_value
2319
	jmp	find_simple_logical_value_end
2295
      logical_value_skipped:
2320
  preevaluate_logical_value:
2296
	clc
-
 
2297
	ret
-
 
2298
 
-
 
2299
preevaluate_logical_value:
-
 
2300
	mov	ebp,edi
2321
	mov	ebp,edi
2301
      preevaluate_negation:
2322
      preevaluate_negation:
2302
	cmp	byte [esi],'~'
2323
	cmp	byte [esi],'~'
2303
	jne	preevaluate_negation_ok
2324
	jne	preevaluate_negation_ok
2304
	movs	byte [edi],[esi]
2325
	movs	byte [edi],[esi]
2305
	jmp	preevaluate_negation
2326
	jmp	preevaluate_negation
2306
      preevaluate_negation_ok:
2327
      preevaluate_negation_ok:
2307
	mov	ebx,esi
2328
	mov	ebx,esi
2308
	xor	edx,edx
2329
	cmp	byte [esi],'{'
2309
	cmp	byte [esi],'{'
-
 
2310
	jne	find_logical_value_boundaries
2330
	jne	preevaluate_simple_logical_value
2311
	movs	byte [edi],[esi]
2331
	lods	byte [esi]
2312
	push	ebp
2332
	stos	byte [edi]
-
 
2333
	push	ebp
2313
	call	preevaluate_logical_expression
2334
	mov	dl,[logical_value_wrapping]
-
 
2335
	push	edx
-
 
2336
	call	preevaluate_embedded_logical_expression
2314
	pop	ebp
2337
	pop	edx
-
 
2338
	mov	[logical_value_wrapping],dl
-
 
2339
	pop	ebp
2315
	cmp	al,0FFh
2340
	cmp	al,0FFh
2316
	je	invalid_logical_value
2341
	je	invalid_logical_value
2317
	cmp	byte [esi],'}'
2342
	cmp	byte [esi],'}'
2318
	jne	invalid_logical_value
2343
	jne	invalid_logical_value
2319
	or	al,al
2344
	or	al,al
2320
	jnz	preevaluated_expression_value
2345
	jnz	preevaluated_expression_value
2321
	movs	byte [edi],[esi]
2346
	movs	byte [edi],[esi]
2322
	ret
2347
	ret
2323
      preevaluated_expression_value:
2348
      preevaluated_expression_value:
2324
	inc	esi
2349
	inc	esi
2325
	lea	edx,[edi-1]
2350
	lea	edx,[edi-1]
2326
	sub	edx,ebp
2351
	sub	edx,ebp
2327
	test	edx,1
2352
	test	edx,1
2328
	jz	expression_negation_ok
2353
	jz	expression_negation_ok
2329
	xor	al,1
2354
	xor	al,1
2330
      expression_negation_ok:
2355
      expression_negation_ok:
2331
	mov	edi,ebp
2356
	mov	edi,ebp
2332
	ret
2357
	ret
2333
      invalid_logical_value:
2358
      invalid_logical_value:
2334
	mov	edi,ebp
2359
	mov	edi,ebp
2335
	mov	al,0FFh
2360
	mov	al,0FFh
2336
	ret
2361
	ret
2337
      find_logical_value_boundaries:
2362
      preevaluate_simple_logical_value:
-
 
2363
	xor	edx,edx
-
 
2364
	mov	[logical_value_parentheses],edx
-
 
2365
      find_logical_value_boundaries:
2338
	mov	al,[esi]
2366
	mov	al,[esi]
2339
	or	al,al
2367
	or	al,al
2340
	jz	logical_value_boundaries_found
2368
	jz	logical_value_boundaries_found
2341
	cmp	al,'}'
2369
	cmp	al,'{'
-
 
2370
	je	logical_value_internal_parentheses
-
 
2371
	cmp	al,'}'
2342
	je	logical_value_boundaries_found
2372
	je	logical_value_boundaries_parenthesis_close
2343
	cmp	al,'|'
2373
	cmp	al,'|'
2344
	je	logical_value_boundaries_found
2374
	je	logical_value_boundaries_found
2345
	cmp	al,'&'
2375
	cmp	al,'&'
2346
	je	logical_value_boundaries_found
2376
	je	logical_value_boundaries_found
2347
	or	edx,edx
2377
	or	edx,edx
2348
	jnz	next_symbol_in_logical_value
2378
	jnz	next_symbol_in_logical_value
2349
	cmp	al,0F0h
2379
	cmp	al,0F0h
2350
	je	preevaluable_logical_operator
2380
	je	preevaluable_logical_operator
2351
	cmp	al,0F7h
2381
	cmp	al,0F7h
2352
	je	preevaluable_logical_operator
2382
	je	preevaluable_logical_operator
2353
	cmp	al,0F6h
2383
	cmp	al,0F6h
2354
	jne	next_symbol_in_logical_value
2384
	jne	next_symbol_in_logical_value
2355
      preevaluable_logical_operator:
2385
      preevaluable_logical_operator:
2356
	mov	edx,esi
2386
	mov	edx,esi
2357
      next_symbol_in_logical_value:
2387
      next_symbol_in_logical_value:
2358
	call	skip_symbol
2388
	call	skip_symbol
2359
	jmp	find_logical_value_boundaries
2389
	jmp	find_logical_value_boundaries
2360
      logical_value_boundaries_found:
2390
      logical_value_internal_parentheses:
-
 
2391
	inc	[logical_value_parentheses]
-
 
2392
	jmp	next_symbol_in_logical_value
-
 
2393
      logical_value_boundaries_parenthesis_close:
-
 
2394
	sub	[logical_value_parentheses],1
-
 
2395
	jnc	next_symbol_in_logical_value
-
 
2396
	cmp	[logical_value_wrapping],'{'
-
 
2397
	jne	next_symbol_in_logical_value
-
 
2398
      logical_value_boundaries_found:
2361
	or	edx,edx
2399
	or	edx,edx
2362
	jz	non_preevaluable_logical_value
2400
	jz	non_preevaluable_logical_value
2363
	mov	al,[edx]
2401
	mov	al,[edx]
2364
	cmp	al,0F0h
2402
	cmp	al,0F0h
2365
	je	compare_symbols
2403
	je	compare_symbols
2366
	cmp	al,0F7h
2404
	cmp	al,0F7h
2367
	je	compare_symbol_types
2405
	je	compare_symbol_types
2368
	cmp	al,0F6h
2406
	cmp	al,0F6h
2369
	je	scan_symbols_list
2407
	je	scan_symbols_list
2370
      non_preevaluable_logical_value:
2408
      non_preevaluable_logical_value:
2371
	mov	ecx,esi
2409
	mov	ecx,esi
2372
	mov	esi,ebx
2410
	mov	esi,ebx
2373
	sub	ecx,esi
2411
	sub	ecx,esi
2374
	jz	invalid_logical_value
2412
	jz	invalid_logical_value
2375
	cmp	esi,edi
2413
	cmp	esi,edi
2376
	je	leave_logical_value_intact
2414
	je	leave_logical_value_intact
2377
	rep	movs byte [edi],[esi]
2415
	rep	movs byte [edi],[esi]
2378
	xor	al,al
2416
	xor	al,al
2379
	ret
2417
	ret
2380
      leave_logical_value_intact:
2418
      leave_logical_value_intact:
2381
	add	edi,ecx
2419
	add	edi,ecx
2382
	add	esi,ecx
2420
	add	esi,ecx
2383
	xor	al,al
2421
	xor	al,al
2384
	ret
2422
	ret
2385
      compare_symbols:
2423
      compare_symbols:
2386
	lea	ecx,[esi-1]
2424
	lea	ecx,[esi-1]
2387
	sub	ecx,edx
2425
	sub	ecx,edx
2388
	mov	eax,edx
2426
	mov	eax,edx
2389
	sub	eax,ebx
2427
	sub	eax,ebx
2390
	cmp	ecx,eax
2428
	cmp	ecx,eax
2391
	jne	preevaluated_false
2429
	jne	preevaluated_false
2392
	push	esi edi
2430
	push	esi edi
2393
	mov	esi,ebx
2431
	mov	esi,ebx
2394
	lea	edi,[edx+1]
2432
	lea	edi,[edx+1]
2395
	repe	cmps byte [esi],[edi]
2433
	repe	cmps byte [esi],[edi]
2396
	pop	edi esi
2434
	pop	edi esi
2397
	je	preevaluated_true
2435
	je	preevaluated_true
2398
      preevaluated_false:
2436
      preevaluated_false:
2399
	mov	eax,edi
2437
	mov	eax,edi
2400
	sub	eax,ebp
2438
	sub	eax,ebp
2401
	test	eax,1
2439
	test	eax,1
2402
	jnz	store_true
2440
	jnz	store_true
2403
      store_false:
2441
      store_false:
2404
	mov	edi,ebp
2442
	mov	edi,ebp
2405
	mov	al,'0'
2443
	mov	al,'0'
2406
	ret
2444
	ret
2407
      preevaluated_true:
2445
      preevaluated_true:
2408
	mov	eax,edi
2446
	mov	eax,edi
2409
	sub	eax,ebp
2447
	sub	eax,ebp
2410
	test	eax,1
2448
	test	eax,1
2411
	jnz	store_false
2449
	jnz	store_false
2412
      store_true:
2450
      store_true:
2413
	mov	edi,ebp
2451
	mov	edi,ebp
2414
	mov	al,'1'
2452
	mov	al,'1'
2415
	ret
2453
	ret
2416
      compare_symbol_types:
2454
      compare_symbol_types:
2417
	push	esi
2455
	push	esi
2418
	lea	esi,[edx+1]
2456
	lea	esi,[edx+1]
2419
      type_comparison:
2457
      type_comparison:
2420
	cmp	esi,[esp]
2458
	cmp	esi,[esp]
2421
	je	types_compared
2459
	je	types_compared
2422
	mov	al,[esi]
2460
	mov	al,[esi]
2423
	cmp	al,[ebx]
2461
	cmp	al,[ebx]
2424
	jne	different_type
2462
	jne	different_type
2425
	cmp	al,'('
2463
	cmp	al,'('
2426
	jne	equal_type
2464
	jne	equal_type
2427
	mov	al,[esi+1]
2465
	mov	al,[esi+1]
2428
	mov	ah,[ebx+1]
2466
	mov	ah,[ebx+1]
2429
	cmp	al,ah
2467
	cmp	al,ah
2430
	je	equal_type
2468
	je	equal_type
2431
	or	al,al
2469
	or	al,al
2432
	jz	different_type
2470
	jz	different_type
2433
	or	ah,ah
2471
	or	ah,ah
2434
	jz	different_type
2472
	jz	different_type
2435
	cmp	al,'.'
2473
	cmp	al,'.'
2436
	je	different_type
2474
	je	different_type
2437
	cmp	ah,'.'
2475
	cmp	ah,'.'
2438
	je	different_type
2476
	je	different_type
2439
      equal_type:
2477
      equal_type:
2440
	call	skip_symbol
2478
	call	skip_symbol
2441
	xchg	esi,ebx
2479
	xchg	esi,ebx
2442
	call	skip_symbol
2480
	call	skip_symbol
2443
	xchg	esi,ebx
2481
	xchg	esi,ebx
2444
	jmp	type_comparison
2482
	jmp	type_comparison
2445
      types_compared:
2483
      types_compared:
2446
	pop	esi
2484
	pop	esi
2447
	cmp	byte [ebx],0F7h
2485
	cmp	byte [ebx],0F7h
2448
	jne	preevaluated_false
2486
	jne	preevaluated_false
2449
	jmp	preevaluated_true
2487
	jmp	preevaluated_true
2450
      different_type:
2488
      different_type:
2451
	pop	esi
2489
	pop	esi
2452
	jmp	preevaluated_false
2490
	jmp	preevaluated_false
2453
      scan_symbols_list:
2491
      scan_symbols_list:
2454
	push	edi esi
2492
	push	edi esi
2455
	lea	esi,[edx+1]
2493
	lea	esi,[edx+1]
2456
	sub	edx,ebx
2494
	sub	edx,ebx
2457
	lods	byte [esi]
2495
	lods	byte [esi]
2458
	cmp	al,'<'
2496
	cmp	al,'<'
2459
	jne	invalid_symbols_list
2497
	jne	invalid_symbols_list
2460
      get_next_from_list:
2498
      get_next_from_list:
2461
	mov	edi,esi
2499
	mov	edi,esi
2462
      get_from_list:
2500
      get_from_list:
2463
	cmp	byte [esi],','
2501
	cmp	byte [esi],','
2464
	je	compare_in_list
2502
	je	compare_in_list
2465
	cmp	byte [esi],'>'
2503
	cmp	byte [esi],'>'
2466
	je	compare_in_list
2504
	je	compare_in_list
2467
	cmp	esi,[esp]
2505
	cmp	esi,[esp]
2468
	jae	invalid_symbols_list
2506
	jae	invalid_symbols_list
2469
	call	skip_symbol
2507
	call	skip_symbol
2470
	jmp	get_from_list
2508
	jmp	get_from_list
2471
      compare_in_list:
2509
      compare_in_list:
2472
	mov	ecx,esi
2510
	mov	ecx,esi
2473
	sub	ecx,edi
2511
	sub	ecx,edi
2474
	cmp	ecx,edx
2512
	cmp	ecx,edx
2475
	jne	not_equal_length_in_list
2513
	jne	not_equal_length_in_list
2476
	mov	esi,ebx
2514
	mov	esi,ebx
2477
	repe	cmps byte [esi],[edi]
2515
	repe	cmps byte [esi],[edi]
2478
	mov	esi,edi
2516
	mov	esi,edi
2479
	jne	not_equal_in_list
2517
	jne	not_equal_in_list
2480
      skip_rest_of_list:
2518
      skip_rest_of_list:
2481
	cmp	byte [esi],'>'
2519
	cmp	byte [esi],'>'
2482
	je	check_list_end
2520
	je	check_list_end
2483
	cmp	esi,[esp]
2521
	cmp	esi,[esp]
2484
	jae	invalid_symbols_list
2522
	jae	invalid_symbols_list
2485
	call	skip_symbol
2523
	call	skip_symbol
2486
	jmp	skip_rest_of_list
2524
	jmp	skip_rest_of_list
2487
      check_list_end:
2525
      check_list_end:
2488
	inc	esi
2526
	inc	esi
2489
	cmp	esi,[esp]
2527
	cmp	esi,[esp]
2490
	jne	invalid_symbols_list
2528
	jne	invalid_symbols_list
2491
	pop	esi edi
2529
	pop	esi edi
2492
	jmp	preevaluated_true
2530
	jmp	preevaluated_true
2493
      not_equal_in_list:
2531
      not_equal_in_list:
2494
	add	esi,ecx
2532
	add	esi,ecx
2495
      not_equal_length_in_list:
2533
      not_equal_length_in_list:
2496
	lods	byte [esi]
2534
	lods	byte [esi]
2497
	cmp	al,','
2535
	cmp	al,','
2498
	je	get_next_from_list
2536
	je	get_next_from_list
2499
	cmp	esi,[esp]
2537
	cmp	esi,[esp]
2500
	jne	invalid_symbols_list
2538
	jne	invalid_symbols_list
2501
	pop	esi edi
2539
	pop	esi edi
2502
	jmp	preevaluated_false
2540
	jmp	preevaluated_false
2503
      invalid_symbols_list:
2541
      invalid_symbols_list:
2504
	pop	esi edi
2542
	pop	esi edi
2505
	jmp	invalid_logical_value
2543
	jmp	invalid_logical_value
2506
 
2544
 
2507
calculate_logical_expression:
2545
calculate_logical_expression:
2508
	call	get_logical_value
2546
	xor	al,al
-
 
2547
  calculate_embedded_logical_expression:
-
 
2548
	mov	[logical_value_wrapping],al
-
 
2549
	call	get_logical_value
2509
      logical_loop:
2550
      logical_loop:
2510
	cmp	byte [esi],'|'
2551
	cmp	byte [esi],'|'
2511
	je	logical_or
2552
	je	logical_or
2512
	cmp	byte [esi],'&'
2553
	cmp	byte [esi],'&'
2513
	je	logical_and
2554
	je	logical_and
2514
	ret
2555
	ret
2515
      logical_or:
2556
      logical_or:
2516
	inc	esi
2557
	inc	esi
2517
	or	al,al
2558
	or	al,al
2518
	jnz	logical_value_already_determined
2559
	jnz	logical_value_already_determined
2519
	push	eax
2560
	push	eax
2520
	call	get_logical_value
2561
	call	get_logical_value
2521
	pop	ebx
2562
	pop	ebx
2522
	or	al,bl
2563
	or	al,bl
2523
	jmp	logical_loop
2564
	jmp	logical_loop
2524
      logical_and:
2565
      logical_and:
2525
	inc	esi
2566
	inc	esi
2526
	or	al,al
2567
	or	al,al
2527
	jz	logical_value_already_determined
2568
	jz	logical_value_already_determined
2528
	push	eax
2569
	push	eax
2529
	call	get_logical_value
2570
	call	get_logical_value
2530
	pop	ebx
2571
	pop	ebx
2531
	and	al,bl
2572
	and	al,bl
2532
	jmp	logical_loop
2573
	jmp	logical_loop
2533
      logical_value_already_determined:
2574
      logical_value_already_determined:
2534
	push	eax
2575
	push	eax
2535
	call	skip_logical_value
2576
	call	skip_logical_value
2536
	jc	invalid_expression
2577
	jc	invalid_expression
2537
	pop	eax
2578
	pop	eax
2538
	jmp	logical_loop
2579
	jmp	logical_loop
2539
get_logical_value:
2580
  get_logical_value:
2540
	xor	al,al
2581
	xor	al,al
2541
      check_for_negation:
2582
      check_for_negation:
2542
	cmp	byte [esi],'~'
2583
	cmp	byte [esi],'~'
2543
	jne	negation_ok
2584
	jne	negation_ok
2544
	inc	esi
2585
	inc	esi
2545
	xor	al,-1
2586
	xor	al,-1
2546
	jmp	check_for_negation
2587
	jmp	check_for_negation
2547
      negation_ok:
2588
      negation_ok:
2548
	push	eax
2589
	push	eax
2549
	mov	al,[esi]
2590
	mov	al,[esi]
2550
	cmp	al,'{'
2591
	cmp	al,'{'
2551
	je	logical_expression
2592
	je	logical_expression
2552
	cmp	al,0FFh
2593
	cmp	al,0FFh
2553
	je	invalid_expression
2594
	je	invalid_expression
2554
	cmp	al,88h
2595
	cmp	al,88h
2555
	je	check_for_defined
2596
	je	check_for_defined
2556
	cmp	al,89h
2597
	cmp	al,89h
2557
	je	check_for_used
2598
	je	check_for_used
2558
	cmp	al,'0'
2599
	cmp	al,'0'
2559
	je	given_false
2600
	je	given_false
2560
	cmp	al,'1'
2601
	cmp	al,'1'
2561
	je	given_true
2602
	je	given_true
2562
	call	get_value
2603
	call	get_value
2563
	mov	bl,[value_type]
2604
	mov	bl,[value_type]
2564
	push	eax edx ebx
2605
	push	eax edx ebx
2565
	mov	al,[esi]
2606
	mov	al,[esi]
2566
	or	al,al
2607
	or	al,al
2567
	jz	logical_number
2608
	jz	logical_number
2568
	cmp	al,0Fh
2609
	cmp	al,0Fh
2569
	je	logical_number
2610
	je	logical_number
2570
	cmp	al,'}'
2611
	cmp	al,'}'
2571
	je	logical_number
2612
	je	logical_number
2572
	cmp	al,'&'
2613
	cmp	al,'&'
2573
	je	logical_number
2614
	je	logical_number
2574
	cmp	al,'|'
2615
	cmp	al,'|'
2575
	je	logical_number
2616
	je	logical_number
2576
	inc	esi
2617
	inc	esi
2577
	mov	[compare_type],al
2618
	mov	[compare_type],al
2578
	call	get_value
2619
	call	get_value
2579
	pop	ebx
2620
	pop	ebx
2580
	cmp	[next_pass_needed],0
2621
	cmp	[next_pass_needed],0
2581
	jne	values_ok
2622
	jne	values_ok
2582
	cmp	bl,[value_type]
2623
	cmp	bl,[value_type]
2583
	jne	invalid_use_of_symbol
2624
	jne	invalid_use_of_symbol
2584
      values_ok:
2625
      values_ok:
2585
	pop	ecx ebx
2626
	pop	ecx ebx
2586
	cmp	[compare_type],'='
2627
	cmp	[compare_type],'='
2587
	je	check_equal
2628
	je	check_equal
2588
	cmp	[compare_type],'>'
2629
	cmp	[compare_type],'>'
2589
	je	check_greater
2630
	je	check_greater
2590
	cmp	[compare_type],'<'
2631
	cmp	[compare_type],'<'
2591
	je	check_less
2632
	je	check_less
2592
	cmp	[compare_type],0F1h
2633
	cmp	[compare_type],0F1h
2593
	je	check_not_equal
2634
	je	check_not_equal
2594
	cmp	[compare_type],0F2h
2635
	cmp	[compare_type],0F2h
2595
	je	check_not_less
2636
	je	check_not_less
2596
	cmp	[compare_type],0F3h
2637
	cmp	[compare_type],0F3h
2597
	je	check_not_greater
2638
	je	check_not_greater
2598
	jmp	invalid_expression
2639
	jmp	invalid_expression
2599
      check_equal:
2640
      check_equal:
2600
	cmp	eax,ebx
2641
	cmp	eax,ebx
2601
	jne	return_false
2642
	jne	return_false
2602
	cmp	edx,ecx
2643
	cmp	edx,ecx
2603
	jne	return_false
2644
	jne	return_false
2604
	jmp	return_true
2645
	jmp	return_true
2605
      check_greater:
2646
      check_greater:
2606
	cmp	edx,ecx
2647
	cmp	edx,ecx
2607
	jl	return_true
2648
	jl	return_true
2608
	jg	return_false
2649
	jg	return_false
2609
	cmp	eax,ebx
2650
	cmp	eax,ebx
2610
	jb	return_true
2651
	jb	return_true
2611
	jae	return_false
2652
	jae	return_false
2612
      check_less:
2653
      check_less:
2613
	cmp	edx,ecx
2654
	cmp	edx,ecx
2614
	jl	return_false
2655
	jl	return_false
2615
	jg	return_true
2656
	jg	return_true
2616
	cmp	eax,ebx
2657
	cmp	eax,ebx
2617
	jbe	return_false
2658
	jbe	return_false
2618
	ja	return_true
2659
	ja	return_true
2619
      check_not_less:
2660
      check_not_less:
2620
	cmp	edx,ecx
2661
	cmp	edx,ecx
2621
	jl	return_true
2662
	jl	return_true
2622
	jg	return_false
2663
	jg	return_false
2623
	cmp	eax,ebx
2664
	cmp	eax,ebx
2624
	jbe	return_true
2665
	jbe	return_true
2625
	ja	return_false
2666
	ja	return_false
2626
      check_not_greater:
2667
      check_not_greater:
2627
	cmp	edx,ecx
2668
	cmp	edx,ecx
2628
	jl	return_false
2669
	jl	return_false
2629
	jg	return_true
2670
	jg	return_true
2630
	cmp	eax,ebx
2671
	cmp	eax,ebx
2631
	jb	return_false
2672
	jb	return_false
2632
	jae	return_true
2673
	jae	return_true
2633
      check_not_equal:
2674
      check_not_equal:
2634
	cmp	eax,ebx
2675
	cmp	eax,ebx
2635
	jne	return_true
2676
	jne	return_true
2636
	cmp	edx,ecx
2677
	cmp	edx,ecx
2637
	jne	return_true
2678
	jne	return_true
2638
	jmp	return_false
2679
	jmp	return_false
2639
      logical_number:
2680
      logical_number:
2640
	pop	ebx edx eax
2681
	pop	ebx edx eax
2641
	or	bl,bl
2682
	or	bl,bl
2642
	jnz	invalid_expression
2683
	jnz	invalid_expression
2643
	or	eax,edx
2684
	or	eax,edx
2644
	jnz	return_true
2685
	jnz	return_true
2645
	jmp	return_false
2686
	jmp	return_false
2646
      check_for_defined:
2687
      check_for_defined:
2647
	or	bl,-1
2688
	or	bl,-1
2648
	lods	word [esi]
2689
	lods	word [esi]
2649
	cmp	ah,'('
2690
	cmp	ah,'('
2650
	jne	invalid_expression
2691
	jne	invalid_expression
2651
      check_expression:
2692
      check_expression:
2652
	lods	byte [esi]
2693
	lods	byte [esi]
2653
	or	al,al
2694
	or	al,al
2654
	jz	defined_string
2695
	jz	defined_string
2655
	cmp	al,'.'
2696
	cmp	al,'.'
2656
	je	defined_fp_value
2697
	je	defined_fp_value
2657
	cmp	al,')'
2698
	cmp	al,')'
2658
	je	expression_checked
2699
	je	expression_checked
2659
	cmp	al,'!'
2700
	cmp	al,'!'
2660
	je	invalid_expression
2701
	je	invalid_expression
2661
	cmp	al,0Fh
2702
	cmp	al,0Fh
2662
	je	check_expression
2703
	je	check_expression
2663
	cmp	al,10h
2704
	cmp	al,10h
2664
	je	defined_register
2705
	je	defined_register
2665
	cmp	al,11h
2706
	cmp	al,11h
2666
	je	check_if_symbol_defined
2707
	je	check_if_symbol_defined
2667
	cmp	al,80h
2708
	cmp	al,80h
2668
	jae	check_expression
2709
	jae	check_expression
2669
	movzx	eax,al
2710
	movzx	eax,al
2670
	add	esi,eax
2711
	add	esi,eax
2671
	jmp	check_expression
2712
	jmp	check_expression
2672
      defined_register:
2713
      defined_register:
2673
	inc	esi
2714
	inc	esi
2674
	jmp	check_expression
2715
	jmp	check_expression
2675
      defined_fp_value:
2716
      defined_fp_value:
2676
	add	esi,12
2717
	add	esi,12
2677
	jmp	expression_checked
2718
	jmp	expression_checked
2678
      defined_string:
2719
      defined_string:
2679
	lods	dword [esi]
2720
	lods	dword [esi]
2680
	add	esi,eax
2721
	add	esi,eax
2681
	inc	esi
2722
	inc	esi
2682
	jmp	expression_checked
2723
	jmp	expression_checked
2683
      check_if_symbol_defined:
2724
      check_if_symbol_defined:
2684
	lods	dword [esi]
2725
	lods	dword [esi]
2685
	cmp	eax,-1
2726
	cmp	eax,-1
2686
	je	invalid_expression
2727
	je	invalid_expression
2687
	cmp	eax,0Fh
2728
	cmp	eax,0Fh
2688
	jb	check_expression
2729
	jb	check_expression
2689
	je	reserved_word_used_as_symbol
2730
	je	reserved_word_used_as_symbol
2690
	test	byte [eax+8],4
2731
	test	byte [eax+8],4
2691
	jnz	no_prediction
2732
	jnz	no_prediction
2692
	test	byte [eax+8],1
2733
	test	byte [eax+8],1
2693
	jz	symbol_predicted_undefined
2734
	jz	symbol_predicted_undefined
2694
	mov	cx,[current_pass]
2735
	mov	cx,[current_pass]
2695
	sub	cx,[eax+16]
2736
	sub	cx,[eax+16]
2696
	jz	check_expression
2737
	jz	check_expression
2697
	cmp	cx,1
2738
	cmp	cx,1
2698
	ja	symbol_predicted_undefined
2739
	ja	symbol_predicted_undefined
2699
	or	byte [eax+8],40h+80h
2740
	or	byte [eax+8],40h+80h
2700
	jmp	check_expression
2741
	jmp	check_expression
2701
      no_prediction:
2742
      no_prediction:
2702
	test	byte [eax+8],1
2743
	test	byte [eax+8],1
2703
	jz	symbol_undefined
2744
	jz	symbol_undefined
2704
	mov	cx,[current_pass]
2745
	mov	cx,[current_pass]
2705
	sub	cx,[eax+16]
2746
	sub	cx,[eax+16]
2706
	jz	check_expression
2747
	jz	check_expression
2707
	jmp	symbol_undefined
2748
	jmp	symbol_undefined
2708
      symbol_predicted_undefined:
2749
      symbol_predicted_undefined:
2709
	or	byte [eax+8],40h
2750
	or	byte [eax+8],40h
2710
	and	byte [eax+8],not 80h
2751
	and	byte [eax+8],not 80h
2711
      symbol_undefined:
2752
      symbol_undefined:
2712
	xor	bl,bl
2753
	xor	bl,bl
2713
	jmp	check_expression
2754
	jmp	check_expression
2714
      expression_checked:
2755
      expression_checked:
2715
	mov	al,bl
2756
	mov	al,bl
2716
	jmp	logical_value_ok
2757
	jmp	logical_value_ok
2717
      check_for_used:
2758
      check_for_used:
2718
	lods	word [esi]
2759
	lods	word [esi]
2719
	cmp	ah,2
2760
	cmp	ah,2
2720
	jne	invalid_expression
2761
	jne	invalid_expression
2721
	lods	dword [esi]
2762
	lods	dword [esi]
2722
	cmp	eax,0Fh
2763
	cmp	eax,0Fh
2723
	jb	invalid_use_of_symbol
2764
	jb	invalid_use_of_symbol
2724
	je	reserved_word_used_as_symbol
2765
	je	reserved_word_used_as_symbol
2725
	inc	esi
2766
	inc	esi
2726
	test	byte [eax+8],8
2767
	test	byte [eax+8],8
2727
	jz	not_used
2768
	jz	not_used
2728
	mov	cx,[current_pass]
2769
	mov	cx,[current_pass]
2729
	sub	cx,[eax+18]
2770
	sub	cx,[eax+18]
2730
	jz	return_true
2771
	jz	return_true
2731
	cmp	cx,1
2772
	cmp	cx,1
2732
	ja	not_used
2773
	ja	not_used
2733
	or	byte [eax+8],10h+20h
2774
	or	byte [eax+8],10h+20h
2734
	jmp	return_true
2775
	jmp	return_true
2735
      not_used:
2776
      not_used:
2736
	or	byte [eax+8],10h
2777
	or	byte [eax+8],10h
2737
	and	byte [eax+8],not 20h
2778
	and	byte [eax+8],not 20h
2738
	jmp	return_false
2779
	jmp	return_false
2739
      given_false:
2780
      given_false:
2740
	inc	esi
2781
	inc	esi
2741
      return_false:
2782
      return_false:
2742
	xor	al,al
2783
	xor	al,al
2743
	jmp	logical_value_ok
2784
	jmp	logical_value_ok
2744
      given_true:
2785
      given_true:
2745
	inc	esi
2786
	inc	esi
2746
      return_true:
2787
      return_true:
2747
	or	al,-1
2788
	or	al,-1
2748
	jmp	logical_value_ok
2789
	jmp	logical_value_ok
2749
      logical_expression:
2790
      logical_expression:
2750
	inc	esi
2791
	lods	byte [esi]
-
 
2792
	mov	dl,[logical_value_wrapping]
-
 
2793
	push	edx
2751
	call	calculate_logical_expression
2794
	call	calculate_embedded_logical_expression
2752
	push	eax
2795
	pop	edx
-
 
2796
	mov	[logical_value_wrapping],dl
-
 
2797
	push	eax
2753
	lods	byte [esi]
2798
	lods	byte [esi]
2754
	cmp	al,'}'
2799
	cmp	al,'}'
2755
	jne	invalid_expression
2800
	jne	invalid_expression
2756
	pop	eax
2801
	pop	eax
2757
      logical_value_ok:
2802
      logical_value_ok:
2758
	pop	ebx
2803
	pop	ebx
2759
	xor	al,bl
2804
	xor	al,bl
2760
	ret
2805
	ret
2761
>
2806
>
2762
>
2807
>