Subversion Repositories Kolibri OS

Rev

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

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