Subversion Repositories Kolibri OS

Rev

Rev 7836 | Details | Compare with Previous | Last modification | View Log | RSS feed

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