Subversion Repositories Kolibri OS

Rev

Rev 3011 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3011 Rev 4039
Line -... Line 1...
-
 
1
; flat assembler core
1
; flat assembler core
2
; Copyright (c) 1999-2013, Tomasz Grysztar.
2
; Copyright (c) 1999-2012, Tomasz Grysztar.
3
; All rights reserved.
3
; All rights reserved.
4
 
Line 4... Line 5...
4
 
5
calculate_expression:
5
calculate_expression:
6
	mov	[current_offset],edi
6
	mov	[current_offset],edi
7
	mov	[value_undefined],0
Line 167... Line 168...
167
	mov	eax,[ebx+4]
168
	stos	dword [edi]
168
	stos	dword [edi]
169
	mov	[edi-8+13],cl
169
	mov	[edi-8+13],cl
170
      got_label:
170
      got_label:
171
	test	byte [ebx+9],4
171
	cmp	[symbols_file],0
172
	jnz	invalid_use_of_symbol
-
 
173
	cmp	[symbols_file],0
-
 
174
	je	label_reference_ok
172
	je	label_reference_ok
175
	cmp	[next_pass_needed],0
173
	cmp	[next_pass_needed],0
176
	jne	label_reference_ok
174
	jne	label_reference_ok
177
	call	store_label_reference
175
	call	store_label_reference
178
      label_reference_ok:
176
      label_reference_ok:
179
	mov	al,[ebx+11]
Line 212... Line 215...
212
	mov	eax,[current_offset]
215
      make_current_offset_label:
213
      make_current_offset_label:
216
	xor	edx,edx
214
	xor	edx,edx
217
	xor	ch,ch
215
	xor	ch,ch
218
	mov	ebp,[addressing_space]
216
	sub	eax,dword [org_origin]
219
	sub	eax,[ds:ebp]
-
 
220
	sbb	edx,[ds:ebp+4]
217
	sbb	edx,dword [org_origin+4]
221
	sbb	ch,[ds:ebp+8]
218
	sbb	ch,[org_origin_sign]
222
	jp	current_offset_label_ok
219
	jp	current_offset_label_ok
223
	call	recoverable_overflow
220
	call	recoverable_overflow
224
      current_offset_label_ok:
221
      current_offset_label_ok:
225
	stos	dword [edi]
222
	stos	dword [edi]
226
	mov	eax,edx
223
	mov	eax,edx
227
	stos	dword [edi]
224
	stos	dword [edi]
228
	mov	eax,[ds:ebp+10h]
225
	mov	eax,[org_registers]
229
	stos	dword [edi]
226
	stos	dword [edi]
230
	mov	cl,[ds:ebp+9]
227
	mov	cl,[labels_type]
231
	mov	[edi-12+12],cx
228
	mov	[edi-12+12],cx
232
	mov	eax,[ds:ebp+14h]
229
	mov	eax,[org_symbol]
233
	mov	[edi-12+16],eax
230
	mov	[edi-12+16],eax
234
	add	edi,8
231
	add	edi,8
235
	jmp	calculation_loop
232
	jmp	calculation_loop
236
      org_origin_label:
233
      org_origin_label:
237
	mov	eax,[addressing_space]
234
	mov	eax,[org_start]
238
	mov	eax,[eax+18h]
-
 
239
	jmp	make_current_offset_label
235
	jmp	make_current_offset_label
240
      counter_label:
236
      counter_label:
241
	mov	eax,[counter]
237
	mov	eax,[counter]
242
      make_dword_label_value:
238
      make_dword_label_value:
243
	stos	dword [edi]
239
	stos	dword [edi]
244
	xor	eax,eax
240
	xor	eax,eax
245
	stos	dword [edi]
Line 284... Line 289...
284
	mov	[error],edx
289
	mov	[error_info],ebx
285
	mov	[error_info],ebx
290
	jmp	calculation_loop
286
	jmp	calculation_loop
291
      calculate_add:
287
      calculate_add:
292
	xor	ah,ah
288
	mov	ecx,[ebx+16]
293
	mov	ah,[ebx+12]
-
 
294
	mov	al,[edi+12]
289
	cmp	byte [edi+12],0
295
	or	al,al
290
	je	add_values
296
	jz	add_values
-
 
297
	or	ah,ah
291
	mov	ecx,[edi+16]
298
	jz	add_relocatable
-
 
299
	add	ah,al
-
 
300
	jnz	invalid_add
-
 
301
	mov	ecx,[edi+16]
-
 
302
	cmp	ecx,[ebx+16]
292
	cmp	byte [ebx+12],0
303
	je	add_values
293
	je	add_values
304
      invalid_add:
294
	call	recoverable_misuse
305
	call	recoverable_misuse
-
 
306
	jmp	add_values
295
      add_values:
307
      add_relocatable:
296
	mov	al,[edi+12]
308
	mov	ah,al
-
 
309
	mov	ecx,[edi+16]
297
	or	[ebx+12],al
310
	mov	[ebx+16],ecx
298
	mov	[ebx+16],ecx
311
      add_values:
299
	mov	eax,[edi]
312
	mov	[ebx+12],ah
-
 
313
	mov	eax,[edi]
-
 
314
	add	[ebx],eax
300
	add	[ebx],eax
315
	mov	eax,[edi+4]
301
	mov	eax,[edi+4]
316
	adc	[ebx+4],eax
302
	adc	[ebx+4],eax
317
	mov	al,[edi+13]
303
	mov	al,[edi+13]
318
	adc	[ebx+13],al
304
	adc	[ebx+13],al
319
	jp	add_sign_ok
Line 308... Line 323...
308
	or	dx,dx
323
	jz	calculation_loop
309
	jz	calculation_loop
324
	push	esi
310
	push	esi
325
	mov	esi,ebx
311
	mov	esi,ebx
326
	mov	cl,[edi+10]
312
	lea	ebx,[edi+10]
327
	mov	al,[edi+8]
313
	mov	cl,[edi+8]
328
	call	add_register
314
	call	add_register
329
	mov	cl,[edi+11]
315
	lea	ebx,[edi+11]
330
	mov	al,[edi+9]
316
	mov	cl,[edi+9]
331
	call	add_register
317
	call	add_register
332
	pop	esi
318
	pop	esi
333
	jmp	calculation_loop
319
	jmp	calculation_loop
334
      add_register:
320
      add_register:
335
	or	al,al
321
	or	cl,cl
336
	jz	add_register_done
322
	jz	add_register_done
337
      add_register_start:
323
      add_register_start:
338
	cmp	[esi+8],al
324
	cmp	[esi+8],cl
339
	jne	add_in_second_slot
325
	jne	add_in_second_slot
340
	add	[esi+10],cl
326
	mov	al,[ebx]
341
	jo	value_out_of_range
327
	add	[esi+10],al
-
 
328
	jo	value_out_of_range
342
	jnz	add_register_done
329
	jnz	add_register_done
343
	mov	byte [esi+8],0
330
	mov	byte [esi+8],0
344
	ret
331
	ret
345
      add_in_second_slot:
332
      add_in_second_slot:
346
	cmp	[esi+9],al
333
	cmp	[esi+9],cl
347
	jne	create_in_first_slot
334
	jne	create_in_first_slot
348
	add	[esi+11],cl
335
	mov	al,[ebx]
349
	jo	value_out_of_range
336
	add	[esi+11],al
-
 
337
	jo	value_out_of_range
350
	jnz	add_register_done
338
	jnz	add_register_done
351
	mov	byte [esi+9],0
339
	mov	byte [esi+9],0
352
	ret
340
	ret
353
      create_in_first_slot:
341
      create_in_first_slot:
354
	cmp	byte [esi+8],0
342
	cmp	byte [esi+8],0
355
	jne	create_in_second_slot
343
	jne	create_in_second_slot
356
	mov	[esi+8],al
344
	mov	[esi+8],cl
357
	mov	[esi+10],cl
345
	mov	al,[ebx]
358
	ret
346
	mov	[esi+10],al
-
 
347
	ret
359
      create_in_second_slot:
348
      create_in_second_slot:
360
	cmp	byte [esi+9],0
349
	cmp	byte [esi+9],0
361
	jne	invalid_expression
350
	jne	invalid_expression
362
	mov	[esi+9],al
351
	mov	[esi+9],cl
363
	mov	[esi+11],cl
352
	mov	al,[ebx]
364
      add_register_done:
353
	mov	[esi+11],al
-
 
354
      add_register_done:
365
	ret
355
	ret
366
      out_of_range:
356
      out_of_range:
367
	jmp	calculation_loop
357
	jmp	calculation_loop
368
      calculate_sub:
358
      calculate_sub:
369
	xor	ah,ah
359
	xor	ah,ah
370
	mov	ah,[ebx+12]
360
	mov	ah,[ebx+12]
371
	mov	al,[edi+12]
361
	mov	al,[edi+12]
372
	or	al,al
362
	or	al,al
373
	jz	sub_values
363
	jz	sub_values
374
	or	ah,ah
364
	cmp	al,ah
375
	jz	negate_relocatable
-
 
376
	cmp	al,ah
-
 
377
	jne	invalid_sub
365
	jne	invalid_sub
378
	xor	ah,ah
366
	xor	ah,ah
379
	mov	ecx,[edi+16]
367
	mov	ecx,[edi+16]
380
	cmp	ecx,[ebx+16]
368
	cmp	ecx,[ebx+16]
381
	je	sub_values
369
	je	sub_values
382
      invalid_sub:
370
      invalid_sub:
383
	call	recoverable_misuse
371
	call	recoverable_misuse
384
	jmp	sub_values
372
      sub_values:
385
      negate_relocatable:
-
 
386
	neg	al
-
 
387
	mov	ah,al
-
 
388
	mov	ecx,[edi+16]
-
 
389
	mov	[ebx+16],ecx
-
 
390
      sub_values:
-
 
391
	mov	[ebx+12],ah
373
	mov	[ebx+12],ah
392
	mov	eax,[edi]
374
	mov	eax,[edi]
393
	sub	[ebx],eax
375
	sub	[ebx],eax
394
	mov	eax,[edi+4]
376
	mov	eax,[edi+4]
395
	sbb	[ebx+4],eax
377
	sbb	[ebx+4],eax
396
	mov	al,[edi+13]
Line 385... Line 404...
385
	or	dx,dx
404
	jz	calculation_loop
386
	jz	calculation_loop
405
	push	esi
387
	push	esi
406
	mov	esi,ebx
388
	mov	esi,ebx
407
	mov	cl,[edi+10]
389
	lea	ebx,[edi+10]
408
	mov	al,[edi+8]
390
	mov	cl,[edi+8]
409
	call	sub_register
391
	call	sub_register
410
	mov	cl,[edi+11]
392
	lea	ebx,[edi+11]
411
	mov	al,[edi+9]
393
	mov	cl,[edi+9]
412
	call	sub_register
394
	call	sub_register
413
	pop	esi
395
	pop	esi
414
	jmp	calculation_loop
396
	jmp	calculation_loop
415
      sub_register:
397
      sub_register:
416
	or	al,al
398
	or	cl,cl
417
	jz	add_register_done
399
	jz	add_register_done
418
	neg	cl
400
	neg	byte [ebx]
419
	jo	value_out_of_range
401
	jo	value_out_of_range
420
	jmp	add_register_start
402
	jmp	add_register_start
421
      calculate_mul:
403
      calculate_mul:
422
	or	dx,dx
404
	or	dx,dx
423
	jz	mul_start
405
	jz	mul_start
424
	cmp	word [ebx+8],0
406
	cmp	word [ebx+8],0
425
	jne	mul_start
Line 418... Line 437...
418
	mov	esi,ebx
437
	xor	bl,bl
419
	xor	bl,bl
438
	cmp	byte [esi+13],0
420
	cmp	byte [esi+13],0
439
	je	mul_first_sign_ok
421
	je	mul_first_sign_ok
440
	xor	bl,-1
422
	mov	eax,[esi]
441
	mov	eax,[esi]
-
 
442
	mov	edx,[esi+4]
423
	mov	edx,[esi+4]
443
	not	eax
424
	not	eax
444
	not	edx
425
	not	edx
445
	add	eax,1
426
	add	eax,1
446
	adc	edx,0
427
	adc	edx,0
447
	mov	[esi],eax
428
	mov	[esi],eax
448
	mov	[esi+4],edx
429
	mov	[esi+4],edx
449
	or	eax,edx
430
	or	eax,edx
450
	jz	mul_overflow
431
	jz	mul_overflow
451
      mul_first_sign_ok:
432
	xor	bl,-1
452
	cmp	byte [edi+13],0
433
      mul_first_sign_ok:
-
 
434
	cmp	byte [edi+13],0
453
	je	mul_second_sign_ok
435
	je	mul_second_sign_ok
454
	xor	bl,-1
436
	mov	eax,[edi]
455
	cmp	byte [esi+8],0
-
 
456
	je	mul_first_register_sign_ok
-
 
457
	neg	byte [esi+10]
-
 
458
	jo	invalid_expression
-
 
459
      mul_first_register_sign_ok:
-
 
460
	cmp	byte [esi+9],0
-
 
461
	je	mul_second_register_sign_ok
-
 
462
	neg	byte [esi+11]
-
 
463
	jo	invalid_expression
-
 
464
      mul_second_register_sign_ok:
-
 
465
	mov	eax,[edi]
-
 
466
	mov	edx,[edi+4]
437
	mov	edx,[edi+4]
467
	not	eax
438
	not	eax
468
	not	edx
439
	not	edx
469
	add	eax,1
440
	add	eax,1
470
	adc	edx,0
441
	adc	edx,0
471
	mov	[edi],eax
442
	mov	[edi],eax
472
	mov	[edi+4],edx
443
	mov	[edi+4],edx
473
	or	eax,edx
444
	or	eax,edx
474
	jz	mul_overflow
445
	jz	mul_overflow
475
      mul_second_sign_ok:
446
	xor	bl,-1
476
	cmp	dword [esi+4],0
447
      mul_second_sign_ok:
-
 
448
	cmp	dword [esi+4],0
477
	jz	mul_numbers
449
	jz	mul_numbers
478
	cmp	dword [edi+4],0
450
	cmp	dword [edi+4],0
479
	jz	mul_numbers
451
	jz	mul_numbers
480
	jnz	mul_overflow
452
	jnz	mul_overflow
481
      mul_numbers:
Line 873... Line 902...
873
	not	word [edi+4]
902
	not	dword [edi]
874
	not	dword [edi]
903
	jmp	finish_not
875
	jmp	finish_not
904
      calculate_neg:
876
      calculate_neg:
905
	cmp	byte [edi+8],0
877
	cmp	word [edi+8],0
906
	je	neg_first_register_ok
878
	jne	invalid_expression
907
	neg	byte [edi+10]
-
 
908
	jo	invalid_expression
-
 
909
      neg_first_register_ok:
879
	cmp	byte [edi+12],0
910
	cmp	byte [edi+9],0
-
 
911
	je	neg_second_register_ok
880
	je	neg_ok
912
	neg	byte [edi+11]
881
	call	recoverable_misuse
913
	jo	invalid_expression
882
      neg_ok:
914
      neg_second_register_ok:
-
 
915
	neg	byte [edi+12]
883
	xor	eax,eax
916
	xor	eax,eax
-
 
917
	xor	edx,edx
884
	xor	edx,edx
918
	xor	cl,cl
885
	xor	cl,cl
919
	xchg	eax,[edi]
886
	xchg	eax,[edi]
920
	xchg	edx,[edi+4]
887
	xchg	edx,[edi+4]
921
	xchg	cl,[edi+13]
888
	xchg	cl,[edi+13]
922
	sub	[edi],eax
Line 1103... Line 1137...
1103
      div_ok:
1137
	mov	[esi+13],bl
1104
	mov	[esi+13],bl
1138
	ret
1105
	ret
1139
      store_label_reference:
1106
      store_label_reference:
1140
	mov	eax,[tagged_blocks]
1107
	mov	eax,[display_buffer]
1141
	mov	dword [eax-4],2
1108
	mov	dword [eax-4],2
1142
	mov	dword [eax-8],4
1109
	mov	dword [eax-8],4
1143
	sub	eax,8+4
1110
	sub	eax,8+4
1144
	cmp	eax,edi
1111
	cmp	eax,edi
1145
	jbe	out_of_memory
1112
	jbe	out_of_memory
1146
	mov	[tagged_blocks],eax
1113
	mov	[display_buffer],eax
1147
	mov	[eax],ebx
1114
	mov	[eax],ebx
1148
	ret
1115
	ret
1149
      convert_fp:
1116
      convert_fp:
1150
	inc	esi
1117
	inc	esi
1151
	and	word [edi+8],0
1118
	and	word [edi+8],0
1152
	and	word [edi+12],0
1119
	and	word [edi+12],0
1153
	mov	al,[value_size]
Line 1518... Line 1552...
1518
	jmp	truncated_value
1552
get_address_word_value:
1519
get_address_word_value:
1553
	mov	[address_size],2
1520
	mov	[address_size],2
1554
	mov	[value_size],2
1521
	mov	[value_size],2
1555
	mov	[free_address_range],0
1522
	jmp	calculate_address
1556
	jmp	calculate_address
-
 
1557
get_address_dword_value:
1523
get_address_dword_value:
1558
	mov	[address_size],4
1524
	mov	[address_size],4
1559
	mov	[value_size],4
1525
	mov	[value_size],4
1560
	mov	[free_address_range],0
1526
	jmp	calculate_address
1561
	jmp	calculate_address
-
 
1562
get_address_qword_value:
1527
get_address_qword_value:
1563
	mov	[address_size],8
1528
	mov	[address_size],8
1564
	mov	[value_size],8
1529
	mov	[value_size],8
1565
	mov	[free_address_range],0
1530
	jmp	calculate_address
1566
	jmp	calculate_address
-
 
1567
get_address_value:
1531
get_address_value:
1568
	mov	[address_size],0
1532
	mov	[address_size],0
1569
	mov	[value_size],8
1533
	mov	[value_size],8
1570
	or	[free_address_range],-1
1534
      calculate_address:
1571
      calculate_address:
-
 
1572
	cmp	byte [esi],'.'
1535
	cmp	byte [esi],'.'
1573
	je	invalid_address
1536
	je	invalid_address
1574
	call	calculate_expression
1537
	call	calculate_expression
1575
	mov	eax,[edi+16]
1538
	mov	eax,[edi+16]
1576
	mov	[address_symbol],eax
1539
	mov	[address_symbol],eax
1577
	mov	al,[edi+13]
1540
	mov	al,[edi+13]
1578
	mov	[address_sign],al
1541
	mov	[address_sign],al
1579
	mov	al,[edi+12]
1542
	mov	al,[edi+12]
1580
	mov	[value_type],al
1543
	mov	[value_type],al
1581
	cmp	al,0
1544
	cmp	al,6
1582
	je	address_size_ok
-
 
1583
	jg	get_address_symbol_size
-
 
1584
	neg	al
-
 
1585
      get_address_symbol_size:
-
 
1586
	cmp	al,6
-
 
1587
	je	special_address_type_32bit
1545
	je	special_address_type_32bit
1588
	cmp	al,5
1546
	cmp	al,5
1589
	je	special_address_type_32bit
1547
	je	special_address_type_32bit
1590
	ja	invalid_address_type
1548
	ja	invalid_use_of_symbol
1591
	test	al,1
1549
	test	al,1
1592
	jnz	invalid_address_type
1550
	jnz	invalid_use_of_symbol
1593
	shl	al,5
1551
	or	al,al
1594
	jmp	address_symbol_ok
1552
	jz	address_size_ok
-
 
1553
	shl	al,5
-
 
1554
	jmp	address_symbol_ok
1595
      invalid_address_type:
1555
      special_address_type_32bit:
1596
	call	recoverable_misuse
-
 
1597
      special_address_type_32bit:
-
 
1598
	mov	al,40h
1556
	mov	al,40h
1599
      address_symbol_ok:
1557
      address_symbol_ok:
1600
	mov	ah,[address_size]
1558
	mov	ah,[address_size]
1601
	or	[address_size],al
1559
	or	[address_size],al
1602
	shr	al,4
1560
	shr	al,4
1603
	or	ah,ah
Line 1619... Line 1662...
1619
	cmp	al,8
1662
	je	sib_allowed
1620
	je	sib_allowed
1663
	cmp	al,0Fh
1621
	cmp	al,0Fh
1664
	je	check_ip_relative_address
1622
	je	check_ip_relative_address
1665
	cmp	cl,1
1623
	or	cl,cl
1666
	ja	invalid_address
1624
	jz	check_word_value
-
 
1625
	cmp	cl,1
-
 
1626
	je	check_word_value
1667
	cmp	[free_address_range],0
-
 
1668
	jne	check_qword_value
-
 
1669
	jmp	check_word_value
1627
	jmp	invalid_address
1670
      address_sizes_do_not_match:
1628
      address_sizes_do_not_match:
1671
	cmp	al,0Fh
1629
	cmp	al,0Fh
1672
	jne	invalid_address
1630
	jne	invalid_address
1673
	mov	al,bh
1631
	mov	al,bh
1674
	and	al,0Fh
1632
	and	al,0Fh
1675
	cmp	al,ah
1633
	cmp	al,ah
1676
	jne	invalid_address
1634
	jne	invalid_address
1677
      check_ip_relative_address:
1635
      check_ip_relative_address:
1678
	or	bl,bl
1636
	or	bl,bl
1679
	jnz	invalid_address
1637
	jnz	invalid_address
1680
	cmp	bh,0F8h
1638
	cmp	bh,0F4h
1681
	je	check_rip_relative_address
1639
	je	check_dword_value
-
 
1640
	cmp	bh,0F8h
-
 
1641
	jne	invalid_address
1682
	cmp	bh,0F4h
-
 
1683
	jne	invalid_address
-
 
1684
	cmp	[free_address_range],0
1642
	mov	eax,[edi]
1685
	jne	check_qword_value
-
 
1686
	jmp	check_dword_value
-
 
1687
      check_rip_relative_address:
-
 
1688
	mov	eax,[edi]
-
 
1689
	cdq
1643
	cdq
1690
	cmp	edx,[edi+4]
1644
	cmp	edx,[edi+4]
1691
	jne	range_exceeded
1645
	jne	range_exceeded
1692
	cmp	dl,[edi+13]
1646
	cmp	dl,[edi+13]
1693
	jne	range_exceeded
1647
	jne	range_exceeded
1694
	ret
Line 1692... Line 1739...
1692
      special_index_scale:
1739
	mov	bh,bl
1693
	mov	bh,bl
1740
	dec	cl
1694
	dec	cl
1741
      check_immediate_address:
1695
      check_immediate_address:
1742
	cmp	[free_address_range],0
1696
	mov	al,[address_size]
1743
	jne	check_qword_value
-
 
1744
	mov	al,[address_size]
-
 
1745
	and	al,0Fh
1697
	and	al,0Fh
1746
	cmp	al,2
1698
	cmp	al,2
1747
	je	check_word_value
1699
	je	check_word_value
1748
	cmp	al,4
1700
	cmp	al,4
1749
	je	check_dword_value
1701
	je	check_dword_value
1750
	cmp	al,8
Line 1776... Line 1825...
1776
	cmp	[value_undefined],0
1825
	jne	relative_offset_ok
1777
	jne	relative_offset_ok
1826
	test	bh,bh
1778
	test	bh,bh
1827
	setne	ch
1779
	setne	ch
1828
	cmp	bx,[ds:ebp+10h]
1780
	cmp	bx,word [org_registers]
1829
	je	origin_registers_ok
1781
	je	origin_registers_ok
1830
	xchg	bh,bl
1782
	xchg	bh,bl
1831
	xchg	ch,cl
1783
	xchg	ch,cl
1832
	cmp	bx,[ds:ebp+10h]
1784
	cmp	bx,word [org_registers]
1833
	jne	invalid_value
1785
	jne	invalid_value
1834
      origin_registers_ok:
1786
      origin_registers_ok:
1835
	cmp	cx,[ds:ebp+10h+2]
1787
	cmp	cx,word [org_registers+2]
1836
	jne	invalid_value
1788
	jne	invalid_value
1837
	mov	bl,[address_sign]
1789
	mov	bl,[address_sign]
1838
	add	eax,[ds:ebp]
1790
	add	eax,dword [org_origin]
1839
	adc	edx,[ds:ebp+4]
1791
	adc	edx,dword [org_origin+4]
1840
	adc	bl,[ds:ebp+8]
1792
	adc	bl,[org_origin_sign]
1841
	sub	eax,edi
1793
	sub	eax,edi
1842
	sbb	edx,0
1794
	sbb	edx,0
1843
	sbb	bl,0
1795
	sbb	bl,0
1844
	mov	[value_sign],bl
1796
	mov	[value_sign],bl
1845
	mov	bl,[value_type]
1797
	mov	bl,[value_type]
1846
	mov	ecx,[address_symbol]
1798
	mov	ecx,[address_symbol]
1847
	mov	[symbol_identifier],ecx
Line 1800... Line 1849...
1800
	test	bl,1
1849
	jnz	relative_offset_unallowed
1801
	jnz	relative_offset_unallowed
1850
	cmp	bl,6
1802
	cmp	bl,6
1851
	je	plt_relative_offset
1803
	je	plt_relative_offset
1852
	mov	bh,[ds:ebp+9]
1804
	mov	bh,[labels_type]
1853
	cmp	bl,bh
1805
	cmp	bl,bh
1854
	je	set_relative_offset_type
1806
	je	set_relative_offset_type
1855
	cmp	bx,0402h
1807
	cmp	bx,0402h
1856
	je	set_relative_offset_type
1808
	je	set_relative_offset_type
1857
      relative_offset_unallowed:
1809
      relative_offset_unallowed:
1858
	call	recoverable_misuse
1810
	call	recoverable_misuse
1859
      set_relative_offset_type:
1811
      set_relative_offset_type:
1860
	cmp	[value_type],0
1812
	cmp	[value_type],0
1861
	je	relative_offset_ok
1813
	je	relative_offset_ok
1862
	mov	[value_type],0
1814
	mov	[value_type],0
1863
	cmp	ecx,[ds:ebp+14h]
1815
	cmp	ecx,[org_symbol]
1864
	je	relative_offset_ok
1816
	je	relative_offset_ok
1865
	mov	[value_type],3
1817
	mov	[value_type],3
1866
      relative_offset_ok:
1818
      relative_offset_ok:
1867
	ret
1819
	ret
1868
      plt_relative_offset:
1820
      plt_relative_offset:
1869
	mov	[value_type],7
1821
	mov	[value_type],7
1870
	cmp	byte [ds:ebp+9],2
1822
	cmp	[labels_type],2
1871
	je	relative_offset_ok
1823
	je	relative_offset_ok
1872
	cmp	byte [ds:ebp+9],4
1824
	cmp	[labels_type],4
1873
	jne	recoverable_misuse
1825
	jne	recoverable_misuse
1874
	ret
1826
	ret
1875
 
1827
 
1876
calculate_logical_expression:
Line 1828... Line 1877...
1828
calculate_logical_expression:
1877
	xor	al,al
1829
	xor	al,al
1878
  calculate_embedded_logical_expression:
Line 1904... Line 1953...
1904
	cmp	al,'0'
1953
	je	given_false
1905
	je	given_false
1954
	cmp	al,'1'
1906
	cmp	al,'1'
1955
	je	given_true
1907
	je	given_true
1956
	cmp	al,'('
1908
	call	get_value_for_comparison
1957
	jne	invalid_value
-
 
1958
	call	get_value_for_comparison
-
 
1959
	mov	bh,[value_sign]
1909
	mov	bh,[value_sign]
1960
	push	eax edx [symbol_identifier] ebx ecx
1910
	push	eax edx [symbol_identifier] ebx ecx
1961
	mov	al,[esi]
1911
	mov	al,[esi]
1962
	or	al,al
1912
	or	al,al
1963
	jz	logical_number
1913
	jz	logical_number
1964
	cmp	al,0Fh
Line 1920... Line 1971...
1920
	cmp	al,'|'
1971
	je	logical_number
1921
	je	logical_number
1972
	inc	esi
1922
	inc	esi
1973
	mov	[compare_type],al
1923
	mov	[compare_type],al
1974
	cmp	byte [esi],'('
1924
	call	get_value_for_comparison
1975
	jne	invalid_value
-
 
1976
	call	get_value_for_comparison
-
 
1977
	cmp	bl,[esp+4]
1925
	cmp	bl,[esp+4]
1978
	jne	values_not_relative
1926
	jne	values_not_relative
1979
	or	bl,bl
1927
	or	bl,bl
1980
	jz	check_values_registers
1928
	jz	check_values_registers
1981
	mov	ebx,[symbol_identifier]
1929
	mov	ebx,[symbol_identifier]
1982
	cmp	ebx,[esp+8]
Line 2171... Line 2224...
2171
	cmp	al,2
2224
	je	skip_label
2172
	je	skip_label
2225
	cmp	al,3
2173
	cmp	al,3
2226
	je	skip_label
2174
	je	skip_label
2227
	cmp	al,4
2175
	cmp	al,20h
2228
	je	skip_special_label
-
 
2229
	cmp	al,20h
-
 
2230
	jb	skip_assembler_symbol
2176
	jb	skip_assembler_symbol
2231
	cmp	al,'('
2177
	cmp	al,'('
2232
	je	skip_expression
2178
	je	skip_expression
2233
	cmp	al,'['
2179
	cmp	al,'['
2234
	je	skip_address
2180
	je	skip_address
2235
      skip_done:
Line 2187... Line 2242...
2187
	add	esi,2
2242
      skip_assembler_symbol:
2188
      skip_assembler_symbol:
2243
	inc	esi
2189
	inc	esi
2244
	jmp	skip_done
2190
	jmp	skip_done
2245
      skip_special_label:
2191
      skip_address:
2246
	add	esi,4
-
 
2247
	jmp	skip_done
-
 
2248
      skip_address:
-
 
2249
	mov	al,[esi]
2192
	mov	al,[esi]
2250
	and	al,11110000b
2193
	and	al,11110000b
2251
	cmp	al,60h
2194
	cmp	al,60h
2252
	jb	skip_expression
2195
	jb	skip_expression
2253
	cmp	al,70h
2196
	cmp	al,70h
2254
	ja	skip_expression