Subversion Repositories Kolibri OS

Rev

Rev 205 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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