Subversion Repositories Kolibri OS

Rev

Rev 3011 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4039 heavyiron 1
 
2
 
3
; All rights reserved.
4
5
calculate_expression:
6
 
7
	mov	[value_undefined],0
8
	cmp	byte [esi],0
9
	je	get_string_value
10
	cmp	byte [esi],'.'
11
	je	convert_fp
12
      calculation_loop:
13
	lods	byte [esi]
14
	cmp	al,1
15
	je	get_byte_number
16
	cmp	al,2
17
	je	get_word_number
18
	cmp	al,4
19
	je	get_dword_number
20
	cmp	al,8
21
	je	get_qword_number
22
	cmp	al,0Fh
23
	je	value_out_of_range
24
	cmp	al,10h
25
	je	get_register
26
	cmp	al,11h
27
	je	get_label
28
	cmp	al,')'
29
	je	expression_calculated
30
	cmp	al,']'
31
	je	expression_calculated
32
	cmp	al,'!'
33
	je	invalid_expression
34
	sub	edi,14h
35
	mov	ebx,edi
36
	sub	ebx,14h
37
	cmp	al,0E0h
38
	je	calculate_rva
39
	cmp	al,0E1h
40
	je	calculate_plt
41
	cmp	al,0D0h
42
	je	calculate_not
43
	cmp	al,083h
44
	je	calculate_neg
45
	mov	dx,[ebx+8]
46
	or	dx,[edi+8]
47
	cmp	al,80h
48
	je	calculate_add
49
	cmp	al,81h
50
	je	calculate_sub
51
	mov	ah,[ebx+12]
52
	or	ah,[edi+12]
53
	jz	absolute_values_calculation
54
	call	recoverable_misuse
55
      absolute_values_calculation:
56
	cmp	al,90h
57
	je	calculate_mul
58
	cmp	al,91h
59
	je	calculate_div
60
	or	dx,dx
61
	jnz	invalid_expression
62
	cmp	al,0A0h
63
	je	calculate_mod
64
	cmp	al,0B0h
65
	je	calculate_and
66
	cmp	al,0B1h
67
	je	calculate_or
68
	cmp	al,0B2h
69
	je	calculate_xor
70
	cmp	al,0C0h
71
	je	calculate_shl
72
	cmp	al,0C1h
73
	je	calculate_shr
74
	jmp	invalid_expression
75
      expression_calculated:
76
	sub	edi,14h
77
	cmp	[value_undefined],0
78
	je	expression_value_ok
79
	xor	eax,eax
80
	mov	[edi],eax
81
	mov	[edi+4],eax
82
	mov	[edi+12],eax
83
      expression_value_ok:
84
	ret
85
      get_byte_number:
86
	xor	eax,eax
87
	lods	byte [esi]
88
	stos	dword [edi]
89
	xor	al,al
90
	stos	dword [edi]
91
      got_number:
92
	and	word [edi-8+8],0
93
	and	word [edi-8+12],0
94
	and	dword [edi-8+16],0
95
	add	edi,0Ch
96
	jmp	calculation_loop
97
      get_word_number:
98
	xor	eax,eax
99
	lods	word [esi]
100
	stos	dword [edi]
101
	xor	ax,ax
102
	stos	dword [edi]
103
	jmp	got_number
104
      get_dword_number:
105
	movs	dword [edi],[esi]
106
	xor	eax,eax
107
	stos	dword [edi]
108
	jmp	got_number
109
      get_qword_number:
110
	movs	dword [edi],[esi]
111
	movs	dword [edi],[esi]
112
	jmp	got_number
113
      get_register:
114
	mov	byte [edi+9],0
115
	and	word [edi+12],0
116
	lods	byte [esi]
117
	mov	[edi+8],al
118
	mov	byte [edi+10],1
119
	xor	eax,eax
120
	mov	[edi+16],eax
121
	stos	dword [edi]
122
	stos	dword [edi]
123
	add	edi,0Ch
124
	jmp	calculation_loop
125
      get_label:
126
	xor	eax,eax
127
	mov	[edi+8],eax
128
	mov	[edi+12],eax
129
	mov	[edi+20],eax
130
	lods	dword [esi]
131
	cmp	eax,0Fh
132
	jb	predefined_label
133
	je	reserved_word_used_as_symbol
134
	mov	ebx,eax
135
	mov	ax,[current_pass]
136
	mov	[ebx+18],ax
137
	mov	cl,[ebx+9]
138
	shr	cl,1
139
	and	cl,1
140
	neg	cl
141
	or	byte [ebx+8],8
142
	test	byte [ebx+8],1
143
	jz	label_undefined
144
	cmp	ax,[ebx+16]
145
	je	unadjusted_label
146
	test	byte [ebx+8],4
147
	jnz	label_out_of_scope
148
	test	byte [ebx+9],1
149
	jz	unadjusted_label
150
	mov	eax,[ebx]
151
	sub	eax,dword [adjustment]
152
	stos	dword [edi]
153
	mov	eax,[ebx+4]
154
	sbb	eax,dword [adjustment+4]
155
	stos	dword [edi]
156
	sbb	cl,[adjustment_sign]
157
	mov	[edi-8+13],cl
158
	mov	eax,dword [adjustment]
159
	or	al,[adjustment_sign]
160
	or	eax,dword [adjustment+4]
161
	jz	got_label
162
	or	[next_pass_needed],-1
163
	jmp	got_label
164
      unadjusted_label:
165
	mov	eax,[ebx]
166
	stos	dword [edi]
167
	mov	eax,[ebx+4]
168
	stos	dword [edi]
169
	mov	[edi-8+13],cl
170
      got_label:
171
	test	byte [ebx+9],4
172
	jnz	invalid_use_of_symbol
173
	cmp	[symbols_file],0
174
	je	label_reference_ok
175
	cmp	[next_pass_needed],0
176
	jne	label_reference_ok
177
	call	store_label_reference
178
      label_reference_ok:
179
	mov	al,[ebx+11]
180
	mov	[edi-8+12],al
181
	mov	eax,[ebx+12]
182
	mov	[edi-8+8],eax
183
	cmp	al,ah
184
	jne	labeled_registers_ok
185
	shr	eax,16
186
	add	al,ah
187
	jo	labeled_registers_ok
188
	xor	ah,ah
189
	mov	[edi-8+10],ax
190
	mov	[edi-8+9],ah
191
      labeled_registers_ok:
192
	mov	eax,[ebx+20]
193
	mov	[edi-8+16],eax
194
	add	edi,0Ch
195
	mov	al,[ebx+10]
196
	or	al,al
197
	jz	calculation_loop
198
	cmp	[size_override],-1
199
	je	calculation_loop
200
	cmp	[size_override],0
201
	je	check_size
202
	cmp	[operand_size],0
203
	jne	calculation_loop
204
	mov	[operand_size],al
205
	jmp	calculation_loop
206
      check_size:
207
	xchg	[operand_size],al
208
	or	al,al
209
	jz	calculation_loop
210
	cmp	al,[operand_size]
211
	jne	operand_sizes_do_not_match
212
	jmp	calculation_loop
213
      current_offset_label:
214
	mov	eax,[current_offset]
215
      make_current_offset_label:
216
	xor	edx,edx
217
	xor	ch,ch
218
	mov	ebp,[addressing_space]
219
	sub	eax,[ds:ebp]
220
	sbb	edx,[ds:ebp+4]
221
	sbb	ch,[ds:ebp+8]
222
	jp	current_offset_label_ok
223
	call	recoverable_overflow
224
      current_offset_label_ok:
225
	stos	dword [edi]
226
	mov	eax,edx
227
	stos	dword [edi]
228
	mov	eax,[ds:ebp+10h]
229
	stos	dword [edi]
230
	mov	cl,[ds:ebp+9]
231
	mov	[edi-12+12],cx
232
	mov	eax,[ds:ebp+14h]
233
	mov	[edi-12+16],eax
234
	add	edi,8
235
	jmp	calculation_loop
236
      org_origin_label:
237
	mov	eax,[addressing_space]
238
	mov	eax,[eax+18h]
239
	jmp	make_current_offset_label
240
      counter_label:
241
	mov	eax,[counter]
242
      make_dword_label_value:
243
	stos	dword [edi]
244
	xor	eax,eax
245
	stos	dword [edi]
246
	add	edi,0Ch
247
	jmp	calculation_loop
248
      timestamp_label:
249
	call	make_timestamp
250
      make_qword_label_value:
251
	stos	dword [edi]
252
	mov	eax,edx
253
	stos	dword [edi]
254
	add	edi,0Ch
255
	jmp	calculation_loop
256
      predefined_label:
257
	or	eax,eax
258
	jz	current_offset_label
259
	cmp	eax,1
260
	je	counter_label
261
	cmp	eax,2
262
	je	timestamp_label
263
	cmp	eax,3
264
	je	org_origin_label
265
	mov	edx,invalid_value
266
	jmp	error_undefined
267
      label_out_of_scope:
268
	mov	edx,symbol_out_of_scope
269
	jmp	error_undefined
270
      label_undefined:
271
	mov	edx,undefined_symbol
272
      error_undefined:
273
	cmp	[current_pass],1
274
	ja	undefined_value
275
      force_next_pass:
276
	or	[next_pass_needed],-1
277
      undefined_value:
278
	or	[value_undefined],-1
279
	and	word [edi+12],0
280
	xor	eax,eax
281
	stos	dword [edi]
282
	stos	dword [edi]
283
	add	edi,0Ch
284
	cmp	[error_line],0
285
	jne	calculation_loop
286
	mov	eax,[current_line]
287
	mov	[error_line],eax
288
	mov	[error],edx
289
	mov	[error_info],ebx
290
	jmp	calculation_loop
291
      calculate_add:
292
	xor	ah,ah
293
	mov	ah,[ebx+12]
294
	mov	al,[edi+12]
295
	or	al,al
296
	jz	add_values
297
	or	ah,ah
298
	jz	add_relocatable
299
	add	ah,al
300
	jnz	invalid_add
301
	mov	ecx,[edi+16]
302
	cmp	ecx,[ebx+16]
303
	je	add_values
304
      invalid_add:
305
	call	recoverable_misuse
306
	jmp	add_values
307
      add_relocatable:
308
	mov	ah,al
309
	mov	ecx,[edi+16]
310
	mov	[ebx+16],ecx
311
      add_values:
312
	mov	[ebx+12],ah
313
	mov	eax,[edi]
314
	add	[ebx],eax
315
	mov	eax,[edi+4]
316
	adc	[ebx+4],eax
317
	mov	al,[edi+13]
318
	adc	[ebx+13],al
319
	jp	add_sign_ok
320
	call	recoverable_overflow
321
      add_sign_ok:
322
	or	dx,dx
323
	jz	calculation_loop
324
	push	esi
325
	mov	esi,ebx
326
	mov	cl,[edi+10]
327
	mov	al,[edi+8]
328
	call	add_register
329
	mov	cl,[edi+11]
330
	mov	al,[edi+9]
331
	call	add_register
332
	pop	esi
333
	jmp	calculation_loop
334
      add_register:
335
	or	al,al
336
	jz	add_register_done
337
      add_register_start:
338
	cmp	[esi+8],al
339
	jne	add_in_second_slot
340
	add	[esi+10],cl
341
	jo	value_out_of_range
342
	jnz	add_register_done
343
	mov	byte [esi+8],0
344
	ret
345
      add_in_second_slot:
346
	cmp	[esi+9],al
347
	jne	create_in_first_slot
348
	add	[esi+11],cl
349
	jo	value_out_of_range
350
	jnz	add_register_done
351
	mov	byte [esi+9],0
352
	ret
353
      create_in_first_slot:
354
	cmp	byte [esi+8],0
355
	jne	create_in_second_slot
356
	mov	[esi+8],al
357
	mov	[esi+10],cl
358
	ret
359
      create_in_second_slot:
360
	cmp	byte [esi+9],0
361
	jne	invalid_expression
362
	mov	[esi+9],al
363
	mov	[esi+11],cl
364
      add_register_done:
365
	ret
366
      out_of_range:
367
	jmp	calculation_loop
368
      calculate_sub:
369
	xor	ah,ah
370
	mov	ah,[ebx+12]
371
	mov	al,[edi+12]
372
	or	al,al
373
	jz	sub_values
374
	or	ah,ah
375
	jz	negate_relocatable
376
	cmp	al,ah
377
	jne	invalid_sub
378
	xor	ah,ah
379
	mov	ecx,[edi+16]
380
	cmp	ecx,[ebx+16]
381
	je	sub_values
382
      invalid_sub:
383
	call	recoverable_misuse
384
	jmp	sub_values
385
      negate_relocatable:
386
	neg	al
387
	mov	ah,al
388
	mov	ecx,[edi+16]
389
	mov	[ebx+16],ecx
390
      sub_values:
391
	mov	[ebx+12],ah
392
	mov	eax,[edi]
393
	sub	[ebx],eax
394
	mov	eax,[edi+4]
395
	sbb	[ebx+4],eax
396
	mov	al,[edi+13]
397
	sbb	[ebx+13],al
398
	jp	sub_sign_ok
399
	cmp	[error_line],0
400
	jne	sub_sign_ok
401
	call	recoverable_overflow
402
      sub_sign_ok:
403
	or	dx,dx
404
	jz	calculation_loop
405
	push	esi
406
	mov	esi,ebx
407
	mov	cl,[edi+10]
408
	mov	al,[edi+8]
409
	call	sub_register
410
	mov	cl,[edi+11]
411
	mov	al,[edi+9]
412
	call	sub_register
413
	pop	esi
414
	jmp	calculation_loop
415
      sub_register:
416
	or	al,al
417
	jz	add_register_done
418
	neg	cl
419
	jo	value_out_of_range
420
	jmp	add_register_start
421
      calculate_mul:
422
	or	dx,dx
423
	jz	mul_start
424
	cmp	word [ebx+8],0
425
	jne	mul_start
426
	xor	ecx,ecx
427
      swap_values:
428
	mov	eax,[ebx+ecx]
429
	xchg	eax,[edi+ecx]
430
	mov	[ebx+ecx],eax
431
	add	ecx,4
432
	cmp	ecx,16
433
	jb	swap_values
434
      mul_start:
435
	push	esi edx
436
	mov	esi,ebx
437
	xor	bl,bl
438
	cmp	byte [esi+13],0
439
	je	mul_first_sign_ok
440
	xor	bl,-1
441
	mov	eax,[esi]
442
	mov	edx,[esi+4]
443
	not	eax
444
	not	edx
445
	add	eax,1
446
	adc	edx,0
447
	mov	[esi],eax
448
	mov	[esi+4],edx
449
	or	eax,edx
450
	jz	mul_overflow
451
      mul_first_sign_ok:
452
	cmp	byte [edi+13],0
453
	je	mul_second_sign_ok
454
	xor	bl,-1
455
	cmp	byte [esi+8],0
456
	je	mul_first_register_sign_ok
457
	neg	byte [esi+10]
458
	jo	invalid_expression
459
      mul_first_register_sign_ok:
460
	cmp	byte [esi+9],0
461
	je	mul_second_register_sign_ok
462
	neg	byte [esi+11]
463
	jo	invalid_expression
464
      mul_second_register_sign_ok:
465
	mov	eax,[edi]
466
	mov	edx,[edi+4]
467
	not	eax
468
	not	edx
469
	add	eax,1
470
	adc	edx,0
471
	mov	[edi],eax
472
	mov	[edi+4],edx
473
	or	eax,edx
474
	jz	mul_overflow
475
      mul_second_sign_ok:
476
	cmp	dword [esi+4],0
477
	jz	mul_numbers
478
	cmp	dword [edi+4],0
479
	jz	mul_numbers
480
	jnz	mul_overflow
481
      mul_numbers:
482
	mov	eax,[esi+4]
483
	mul	dword [edi]
484
	or	edx,edx
485
	jnz	mul_overflow
486
	mov	ecx,eax
487
	mov	eax,[esi]
488
	mul	dword [edi+4]
489
	or	edx,edx
490
	jnz	mul_overflow
491
	add	ecx,eax
492
	jc	mul_overflow
493
	mov	eax,[esi]
494
	mul	dword [edi]
495
	add	edx,ecx
496
	jc	mul_overflow
497
	mov	[esi],eax
498
	mov	[esi+4],edx
499
	or	bl,bl
500
	jz	mul_ok
501
	not	eax
502
	not	edx
503
	add	eax,1
504
	adc	edx,0
505
	mov	[esi],eax
506
	mov	[esi+4],edx
507
	or	eax,edx
508
	jnz	mul_ok
509
	not	bl
510
      mul_ok:
511
	mov	[esi+13],bl
512
	pop	edx
513
	or	dx,dx
514
	jz	mul_calculated
515
	cmp	word [edi+8],0
516
	jne	invalid_value
517
	cmp	byte [esi+8],0
518
	je	mul_first_register_ok
519
	call	get_byte_scale
520
	imul	byte [esi+10]
521
	mov	dl,ah
522
	cbw
523
	cmp	ah,dl
524
	jne	value_out_of_range
525
	mov	[esi+10],al
526
	or	al,al
527
	jnz	mul_first_register_ok
528
	mov	[esi+8],al
529
      mul_first_register_ok:
530
	cmp	byte [esi+9],0
531
	je	mul_calculated
532
	call	get_byte_scale
533
	imul	byte [esi+11]
534
	mov	dl,ah
535
	cbw
536
	cmp	ah,dl
537
	jne	value_out_of_range
538
	mov	[esi+11],al
539
	or	al,al
540
	jnz	mul_calculated
541
	mov	[esi+9],al
542
      mul_calculated:
543
	pop	esi
544
	jmp	calculation_loop
545
      mul_overflow:
546
	pop	edx esi
547
	call	recoverable_overflow
548
	jmp	calculation_loop
549
      get_byte_scale:
550
	mov	al,[edi]
551
	cbw
552
	cwde
553
	cdq
554
	cmp	edx,[edi+4]
555
	jne	value_out_of_range
556
	cmp	eax,[edi]
557
	jne	value_out_of_range
558
	ret
559
      calculate_div:
560
	push	esi edx
561
	mov	esi,ebx
562
	call	div_64
563
	pop	edx
564
	or	dx,dx
565
	jz	div_calculated
566
	cmp	byte [esi+8],0
567
	je	div_first_register_ok
568
	call	get_byte_scale
569
	or	al,al
570
	jz	value_out_of_range
571
	mov	al,[esi+10]
572
	cbw
573
	idiv	byte [edi]
574
	or	ah,ah
575
	jnz	invalid_use_of_symbol
576
	mov	[esi+10],al
577
      div_first_register_ok:
578
	cmp	byte [esi+9],0
579
	je	div_calculated
580
	call	get_byte_scale
581
	or	al,al
582
	jz	value_out_of_range
583
	mov	al,[esi+11]
584
	cbw
585
	idiv	byte [edi]
586
	or	ah,ah
587
	jnz	invalid_use_of_symbol
588
	mov	[esi+11],al
589
      div_calculated:
590
	pop	esi
591
	jmp	calculation_loop
592
      calculate_mod:
593
	push	esi
594
	mov	esi,ebx
595
	call	div_64
596
	mov	[esi],eax
597
	mov	[esi+4],edx
598
	mov	[esi+13],bh
599
	pop	esi
600
	jmp	calculation_loop
601
      calculate_and:
602
	mov	eax,[edi]
603
	mov	edx,[edi+4]
604
	mov	cl,[edi+13]
605
	and	[ebx],eax
606
	and	[ebx+4],edx
607
	and	[ebx+13],cl
608
	jmp	calculation_loop
609
      calculate_or:
610
	mov	eax,[edi]
611
	mov	edx,[edi+4]
612
	mov	cl,[edi+13]
613
	or	[ebx],eax
614
	or	[ebx+4],edx
615
	or	[ebx+13],cl
616
	jmp	calculation_loop
617
      calculate_xor:
618
	mov	eax,[edi]
619
	mov	edx,[edi+4]
620
	mov	cl,[edi+13]
621
	xor	[ebx],eax
622
	xor	[ebx+4],edx
623
	xor	[ebx+13],cl
624
	jz	calculation_loop
625
	or	cl,cl
626
	jz	xor_size_check
627
	xor	eax,[ebx]
628
	xor	edx,[ebx+4]
629
      xor_size_check:
630
	mov	cl,[value_size]
631
	cmp	cl,1
632
	je	xor_byte_result
633
	cmp	cl,2
634
	je	xor_word_result
635
	cmp	cl,4
636
	je	xor_dword_result
637
	cmp	cl,6
638
	je	xor_pword_result
639
	cmp	cl,8
640
	jne	calculation_loop
641
	xor	edx,[ebx+4]
642
	js	xor_result_truncated
643
	jmp	calculation_loop
644
      xor_pword_result:
645
	test	edx,0FFFF0000h
646
	jnz	calculation_loop
647
	cmp	word [ebx+6],-1
648
	jne	calculation_loop
649
	xor	dx,[ebx+4]
650
	jns	calculation_loop
651
	not	word [ebx+6]
652
	jmp	xor_result_truncated
653
      xor_dword_result:
654
	test	edx,edx
655
	jnz	calculation_loop
656
	cmp	dword [ebx+4],-1
657
	jne	calculation_loop
658
	xor	eax,[ebx]
659
	jns	calculation_loop
660
	not	dword [ebx+4]
661
	jmp	xor_result_truncated
662
      xor_word_result:
663
	test	edx,edx
664
	jnz	calculation_loop
665
	test	eax,0FFFF0000h
666
	jnz	calculation_loop
667
	cmp	dword [ebx+4],-1
668
	jne	calculation_loop
669
	cmp	word [ebx+2],-1
670
	jne	calculation_loop
671
	xor	ax,[ebx]
672
	jns	calculation_loop
673
	not	dword [ebx+4]
674
	not	word [ebx+2]
675
	jmp	xor_result_truncated
676
      xor_byte_result:
677
	test	edx,edx
678
	jnz	calculation_loop
679
	test	eax,0FFFFFF00h
680
	jnz	calculation_loop
681
	cmp	dword [ebx+4],-1
682
	jne	calculation_loop
683
	cmp	word [ebx+2],-1
684
	jne	calculation_loop
685
	cmp	byte [ebx+1],-1
686
	jne	calculation_loop
687
	xor	al,[ebx]
688
	jns	calculation_loop
689
	not	dword [ebx+4]
690
	not	word [ebx+2]
691
	not	byte [ebx+1]
692
      xor_result_truncated:
693
	mov	byte [ebx+13],0
694
	jmp	calculation_loop
695
      shr_negative:
696
	mov	byte [edi+13],0
697
	not	dword [edi]
698
	not	dword [edi+4]
699
	add	dword [edi],1
700
	adc	dword [edi+4],0
701
	jc	shl_over
702
      calculate_shl:
703
	cmp	byte [edi+13],0
704
	jne	shl_negative
705
	mov	edx,[ebx+4]
706
	mov	eax,[ebx]
707
	cmp	dword [edi+4],0
708
	jne	shl_over
709
	movsx	ecx,byte [ebx+13]
710
	xchg	ecx,[edi]
711
	cmp	ecx,64
712
	je	shl_max
713
	ja	shl_over
714
	cmp	ecx,32
715
	jae	shl_high
716
	shld	[edi],edx,cl
717
	shld	edx,eax,cl
718
	shl	eax,cl
719
	mov	[ebx],eax
720
	mov	[ebx+4],edx
721
	jmp	shl_done
722
      shl_over:
723
	cmp	byte [ebx+13],0
724
	jne	shl_overflow
725
      shl_max:
726
	movsx	ecx,byte [ebx+13]
727
	cmp	eax,ecx
728
	jne	shl_overflow
729
	cmp	edx,ecx
730
	jne	shl_overflow
731
	xor	eax,eax
732
	mov	[ebx],eax
733
	mov	[ebx+4],eax
734
	jmp	calculation_loop
735
      shl_high:
736
	sub	cl,32
737
	shld	[edi],edx,cl
738
	shld	edx,eax,cl
739
	shl	eax,cl
740
	mov	[ebx+4],eax
741
	and	dword [ebx],0
742
	cmp	edx,[edi]
743
	jne	shl_overflow
744
      shl_done:
745
	movsx	eax,byte [ebx+13]
746
	cmp	eax,[edi]
747
	je	calculation_loop
748
      shl_overflow:
749
	call	recoverable_overflow
750
	jmp	calculation_loop
751
      shl_negative:
752
	mov	byte [edi+13],0
753
	not	dword [edi]
754
	not	dword [edi+4]
755
	add	dword [edi],1
756
	adc	dword [edi+4],0
757
	jnc	calculate_shr
758
	dec	dword [edi+4]
759
      calculate_shr:
760
	cmp	byte [edi+13],0
761
	jne	shr_negative
762
	cmp	byte [ebx+13],0
763
	je	do_shr
764
	mov	al,[value_size]
765
	cmp	al,1
766
	je	shr_negative_byte
767
	cmp	al,2
768
	je	shr_negative_word
769
	cmp	al,4
770
	je	shr_negative_dword
771
	cmp	al,6
772
	je	shr_negative_pword
773
	cmp	al,8
774
	jne	do_shr
775
      shr_negative_qword:
776
	test	byte [ebx+7],80h
777
	jz	do_shr
778
      shr_truncated:
779
	mov	byte [ebx+13],0
780
      do_shr:
781
	mov	edx,[ebx+4]
782
	mov	eax,[ebx]
783
	cmp	dword [edi+4],0
784
	jne	shr_over
785
	mov	ecx,[edi]
786
	cmp	ecx,64
787
	jae	shr_over
788
	push	esi
789
	movsx	esi,byte [ebx+13]
790
	cmp	ecx,32
791
	jae	shr_high
792
	shrd	eax,edx,cl
793
	shrd	edx,esi,cl
794
	mov	[ebx],eax
795
	mov	[ebx+4],edx
796
	pop	esi
797
	jmp	calculation_loop
798
      shr_high:
799
	sub	cl,32
800
	shrd	edx,esi,cl
801
	mov	[ebx],edx
802
	mov	[ebx+4],esi
803
	pop	esi
804
	jmp	calculation_loop
805
      shr_over:
806
	movsx	eax,byte [ebx+13]
807
	mov	dword [ebx],eax
808
	mov	dword [ebx+4],eax
809
	jmp	calculation_loop
810
      shr_negative_byte:
811
	cmp	dword [ebx+4],-1
812
	jne	do_shr
813
	cmp	word [ebx+2],-1
814
	jne	do_shr
815
	cmp	byte [ebx+1],-1
816
	jne	do_shr
817
	test	byte [ebx],80h
818
	jz	do_shr
819
	not	dword [ebx+4]
820
	not	word [ebx+2]
821
	not	byte [ebx+1]
822
	jmp	shr_truncated
823
      shr_negative_word:
824
	cmp	dword [ebx+4],-1
825
	jne	do_shr
826
	cmp	word [ebx+2],-1
827
	jne	do_shr
828
	test	byte [ebx+1],80h
829
	jz	do_shr
830
	not	dword [ebx+4]
831
	not	word [ebx+2]
832
	jmp	shr_truncated
833
      shr_negative_dword:
834
	cmp	dword [ebx+4],-1
835
	jne	do_shr
836
	test	byte [ebx+3],80h
837
	jz	do_shr
838
	not	dword [ebx+4]
839
	jmp	shr_truncated
840
      shr_negative_pword:
841
	cmp	word [ebx+6],-1
842
	jne	do_shr
843
	test	byte [ebx+5],80h
844
	jz	do_shr
845
	not	word [ebx+6]
846
	jmp	shr_truncated
847
      calculate_not:
848
	cmp	word [edi+8],0
849
	jne	invalid_expression
850
	cmp	byte [edi+12],0
851
	je	not_ok
852
	call	recoverable_misuse
853
      not_ok:
854
	mov	al,[value_size]
855
	cmp	al,1
856
	je	not_byte
857
	cmp	al,2
858
	je	not_word
859
	cmp	al,4
860
	je	not_dword
861
	cmp	al,6
862
	je	not_pword
863
	cmp	al,8
864
	je	not_qword
865
	not	dword [edi]
866
	not	dword [edi+4]
867
	not	byte [edi+13]
868
	add	edi,14h
869
	jmp	calculation_loop
870
      not_qword:
871
	not	dword [edi]
872
	not	dword [edi+4]
873
      finish_not:
874
	mov	byte [edi+13],0
875
	add	edi,14h
876
	jmp	calculation_loop
877
      not_byte:
878
	cmp	dword [edi+4],0
879
	jne	not_qword
880
	cmp	word [edi+2],0
881
	jne	not_qword
882
	cmp	byte [edi+1],0
883
	jne	not_qword
884
	not	byte [edi]
885
	jmp	finish_not
886
      not_word:
887
	cmp	dword [edi+4],0
888
	jne	not_qword
889
	cmp	word [edi+2],0
890
	jne	not_qword
891
	not	word [edi]
892
	jmp	finish_not
893
      not_dword:
894
	cmp	dword [edi+4],0
895
	jne	not_qword
896
	not	dword [edi]
897
	jmp	finish_not
898
      not_pword:
899
	cmp	word [edi+6],0
900
	jne	not_qword
901
	not	word [edi+4]
902
	not	dword [edi]
903
	jmp	finish_not
904
      calculate_neg:
905
	cmp	byte [edi+8],0
906
	je	neg_first_register_ok
907
	neg	byte [edi+10]
908
	jo	invalid_expression
909
      neg_first_register_ok:
910
	cmp	byte [edi+9],0
911
	je	neg_second_register_ok
912
	neg	byte [edi+11]
913
	jo	invalid_expression
914
      neg_second_register_ok:
915
	neg	byte [edi+12]
916
	xor	eax,eax
917
	xor	edx,edx
918
	xor	cl,cl
919
	xchg	eax,[edi]
920
	xchg	edx,[edi+4]
921
	xchg	cl,[edi+13]
922
	sub	[edi],eax
923
	sbb	[edi+4],edx
924
	sbb	[edi+13],cl
925
	jp	neg_sign_ok
926
	call	recoverable_overflow
927
      neg_sign_ok:
928
	add	edi,14h
929
	jmp	calculation_loop
930
      calculate_rva:
931
	cmp	word [edi+8],0
932
	jne	invalid_expression
933
	mov	al,[output_format]
934
	cmp	al,5
935
	je	calculate_gotoff
936
	cmp	al,4
937
	je	calculate_coff_rva
938
	cmp	al,3
939
	jne	invalid_expression
940
	test	[format_flags],8
941
	jnz	pe64_rva
942
	mov	al,2
943
	bt	[resolver_flags],0
944
	jc	rva_type_ok
945
	xor	al,al
946
      rva_type_ok:
947
	cmp	byte [edi+12],al
948
	je	rva_ok
949
	call	recoverable_misuse
950
      rva_ok:
951
	mov	byte [edi+12],0
952
	mov	eax,[code_start]
953
	mov	eax,[eax+34h]
954
	xor	edx,edx
955
      finish_rva:
956
	sub	[edi],eax
957
	sbb	[edi+4],edx
958
	sbb	byte [edi+13],0
959
	jp	rva_finished
960
	call	recoverable_overflow
961
      rva_finished:
962
	add	edi,14h
963
	jmp	calculation_loop
964
      pe64_rva:
965
	mov	al,4
966
	bt	[resolver_flags],0
967
	jc	pe64_rva_type_ok
968
	xor	al,al
969
      pe64_rva_type_ok:
970
	cmp	byte [edi+12],al
971
	je	pe64_rva_ok
972
	call	recoverable_misuse
973
      pe64_rva_ok:
974
	mov	byte [edi+12],0
975
	mov	eax,[code_start]
976
	mov	edx,[eax+34h]
977
	mov	eax,[eax+30h]
978
	jmp	finish_rva
979
      calculate_gotoff:
980
	test	[format_flags],8+1
981
	jnz	invalid_expression
982
      calculate_coff_rva:
983
	mov	dl,5
984
	cmp	byte [edi+12],2
985
	je	change_value_type
986
      incorrect_change_of_value_type:
987
	call	recoverable_misuse
988
      change_value_type:
989
	mov	byte [edi+12],dl
990
	add	edi,14h
991
	jmp	calculation_loop
992
      calculate_plt:
993
	cmp	word [edi+8],0
994
	jne	invalid_expression
995
	cmp	[output_format],5
996
	jne	invalid_expression
997
	test	[format_flags],1
998
	jnz	invalid_expression
999
	mov	dl,6
1000
	mov	dh,2
1001
	test	[format_flags],8
1002
	jz	check_value_for_plt
1003
	mov	dh,4
1004
      check_value_for_plt:
1005
	mov	eax,[edi]
1006
	or	eax,[edi+4]
1007
	jnz	incorrect_change_of_value_type
1008
	cmp	byte [edi+12],dh
1009
	jne	incorrect_change_of_value_type
1010
	mov	eax,[edi+16]
1011
	cmp	byte [eax],80h
1012
	jne	incorrect_change_of_value_type
1013
	jmp	change_value_type
1014
      div_64:
1015
	xor	ebx,ebx
1016
	cmp	dword [edi],0
1017
	jne	divider_ok
1018
	cmp	dword [edi+4],0
1019
	jne	divider_ok
1020
	cmp	[next_pass_needed],0
1021
	je	value_out_of_range
1022
	jmp	div_done
1023
      divider_ok:
1024
	cmp	byte [esi+13],0
1025
	je	div_first_sign_ok
1026
	mov	eax,[esi]
1027
	mov	edx,[esi+4]
1028
	not	eax
1029
	not	edx
1030
	add	eax,1
1031
	adc	edx,0
1032
	mov	[esi],eax
1033
	mov	[esi+4],edx
1034
	or	eax,edx
1035
	jz	value_out_of_range
1036
	xor	bx,-1
1037
      div_first_sign_ok:
1038
	cmp	byte [edi+13],0
1039
	je	div_second_sign_ok
1040
	mov	eax,[edi]
1041
	mov	edx,[edi+4]
1042
	not	eax
1043
	not	edx
1044
	add	eax,1
1045
	adc	edx,0
1046
	mov	[edi],eax
1047
	mov	[edi+4],edx
1048
	or	eax,edx
1049
	jz	value_out_of_range
1050
	xor	bl,-1
1051
      div_second_sign_ok:
1052
	cmp	dword [edi+4],0
1053
	jne	div_high
1054
	mov	ecx,[edi]
1055
	mov	eax,[esi+4]
1056
	xor	edx,edx
1057
	div	ecx
1058
	mov	[esi+4],eax
1059
	mov	eax,[esi]
1060
	div	ecx
1061
	mov	[esi],eax
1062
	mov	eax,edx
1063
	xor	edx,edx
1064
	jmp	div_done
1065
      div_high:
1066
	push	ebx
1067
	mov	eax,[esi+4]
1068
	xor	edx,edx
1069
	div	dword [edi+4]
1070
	mov	ebx,[esi]
1071
	mov	[esi],eax
1072
	and	dword [esi+4],0
1073
	mov	ecx,edx
1074
	mul	dword [edi]
1075
      div_high_loop:
1076
	cmp	ecx,edx
1077
	ja	div_high_done
1078
	jb	div_high_large_correction
1079
	cmp	ebx,eax
1080
	jae	div_high_done
1081
      div_high_correction:
1082
	dec	dword [esi]
1083
	sub	eax,[edi]
1084
	sbb	edx,[edi+4]
1085
	jnc	div_high_loop
1086
      div_high_done:
1087
	sub	ebx,eax
1088
	sbb	ecx,edx
1089
	mov	edx,ecx
1090
	mov	eax,ebx
1091
	pop	ebx
1092
	jmp	div_done
1093
      div_high_large_correction:
1094
	push	eax edx
1095
	mov	eax,edx
1096
	sub	eax,ecx
1097
	xor	edx,edx
1098
	div	dword [edi+4]
1099
	shr	eax,1
1100
	jz	div_high_small_correction
1101
	sub	[esi],eax
1102
	push	eax
1103
	mul	dword [edi+4]
1104
	sub	dword [esp+4],eax
1105
	pop	eax
1106
	mul	dword [edi]
1107
	sub	dword [esp+4],eax
1108
	sbb	dword [esp],edx
1109
	pop	edx eax
1110
	jmp	div_high_loop
1111
      div_high_small_correction:
1112
	pop	edx eax
1113
	jmp	div_high_correction
1114
      div_done:
1115
	or	bh,bh
1116
	jz	remainder_ok
1117
	not	eax
1118
	not	edx
1119
	add	eax,1
1120
	adc	edx,0
1121
	mov	ecx,eax
1122
	or	ecx,edx
1123
	jnz	remainder_ok
1124
	not	bh
1125
      remainder_ok:
1126
	or	bl,bl
1127
	jz	div_ok
1128
	not	dword [esi]
1129
	not	dword [esi+4]
1130
	add	dword [esi],1
1131
	adc	dword [esi+4],0
1132
	mov	ecx,[esi]
1133
	or	ecx,[esi+4]
1134
	jnz	div_ok
1135
	not	bl
1136
      div_ok:
1137
	mov	[esi+13],bl
1138
	ret
1139
      store_label_reference:
1140
	mov	eax,[tagged_blocks]
1141
	mov	dword [eax-4],2
1142
	mov	dword [eax-8],4
1143
	sub	eax,8+4
1144
	cmp	eax,edi
1145
	jbe	out_of_memory
1146
	mov	[tagged_blocks],eax
1147
	mov	[eax],ebx
1148
	ret
1149
      convert_fp:
1150
	inc	esi
1151
	and	word [edi+8],0
1152
	and	word [edi+12],0
1153
	mov	al,[value_size]
1154
	cmp	al,2
1155
	je	convert_fp_word
1156
	cmp	al,4
1157
	je	convert_fp_dword
1158
	test	al,not 8
1159
	jnz	invalid_value
1160
      convert_fp_qword:
1161
	xor	eax,eax
1162
	xor	edx,edx
1163
	cmp	word [esi+8],8000h
1164
	je	fp_qword_store
1165
	mov	bx,[esi+8]
1166
	mov	eax,[esi]
1167
	mov	edx,[esi+4]
1168
	add	eax,eax
1169
	adc	edx,edx
1170
	mov	ecx,edx
1171
	shr	edx,12
1172
	shrd	eax,ecx,12
1173
	jnc	fp_qword_ok
1174
	add	eax,1
1175
	adc	edx,0
1176
	bt	edx,20
1177
	jnc	fp_qword_ok
1178
	and	edx,1 shl 20 - 1
1179
	inc	bx
1180
	shr	edx,1
1181
	rcr	eax,1
1182
      fp_qword_ok:
1183
	add	bx,3FFh
1184
	cmp	bx,7FFh
1185
	jge	value_out_of_range
1186
	cmp	bx,0
1187
	jg	fp_qword_exp_ok
1188
	or	edx,1 shl 20
1189
	mov	cx,bx
1190
	neg	cx
1191
	inc	cx
1192
	cmp	cx,52
1193
	ja	value_out_of_range
1194
	cmp	cx,32
1195
	jbe	fp_qword_small_shift
1196
	sub	cx,32
1197
	mov	eax,edx
1198
	xor	edx,edx
1199
	shr	eax,cl
1200
	jmp	fp_qword_shift_done
1201
      fp_qword_small_shift:
1202
	mov	ebx,edx
1203
	shr	edx,cl
1204
	shrd	eax,ebx,cl
1205
      fp_qword_shift_done:
1206
	mov	bx,0
1207
	jnc	fp_qword_exp_ok
1208
	add	eax,1
1209
	adc	edx,0
1210
	test	edx,1 shl 20
1211
	jz	fp_qword_exp_ok
1212
	and	edx,1 shl 20 - 1
1213
	inc	bx
1214
      fp_qword_exp_ok:
1215
	shl	ebx,20
1216
	or	edx,ebx
1217
      fp_qword_store:
1218
	mov	bl,[esi+11]
1219
	shl	ebx,31
1220
	or	edx,ebx
1221
	mov	[edi],eax
1222
	mov	[edi+4],edx
1223
	add	esi,13
1224
	ret
1225
      convert_fp_word:
1226
	xor	eax,eax
1227
	cmp	word [esi+8],8000h
1228
	je	fp_word_store
1229
	mov	bx,[esi+8]
1230
	mov	ax,[esi+6]
1231
	shl	ax,1
1232
	shr	ax,6
1233
	jnc	fp_word_ok
1234
	inc	ax
1235
	bt	ax,10
1236
	jnc	fp_word_ok
1237
	and	ax,1 shl 10 - 1
1238
	inc	bx
1239
	shr	ax,1
1240
      fp_word_ok:
1241
	add	bx,0Fh
1242
	cmp	bx,01Fh
1243
	jge	value_out_of_range
1244
	cmp	bx,0
1245
	jg	fp_word_exp_ok
1246
	or	ax,1 shl 10
1247
	mov	cx,bx
1248
	neg	cx
1249
	inc	cx
1250
	cmp	cx,10
1251
	ja	value_out_of_range
1252
	xor	bx,bx
1253
	shr	ax,cl
1254
	jnc	fp_word_exp_ok
1255
	inc	ax
1256
	test	ax,1 shl 10
1257
	jz	fp_word_exp_ok
1258
	and	ax,1 shl 10 - 1
1259
	inc	bx
1260
      fp_word_exp_ok:
1261
	shl	bx,10
1262
	or	ax,bx
1263
      fp_word_store:
1264
	mov	bl,[esi+11]
1265
	shl	bx,15
1266
	or	ax,bx
1267
	mov	[edi],eax
1268
	xor	eax,eax
1269
	mov	[edi+4],eax
1270
	add	esi,13
1271
	ret
1272
      convert_fp_dword:
1273
	xor	eax,eax
1274
	cmp	word [esi+8],8000h
1275
	je	fp_dword_store
1276
	mov	bx,[esi+8]
1277
	mov	eax,[esi+4]
1278
	shl	eax,1
1279
	shr	eax,9
1280
	jnc	fp_dword_ok
1281
	inc	eax
1282
	bt	eax,23
1283
	jnc	fp_dword_ok
1284
	and	eax,1 shl 23 - 1
1285
	inc	bx
1286
	shr	eax,1
1287
      fp_dword_ok:
1288
	add	bx,7Fh
1289
	cmp	bx,0FFh
1290
	jge	value_out_of_range
1291
	cmp	bx,0
1292
	jg	fp_dword_exp_ok
1293
	or	eax,1 shl 23
1294
	mov	cx,bx
1295
	neg	cx
1296
	inc	cx
1297
	cmp	cx,23
1298
	ja	value_out_of_range
1299
	xor	bx,bx
1300
	shr	eax,cl
1301
	jnc	fp_dword_exp_ok
1302
	inc	eax
1303
	test	eax,1 shl 23
1304
	jz	fp_dword_exp_ok
1305
	and	eax,1 shl 23 - 1
1306
	inc	bx
1307
      fp_dword_exp_ok:
1308
	shl	ebx,23
1309
	or	eax,ebx
1310
      fp_dword_store:
1311
	mov	bl,[esi+11]
1312
	shl	ebx,31
1313
	or	eax,ebx
1314
	mov	[edi],eax
1315
	xor	eax,eax
1316
	mov	[edi+4],eax
1317
	add	esi,13
1318
	ret
1319
      get_string_value:
1320
	inc	esi
1321
	lods	dword [esi]
1322
	mov	ecx,eax
1323
	cmp	ecx,8
1324
	ja	value_out_of_range
1325
	mov	edx,edi
1326
	xor	eax,eax
1327
	stos	dword [edi]
1328
	stos	dword [edi]
1329
	mov	edi,edx
1330
	rep	movs byte [edi],[esi]
1331
	mov	edi,edx
1332
	inc	esi
1333
	and	word [edi+8],0
1334
	and	word [edi+12],0
1335
	ret
1336
1337
get_byte_value:
1338
 
1339
	mov	[size_override],-1
1340
	call	calculate_value
1341
	or	al,al
1342
	jz	check_byte_value
1343
	call	recoverable_misuse
1344
      check_byte_value:
1345
	mov	eax,[edi]
1346
	mov	edx,[edi+4]
1347
	cmp	byte [edi+13],0
1348
	je	byte_positive
1349
	cmp	edx,-1
1350
	jne	range_exceeded
1351
	cmp	eax,-80h
1352
	jb	range_exceeded
1353
	ret
1354
      byte_positive:
1355
	test	edx,edx
1356
	jnz	range_exceeded
1357
	cmp	eax,100h
1358
	jae	range_exceeded
1359
      return_byte_value:
1360
	ret
1361
      range_exceeded:
1362
	xor	eax,eax
1363
	xor	edx,edx
1364
      recoverable_overflow:
1365
	cmp	[error_line],0
1366
	jne	ignore_overflow
1367
	push	[current_line]
1368
	pop	[error_line]
1369
	mov	[error],value_out_of_range
1370
	or	[value_undefined],-1
1371
      ignore_overflow:
1372
	ret
1373
      recoverable_misuse:
1374
	cmp	[error_line],0
1375
	jne	ignore_misuse
1376
	push	[current_line]
1377
	pop	[error_line]
1378
	mov	[error],invalid_use_of_symbol
1379
      ignore_misuse:
1380
	ret
1381
get_word_value:
1382
	mov	[value_size],2
1383
	mov	[size_override],-1
1384
	call	calculate_value
1385
	cmp	al,2
1386
	jb	check_word_value
1387
	call	recoverable_misuse
1388
      check_word_value:
1389
	mov	eax,[edi]
1390
	mov	edx,[edi+4]
1391
	cmp	byte [edi+13],0
1392
	je	word_positive
1393
	cmp	edx,-1
1394
	jne	range_exceeded
1395
	cmp	eax,-8000h
1396
	jb	range_exceeded
1397
	ret
1398
      word_positive:
1399
	test	edx,edx
1400
	jnz	range_exceeded
1401
	cmp	eax,10000h
1402
	jae	range_exceeded
1403
	ret
1404
get_dword_value:
1405
	mov	[value_size],4
1406
	mov	[size_override],-1
1407
	call	calculate_value
1408
	cmp	al,4
1409
	jne	check_dword_value
1410
	mov	[value_type],2
1411
	mov	eax,[edi]
1412
	cdq
1413
	cmp	edx,[edi+4]
1414
	jne	range_exceeded
1415
	mov	ecx,edx
1416
	shr	ecx,31
1417
	cmp	cl,[value_sign]
1418
	jne	range_exceeded
1419
	ret
1420
      check_dword_value:
1421
	mov	eax,[edi]
1422
	mov	edx,[edi+4]
1423
	cmp	byte [edi+13],0
1424
	je	dword_positive
1425
	cmp	edx,-1
1426
	jne	range_exceeded
1427
	bt	eax,31
1428
	jnc	range_exceeded
1429
	ret
1430
      dword_positive:
1431
	test	edx,edx
1432
	jne	range_exceeded
1433
	ret
1434
get_pword_value:
1435
	mov	[value_size],6
1436
	mov	[size_override],-1
1437
	call	calculate_value
1438
	cmp	al,4
1439
	jne	check_pword_value
1440
	call	recoverable_misuse
1441
      check_pword_value:
1442
	mov	eax,[edi]
1443
	mov	edx,[edi+4]
1444
	cmp	byte [edi+13],0
1445
	je	pword_positive
1446
	cmp	edx,-8000h
1447
	jb	range_exceeded
1448
	ret
1449
      pword_positive:
1450
	cmp	edx,10000h
1451
	jae	range_exceeded
1452
	ret
1453
get_qword_value:
1454
	mov	[value_size],8
1455
	mov	[size_override],-1
1456
	call	calculate_value
1457
      check_qword_value:
1458
	mov	eax,[edi]
1459
	mov	edx,[edi+4]
1460
	cmp	byte [edi+13],0
1461
	je	qword_positive
1462
	cmp	edx,-80000000h
1463
	jb	range_exceeded
1464
      qword_positive:
1465
	ret
1466
get_count_value:
1467
	mov	[value_size],8
1468
	mov	[size_override],-1
1469
	call	calculate_expression
1470
	cmp	word [edi+8],0
1471
	jne	invalid_value
1472
	mov	[value_sign],0
1473
	mov	al,[edi+12]
1474
	or	al,al
1475
	jz	check_count_value
1476
	call	recoverable_misuse
1477
      check_count_value:
1478
	cmp	byte [edi+13],0
1479
	jne	invalid_count_value
1480
	mov	eax,[edi]
1481
	mov	edx,[edi+4]
1482
	or	edx,edx
1483
	jnz	invalid_count_value
1484
	ret
1485
      invalid_count_value:
1486
	cmp	[error_line],0
1487
	jne	zero_count
1488
	mov	eax,[current_line]
1489
	mov	[error_line],eax
1490
	mov	[error],invalid_value
1491
      zero_count:
1492
	xor	eax,eax
1493
	ret
1494
get_value:
1495
	mov	[operand_size],0
1496
	lods	byte [esi]
1497
	call	get_size_operator
1498
	cmp	al,'('
1499
	jne	invalid_value
1500
	mov	al,[operand_size]
1501
	cmp	al,1
1502
	je	value_byte
1503
	cmp	al,2
1504
	je	value_word
1505
	cmp	al,4
1506
	je	value_dword
1507
	cmp	al,6
1508
	je	value_pword
1509
	cmp	al,8
1510
	je	value_qword
1511
	or	al,al
1512
	jnz	invalid_value
1513
	mov	[value_size],al
1514
	call	calculate_value
1515
	mov	eax,[edi]
1516
	mov	edx,[edi+4]
1517
	ret
1518
      calculate_value:
1519
	call	calculate_expression
1520
	cmp	word [edi+8],0
1521
	jne	invalid_value
1522
	mov	eax,[edi+16]
1523
	mov	[symbol_identifier],eax
1524
	mov	al,[edi+13]
1525
	mov	[value_sign],al
1526
	mov	al,[edi+12]
1527
	mov	[value_type],al
1528
	ret
1529
      value_qword:
1530
	call	get_qword_value
1531
      truncated_value:
1532
	mov	[value_sign],0
1533
	ret
1534
      value_pword:
1535
	call	get_pword_value
1536
	movzx	edx,dx
1537
	jmp	truncated_value
1538
      value_dword:
1539
	call	get_dword_value
1540
	xor	edx,edx
1541
	jmp	truncated_value
1542
      value_word:
1543
	call	get_word_value
1544
	xor	edx,edx
1545
	movzx	eax,ax
1546
	jmp	truncated_value
1547
      value_byte:
1548
	call	get_byte_value
1549
	xor	edx,edx
1550
	movzx	eax,al
1551
	jmp	truncated_value
1552
get_address_word_value:
1553
	mov	[address_size],2
1554
	mov	[value_size],2
1555
	mov	[free_address_range],0
1556
	jmp	calculate_address
1557
get_address_dword_value:
1558
	mov	[address_size],4
1559
	mov	[value_size],4
1560
	mov	[free_address_range],0
1561
	jmp	calculate_address
1562
get_address_qword_value:
1563
	mov	[address_size],8
1564
	mov	[value_size],8
1565
	mov	[free_address_range],0
1566
	jmp	calculate_address
1567
get_address_value:
1568
	mov	[address_size],0
1569
	mov	[value_size],8
1570
	or	[free_address_range],-1
1571
      calculate_address:
1572
	cmp	byte [esi],'.'
1573
	je	invalid_address
1574
	call	calculate_expression
1575
	mov	eax,[edi+16]
1576
	mov	[address_symbol],eax
1577
	mov	al,[edi+13]
1578
	mov	[address_sign],al
1579
	mov	al,[edi+12]
1580
	mov	[value_type],al
1581
	cmp	al,0
1582
	je	address_size_ok
1583
	jg	get_address_symbol_size
1584
	neg	al
1585
      get_address_symbol_size:
1586
	cmp	al,6
1587
	je	special_address_type_32bit
1588
	cmp	al,5
1589
	je	special_address_type_32bit
1590
	ja	invalid_address_type
1591
	test	al,1
1592
	jnz	invalid_address_type
1593
	shl	al,5
1594
	jmp	address_symbol_ok
1595
      invalid_address_type:
1596
	call	recoverable_misuse
1597
      special_address_type_32bit:
1598
	mov	al,40h
1599
      address_symbol_ok:
1600
	mov	ah,[address_size]
1601
	or	[address_size],al
1602
	shr	al,4
1603
	or	ah,ah
1604
	jz	address_size_ok
1605
	cmp	al,ah
1606
	je	address_size_ok
1607
	cmp	ax,0408h
1608
	je	address_sizes_mixed
1609
	cmp	ax,0804h
1610
	jne	address_sizes_do_not_agree
1611
      address_sizes_mixed:
1612
	mov	[value_type],2
1613
	mov	eax,[edi]
1614
	cdq
1615
	cmp	edx,[edi+4]
1616
	je	address_size_ok
1617
	cmp	[error_line],0
1618
	jne	address_size_ok
1619
	call	recoverable_overflow
1620
      address_size_ok:
1621
	xor	ebx,ebx
1622
	xor	ecx,ecx
1623
	mov	cl,[value_type]
1624
	shl	ecx,16
1625
	mov	ch,[address_size]
1626
	cmp	word [edi+8],0
1627
	je	check_immediate_address
1628
	mov	al,[edi+8]
1629
	mov	dl,[edi+10]
1630
	call	get_address_register
1631
	mov	al,[edi+9]
1632
	mov	dl,[edi+11]
1633
	call	get_address_register
1634
	mov	ax,bx
1635
	shr	ah,4
1636
	shr	al,4
1637
	cmp	ah,0Ch
1638
	je	check_vsib_address
1639
	cmp	ah,0Dh
1640
	je	check_vsib_address
1641
	cmp	al,0Ch
1642
	je	check_vsib_address
1643
	cmp	al,0Dh
1644
	je	check_vsib_address
1645
	or	bh,bh
1646
	jz	check_address_registers
1647
	or	bl,bl
1648
	jz	check_address_registers
1649
	cmp	al,ah
1650
	jne	invalid_address
1651
      check_address_registers:
1652
	or	al,ah
1653
	mov	ah,[address_size]
1654
	and	ah,0Fh
1655
	jz	address_registers_sizes_ok
1656
	cmp	al,ah
1657
	jne	address_sizes_do_not_match
1658
      address_registers_sizes_ok:
1659
	cmp	al,4
1660
	je	sib_allowed
1661
	cmp	al,8
1662
	je	sib_allowed
1663
	cmp	al,0Fh
1664
	je	check_ip_relative_address
1665
	cmp	cl,1
1666
	ja	invalid_address
1667
	cmp	[free_address_range],0
1668
	jne	check_qword_value
1669
	jmp	check_word_value
1670
      address_sizes_do_not_match:
1671
	cmp	al,0Fh
1672
	jne	invalid_address
1673
	mov	al,bh
1674
	and	al,0Fh
1675
	cmp	al,ah
1676
	jne	invalid_address
1677
      check_ip_relative_address:
1678
	or	bl,bl
1679
	jnz	invalid_address
1680
	cmp	bh,0F8h
1681
	je	check_rip_relative_address
1682
	cmp	bh,0F4h
1683
	jne	invalid_address
1684
	cmp	[free_address_range],0
1685
	jne	check_qword_value
1686
	jmp	check_dword_value
1687
      check_rip_relative_address:
1688
	mov	eax,[edi]
1689
	cdq
1690
	cmp	edx,[edi+4]
1691
	jne	range_exceeded
1692
	cmp	dl,[edi+13]
1693
	jne	range_exceeded
1694
	ret
1695
      get_address_register:
1696
	or	al,al
1697
	jz	address_register_ok
1698
	cmp	dl,1
1699
	jne	scaled_register
1700
	or	bh,bh
1701
	jnz	scaled_register
1702
	mov	bh,al
1703
      address_register_ok:
1704
	ret
1705
      scaled_register:
1706
	or	bl,bl
1707
	jnz	invalid_address
1708
	mov	bl,al
1709
	mov	cl,dl
1710
	jmp	address_register_ok
1711
      sib_allowed:
1712
	or	bh,bh
1713
	jnz	check_index_with_base
1714
	cmp	cl,3
1715
	je	special_index_scale
1716
	cmp	cl,5
1717
	je	special_index_scale
1718
	cmp	cl,9
1719
	je	special_index_scale
1720
	cmp	cl,2
1721
	jne	check_index_scale
1722
	cmp	bl,45h
1723
	jne	special_index_scale
1724
	cmp	[code_type],64
1725
	je	special_index_scale
1726
	cmp	[segment_register],4
1727
	jne	special_index_scale
1728
	cmp	[value_type],0
1729
	jne	check_index_scale
1730
	mov	al,[edi]
1731
	cbw
1732
	cwde
1733
	cmp	eax,[edi]
1734
	jne	check_index_scale
1735
	cdq
1736
	cmp	edx,[edi+4]
1737
	jne	check_immediate_address
1738
      special_index_scale:
1739
	mov	bh,bl
1740
	dec	cl
1741
      check_immediate_address:
1742
	cmp	[free_address_range],0
1743
	jne	check_qword_value
1744
	mov	al,[address_size]
1745
	and	al,0Fh
1746
	cmp	al,2
1747
	je	check_word_value
1748
	cmp	al,4
1749
	je	check_dword_value
1750
	cmp	al,8
1751
	je	check_qword_value
1752
	or	al,al
1753
	jnz	invalid_value
1754
	cmp	[code_type],64
1755
	jne	check_dword_value
1756
	jmp	check_qword_value
1757
      check_index_with_base:
1758
	cmp	cl,1
1759
	jne	check_index_scale
1760
	cmp	bl,44h
1761
	je	swap_base_with_index
1762
	cmp	bl,84h
1763
	je	swap_base_with_index
1764
	cmp	[code_type],64
1765
	je	check_for_rbp_base
1766
	cmp	bl,45h
1767
	jne	check_for_ebp_base
1768
	cmp	[segment_register],3
1769
	je	swap_base_with_index
1770
	jmp	check_immediate_address
1771
      check_for_ebp_base:
1772
	cmp	bh,45h
1773
	jne	check_immediate_address
1774
	cmp	[segment_register],4
1775
	jne	check_immediate_address
1776
      swap_base_with_index:
1777
	xchg	bl,bh
1778
	jmp	check_immediate_address
1779
      check_for_rbp_base:
1780
	cmp	bh,45h
1781
	je	swap_base_with_index
1782
	cmp	bh,85h
1783
	je	swap_base_with_index
1784
	jmp	check_immediate_address
1785
      check_index_scale:
1786
	test	cl,not 1111b
1787
	jnz	invalid_address
1788
	mov	al,cl
1789
	dec	al
1790
	and	al,cl
1791
	jz	check_immediate_address
1792
	jmp	invalid_address
1793
      check_vsib_address:
1794
	cmp	ah,0Ch
1795
	je	swap_vsib_registers
1796
	cmp	ah,0Dh
1797
	jne	check_vsib_base
1798
      swap_vsib_registers:
1799
	cmp	cl,1
1800
	ja	invalid_address
1801
	xchg	bl,bh
1802
	mov	cl,1
1803
      check_vsib_base:
1804
	test	bh,bh
1805
	jz	vsib_base_ok
1806
	mov	al,bh
1807
	shr	al,4
1808
	cmp	al,4
1809
	je	vsib_base_ok
1810
	cmp	[code_type],64
1811
	jne	invalid_address
1812
	cmp	al,8
1813
	jne	invalid_address
1814
      vsib_base_ok:
1815
	mov	al,bl
1816
	shr	al,4
1817
	cmp	al,0Ch
1818
	je	check_index_scale
1819
	cmp	al,0Dh
1820
	je	check_index_scale
1821
	jmp	invalid_address
1822
1823
calculate_relative_offset:
1824
 
1825
	jne	relative_offset_ok
1826
	test	bh,bh
1827
	setne	ch
1828
	cmp	bx,[ds:ebp+10h]
1829
	je	origin_registers_ok
1830
	xchg	bh,bl
1831
	xchg	ch,cl
1832
	cmp	bx,[ds:ebp+10h]
1833
	jne	invalid_value
1834
      origin_registers_ok:
1835
	cmp	cx,[ds:ebp+10h+2]
1836
	jne	invalid_value
1837
	mov	bl,[address_sign]
1838
	add	eax,[ds:ebp]
1839
	adc	edx,[ds:ebp+4]
1840
	adc	bl,[ds:ebp+8]
1841
	sub	eax,edi
1842
	sbb	edx,0
1843
	sbb	bl,0
1844
	mov	[value_sign],bl
1845
	mov	bl,[value_type]
1846
	mov	ecx,[address_symbol]
1847
	mov	[symbol_identifier],ecx
1848
	test	bl,1
1849
	jnz	relative_offset_unallowed
1850
	cmp	bl,6
1851
	je	plt_relative_offset
1852
	mov	bh,[ds:ebp+9]
1853
	cmp	bl,bh
1854
	je	set_relative_offset_type
1855
	cmp	bx,0402h
1856
	je	set_relative_offset_type
1857
      relative_offset_unallowed:
1858
	call	recoverable_misuse
1859
      set_relative_offset_type:
1860
	cmp	[value_type],0
1861
	je	relative_offset_ok
1862
	mov	[value_type],0
1863
	cmp	ecx,[ds:ebp+14h]
1864
	je	relative_offset_ok
1865
	mov	[value_type],3
1866
      relative_offset_ok:
1867
	ret
1868
      plt_relative_offset:
1869
	mov	[value_type],7
1870
	cmp	byte [ds:ebp+9],2
1871
	je	relative_offset_ok
1872
	cmp	byte [ds:ebp+9],4
1873
	jne	recoverable_misuse
1874
	ret
1875
1876
calculate_logical_expression:
1877
 
1878
  calculate_embedded_logical_expression:
1879
	mov	[logical_value_wrapping],al
1880
	call	get_logical_value
1881
      logical_loop:
1882
	cmp	byte [esi],'|'
1883
	je	logical_or
1884
	cmp	byte [esi],'&'
1885
	je	logical_and
1886
	ret
1887
      logical_or:
1888
	inc	esi
1889
	or	al,al
1890
	jnz	logical_value_already_determined
1891
	push	eax
1892
	call	get_logical_value
1893
	pop	ebx
1894
	or	al,bl
1895
	jmp	logical_loop
1896
      logical_and:
1897
	inc	esi
1898
	or	al,al
1899
	jz	logical_value_already_determined
1900
	push	eax
1901
	call	get_logical_value
1902
	pop	ebx
1903
	and	al,bl
1904
	jmp	logical_loop
1905
      logical_value_already_determined:
1906
	push	eax
1907
	call	skip_logical_value
1908
	jc	invalid_expression
1909
	pop	eax
1910
	jmp	logical_loop
1911
  get_value_for_comparison:
1912
	mov	[value_size],8
1913
	mov	[size_override],-1
1914
	lods	byte [esi]
1915
	call	calculate_expression
1916
	cmp	byte [edi+8],0
1917
	jne	first_register_size_ok
1918
	mov	byte [edi+10],0
1919
      first_register_size_ok:
1920
	cmp	byte [edi+9],0
1921
	jne	second_register_size_ok
1922
	mov	byte [edi+11],0
1923
      second_register_size_ok:
1924
	mov	eax,[edi+16]
1925
	mov	[symbol_identifier],eax
1926
	mov	al,[edi+13]
1927
	mov	[value_sign],al
1928
	mov	bl,[edi+12]
1929
	mov	eax,[edi]
1930
	mov	edx,[edi+4]
1931
	mov	ecx,[edi+8]
1932
	ret
1933
  get_logical_value:
1934
	xor	al,al
1935
      check_for_negation:
1936
	cmp	byte [esi],'~'
1937
	jne	negation_ok
1938
	inc	esi
1939
	xor	al,-1
1940
	jmp	check_for_negation
1941
      negation_ok:
1942
	push	eax
1943
	mov	al,[esi]
1944
	cmp	al,'{'
1945
	je	logical_expression
1946
	cmp	al,0FFh
1947
	je	invalid_expression
1948
	cmp	al,88h
1949
	je	check_for_defined
1950
	cmp	al,89h
1951
	je	check_for_used
1952
	cmp	al,'0'
1953
	je	given_false
1954
	cmp	al,'1'
1955
	je	given_true
1956
	cmp	al,'('
1957
	jne	invalid_value
1958
	call	get_value_for_comparison
1959
	mov	bh,[value_sign]
1960
	push	eax edx [symbol_identifier] ebx ecx
1961
	mov	al,[esi]
1962
	or	al,al
1963
	jz	logical_number
1964
	cmp	al,0Fh
1965
	je	logical_number
1966
	cmp	al,'}'
1967
	je	logical_number
1968
	cmp	al,'&'
1969
	je	logical_number
1970
	cmp	al,'|'
1971
	je	logical_number
1972
	inc	esi
1973
	mov	[compare_type],al
1974
	cmp	byte [esi],'('
1975
	jne	invalid_value
1976
	call	get_value_for_comparison
1977
	cmp	bl,[esp+4]
1978
	jne	values_not_relative
1979
	or	bl,bl
1980
	jz	check_values_registers
1981
	mov	ebx,[symbol_identifier]
1982
	cmp	ebx,[esp+8]
1983
	jne	values_not_relative
1984
      check_values_registers:
1985
	cmp	ecx,[esp]
1986
	je	values_relative
1987
	ror	ecx,16
1988
	xchg	ch,cl
1989
	ror	ecx,16
1990
	xchg	ch,cl
1991
	cmp	ecx,[esp]
1992
	je	values_relative
1993
      values_not_relative:
1994
	cmp	[compare_type],0F8h
1995
	jne	invalid_comparison
1996
	add	esp,12+8
1997
	jmp	return_false
1998
      invalid_comparison:
1999
	call	recoverable_misuse
2000
      values_relative:
2001
	pop	ebx
2002
	shl	ebx,16
2003
	mov	bx,[esp]
2004
	add	esp,8
2005
	pop	ecx ebp
2006
	cmp	[compare_type],'='
2007
	je	check_equal
2008
	cmp	[compare_type],0F1h
2009
	je	check_not_equal
2010
	cmp	[compare_type],0F8h
2011
	je	return_true
2012
	test	ebx,0FFFF0000h
2013
	jz	check_less_or_greater
2014
	call	recoverable_misuse
2015
      check_less_or_greater:
2016
	cmp	[compare_type],'>'
2017
	je	check_greater
2018
	cmp	[compare_type],'<'
2019
	je	check_less
2020
	cmp	[compare_type],0F2h
2021
	je	check_not_less
2022
	cmp	[compare_type],0F3h
2023
	je	check_not_greater
2024
	jmp	invalid_expression
2025
      check_equal:
2026
	cmp	bh,[value_sign]
2027
	jne	return_false
2028
	cmp	eax,ebp
2029
	jne	return_false
2030
	cmp	edx,ecx
2031
	jne	return_false
2032
	jmp	return_true
2033
      check_greater:
2034
	cmp	bh,[value_sign]
2035
	jg	return_true
2036
	jl	return_false
2037
	cmp	edx,ecx
2038
	jb	return_true
2039
	ja	return_false
2040
	cmp	eax,ebp
2041
	jb	return_true
2042
	jae	return_false
2043
      check_less:
2044
	cmp	bh,[value_sign]
2045
	jg	return_false
2046
	jl	return_true
2047
	cmp	edx,ecx
2048
	jb	return_false
2049
	ja	return_true
2050
	cmp	eax,ebp
2051
	jbe	return_false
2052
	ja	return_true
2053
      check_not_less:
2054
	cmp	bh,[value_sign]
2055
	jg	return_true
2056
	jl	return_false
2057
	cmp	edx,ecx
2058
	jb	return_true
2059
	ja	return_false
2060
	cmp	eax,ebp
2061
	jbe	return_true
2062
	ja	return_false
2063
      check_not_greater:
2064
	cmp	bh,[value_sign]
2065
	jg	return_false
2066
	jl	return_true
2067
	cmp	edx,ecx
2068
	jb	return_false
2069
	ja	return_true
2070
	cmp	eax,ebp
2071
	jb	return_false
2072
	jae	return_true
2073
      check_not_equal:
2074
	cmp	bh,[value_sign]
2075
	jne	return_true
2076
	cmp	eax,ebp
2077
	jne	return_true
2078
	cmp	edx,ecx
2079
	jne	return_true
2080
	jmp	return_false
2081
      logical_number:
2082
	pop	ecx ebx eax edx eax
2083
	or	bl,bl
2084
	jnz	invalid_logical_number
2085
	or	cx,cx
2086
	jz	logical_number_ok
2087
      invalid_logical_number:
2088
	call	recoverable_misuse
2089
      logical_number_ok:
2090
	test	bh,bh
2091
	jnz	return_true
2092
	or	eax,edx
2093
	jnz	return_true
2094
	jmp	return_false
2095
      check_for_defined:
2096
	or	bl,-1
2097
	lods	word [esi]
2098
	cmp	ah,'('
2099
	jne	invalid_expression
2100
      check_expression:
2101
	lods	byte [esi]
2102
	or	al,al
2103
	jz	defined_string
2104
	cmp	al,'.'
2105
	je	defined_fp_value
2106
	cmp	al,')'
2107
	je	expression_checked
2108
	cmp	al,'!'
2109
	je	invalid_expression
2110
	cmp	al,0Fh
2111
	je	check_expression
2112
	cmp	al,10h
2113
	je	defined_register
2114
	cmp	al,11h
2115
	je	check_if_symbol_defined
2116
	cmp	al,80h
2117
	jae	check_expression
2118
	movzx	eax,al
2119
	add	esi,eax
2120
	jmp	check_expression
2121
      defined_register:
2122
	inc	esi
2123
	jmp	check_expression
2124
      defined_fp_value:
2125
	add	esi,12
2126
	jmp	expression_checked
2127
      defined_string:
2128
	lods	dword [esi]
2129
	add	esi,eax
2130
	inc	esi
2131
	jmp	expression_checked
2132
      check_if_symbol_defined:
2133
	lods	dword [esi]
2134
	cmp	eax,-1
2135
	je	invalid_expression
2136
	cmp	eax,0Fh
2137
	jb	check_expression
2138
	je	reserved_word_used_as_symbol
2139
	test	byte [eax+8],4
2140
	jnz	no_prediction
2141
	test	byte [eax+8],1
2142
	jz	symbol_predicted_undefined
2143
	mov	cx,[current_pass]
2144
	sub	cx,[eax+16]
2145
	jz	check_expression
2146
	cmp	cx,1
2147
	ja	symbol_predicted_undefined
2148
	or	byte [eax+8],40h+80h
2149
	jmp	check_expression
2150
      no_prediction:
2151
	test	byte [eax+8],1
2152
	jz	symbol_undefined
2153
	mov	cx,[current_pass]
2154
	sub	cx,[eax+16]
2155
	jz	check_expression
2156
	jmp	symbol_undefined
2157
      symbol_predicted_undefined:
2158
	or	byte [eax+8],40h
2159
	and	byte [eax+8],not 80h
2160
      symbol_undefined:
2161
	xor	bl,bl
2162
	jmp	check_expression
2163
      expression_checked:
2164
	mov	al,bl
2165
	jmp	logical_value_ok
2166
      check_for_used:
2167
	lods	word [esi]
2168
	cmp	ah,2
2169
	jne	invalid_expression
2170
	lods	dword [esi]
2171
	cmp	eax,0Fh
2172
	jb	invalid_use_of_symbol
2173
	je	reserved_word_used_as_symbol
2174
	inc	esi
2175
	test	byte [eax+8],8
2176
	jz	not_used
2177
	mov	cx,[current_pass]
2178
	sub	cx,[eax+18]
2179
	jz	return_true
2180
	cmp	cx,1
2181
	ja	not_used
2182
	or	byte [eax+8],10h+20h
2183
	jmp	return_true
2184
      not_used:
2185
	or	byte [eax+8],10h
2186
	and	byte [eax+8],not 20h
2187
	jmp	return_false
2188
      given_false:
2189
	inc	esi
2190
      return_false:
2191
	xor	al,al
2192
	jmp	logical_value_ok
2193
      given_true:
2194
	inc	esi
2195
      return_true:
2196
	or	al,-1
2197
	jmp	logical_value_ok
2198
      logical_expression:
2199
	lods	byte [esi]
2200
	mov	dl,[logical_value_wrapping]
2201
	push	edx
2202
	call	calculate_embedded_logical_expression
2203
	pop	edx
2204
	mov	[logical_value_wrapping],dl
2205
	push	eax
2206
	lods	byte [esi]
2207
	cmp	al,'}'
2208
	jne	invalid_expression
2209
	pop	eax
2210
      logical_value_ok:
2211
	pop	ebx
2212
	xor	al,bl
2213
	ret
2214
2215
skip_symbol:
2216
 
2217
	or	al,al
2218
	jz	nothing_to_skip
2219
	cmp	al,0Fh
2220
	je	nothing_to_skip
2221
	cmp	al,1
2222
	je	skip_instruction
2223
	cmp	al,2
2224
	je	skip_label
2225
	cmp	al,3
2226
	je	skip_label
2227
	cmp	al,4
2228
	je	skip_special_label
2229
	cmp	al,20h
2230
	jb	skip_assembler_symbol
2231
	cmp	al,'('
2232
	je	skip_expression
2233
	cmp	al,'['
2234
	je	skip_address
2235
      skip_done:
2236
	clc
2237
	ret
2238
      skip_label:
2239
	add	esi,2
2240
      skip_instruction:
2241
	add	esi,2
2242
      skip_assembler_symbol:
2243
	inc	esi
2244
	jmp	skip_done
2245
      skip_special_label:
2246
	add	esi,4
2247
	jmp	skip_done
2248
      skip_address:
2249
	mov	al,[esi]
2250
	and	al,11110000b
2251
	cmp	al,60h
2252
	jb	skip_expression
2253
	cmp	al,70h
2254
	ja	skip_expression
2255
	inc	esi
2256
	jmp	skip_address
2257
      skip_expression:
2258
	lods	byte [esi]
2259
	or	al,al
2260
	jz	skip_string
2261
	cmp	al,'.'
2262
	je	skip_fp_value
2263
	cmp	al,')'
2264
	je	skip_done
2265
	cmp	al,']'
2266
	je	skip_done
2267
	cmp	al,'!'
2268
	je	skip_expression
2269
	cmp	al,0Fh
2270
	je	skip_expression
2271
	cmp	al,10h
2272
	je	skip_register
2273
	cmp	al,11h
2274
	je	skip_label_value
2275
	cmp	al,80h
2276
	jae	skip_expression
2277
	movzx	eax,al
2278
	add	esi,eax
2279
	jmp	skip_expression
2280
      skip_label_value:
2281
	add	esi,3
2282
      skip_register:
2283
	inc	esi
2284
	jmp	skip_expression
2285
      skip_fp_value:
2286
	add	esi,12
2287
	jmp	skip_done
2288
      skip_string:
2289
	lods	dword [esi]
2290
	add	esi,eax
2291
	inc	esi
2292
	jmp	skip_done
2293
      nothing_to_skip:
2294
	dec	esi
2295
	stc
2296
	ret
2297
2298
expand_path:
2299
 
2300
	cmp	al,'%'
2301
	je	environment_variable
2302
	stos	byte [edi]
2303
	or	al,al
2304
	jnz	expand_path
2305
	cmp	edi,[memory_end]
2306
	ja	out_of_memory
2307
	ret
2308
      environment_variable:
2309
	mov	ebx,esi
2310
      find_variable_end:
2311
	lods	byte [esi]
2312
	or	al,al
2313
	jz	not_environment_variable
2314
	cmp	al,'%'
2315
	jne	find_variable_end
2316
	mov	byte [esi-1],0
2317
	push	esi
2318
	mov	esi,ebx
2319
	call	get_environment_variable
2320
	pop	esi
2321
	mov	byte [esi-1],'%'
2322
	jmp	expand_path
2323
      not_environment_variable:
2324
	mov	al,'%'
2325
	stos	byte [edi]
2326
	mov	esi,ebx
2327
	jmp	expand_path
2328
get_include_directory:
2329
	lods	byte [esi]
2330
	cmp	al,';'
2331
	je	include_directory_ok
2332
	stos	byte [edi]
2333
	or	al,al
2334
	jnz	get_include_directory
2335
	dec	esi
2336
	dec	edi
2337
      include_directory_ok:
2338
	cmp	byte [edi-1],'/'
2339
	je	path_separator_ok
2340
	cmp	byte [edi-1],'\'
2341
	je	path_separator_ok
2342
	mov	al,'/'
2343
	stos	byte [edi]
2344
      path_separator_ok:
2345
	ret
2346
>
2347