Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
205 heavyiron 1
 
31 halyavin 2
; Copyright (c) 1999-2007, Tomasz Grysztar.
340 heavyiron 3
; All rights reserved.
31 halyavin 4
5
 
6
	cmp	[output_file],0
157 heavyiron 7
	jne	output_path_ok
8
	push	edi
9
	mov	esi,[input_file]
10
	mov	edi,[free_additional_memory]
11
      copy_output_path:
31 halyavin 12
	lods	byte [esi]
157 heavyiron 13
	cmp	edi,[structures_buffer]
14
	jae	out_of_memory
15
	stos	byte [edi]
16
	or	al,al
17
	jnz	copy_output_path
18
	dec	edi
19
	mov	eax,edi
20
      find_extension:
31 halyavin 21
	dec	eax
157 heavyiron 22
	cmp	eax,[free_additional_memory]
23
	jb	extension_found
24
	cmp	byte [eax],'\'
25
	je	extension_found
26
	cmp	byte [eax],'/'
27
	je	extension_found
28
	cmp	byte [eax],'.'
29
	jne	find_extension
30
	mov	edi,eax
31
      extension_found:
31 halyavin 32
	lea	eax,[edi+9]
157 heavyiron 33
	cmp	eax,[structures_buffer]
34
	jae	out_of_memory
35
	cmp	[output_format],2
36
	je	exe_extension
37
	jb	bin_extension
38
	cmp	[output_format],4
39
	je	obj_extension
40
	cmp	[output_format],5
41
	je	o_extension
42
	cmp	[output_format],3
43
	jne	no_extension
44
	cmp	[subsystem],1
45
	je	sys_extension
46
	bt	[format_flags],8
47
	jnc	exe_extension
48
	mov	eax,'.dll'
49
	jmp	make_extension
50
      sys_extension:
31 halyavin 51
	mov	eax,'.sys'
157 heavyiron 52
	jmp	make_extension
53
      bin_extension:
31 halyavin 54
	mov	eax,'.bin'
157 heavyiron 55
	bt	[format_flags],0
56
	jnc	make_extension
57
	mov	eax,'.com'
58
	jmp	make_extension
59
      obj_extension:
31 halyavin 60
	mov	eax,'.obj'
157 heavyiron 61
	jmp	make_extension
62
      o_extension:
31 halyavin 63
	mov	eax,'.o'
157 heavyiron 64
	bt	[format_flags],0
65
	jnc	make_extension
66
      no_extension:
31 halyavin 67
	xor	eax,eax
157 heavyiron 68
	jmp	make_extension
69
      exe_extension:
31 halyavin 70
	mov	eax,'.exe'
157 heavyiron 71
      make_extension:
31 halyavin 72
	xchg	eax,[edi]
157 heavyiron 73
	scas	dword [edi]
74
	mov	byte [edi],0
75
	scas	byte [edi]
76
	mov	esi,edi
77
	stos	dword [edi]
78
	sub	edi,9
79
	xor	eax,eax
80
	mov	ebx,characters
81
      adapt_case:
31 halyavin 82
	mov	al,[esi]
157 heavyiron 83
	or	al,al
84
	jz	adapt_next
85
	xlat	byte [ebx]
86
	cmp	al,[esi]
87
	je	adapt_ok
88
	sub	byte [edi],20h
89
      adapt_ok:
31 halyavin 90
	inc	esi
157 heavyiron 91
      adapt_next:
31 halyavin 92
	inc	edi
157 heavyiron 93
	cmp	byte [edi],0
94
	jne	adapt_case
95
	mov	esi,edi
96
	lea	ecx,[esi+1]
97
	sub	ecx,[free_additional_memory]
98
	mov	edi,[structures_buffer]
99
	dec	edi
100
	std
101
	rep	movs byte [edi],[esi]
102
	cld
103
	inc	edi
104
	mov	[structures_buffer],edi
105
	mov	[output_file],edi
106
	pop	edi
107
      output_path_ok:
31 halyavin 108
	cmp	[output_format],4
157 heavyiron 109
	je	coff_formatter
110
	cmp	[output_format],5
111
	jne	common_formatter
112
	bt	[format_flags],0
113
	jnc	elf_formatter
114
      common_formatter:
31 halyavin 115
	mov	eax,edi
157 heavyiron 116
	sub	eax,[code_start]
117
	mov	[real_code_size],eax
118
	cmp	edi,[undefined_data_end]
119
	jne	calculate_code_size
120
	mov	edi,[undefined_data_start]
121
      calculate_code_size:
31 halyavin 122
	sub	edi,[code_start]
157 heavyiron 123
	mov	[code_size],edi
124
	mov	[written_size],0
125
	mov	edx,[output_file]
126
	call	create
127
	jc	write_failed
128
	cmp	[output_format],3
129
	jne	stub_written
130
	mov	edx,[code_start]
131
	mov	ecx,[stub_size]
132
	sub	edx,ecx
133
	add	[written_size],ecx
134
	call	write
135
      stub_written:
31 halyavin 136
	cmp	[output_format],2
157 heavyiron 137
	jne	write_output
138
	call	write_mz_header
139
      write_output:
31 halyavin 140
	call	write_code
157 heavyiron 141
      output_written:
31 halyavin 142
	call	close
157 heavyiron 143
	ret
144
      write_code:
31 halyavin 145
	mov	eax,[written_size]
157 heavyiron 146
	mov	[headers_size],eax
147
	mov	edx,[code_start]
148
	mov	ecx,[code_size]
149
	add	[written_size],ecx
150
	call	write
151
	jc	write_failed
152
	ret
153
format_directive:
31 halyavin 154
	cmp	edi,[code_start]
157 heavyiron 155
	jne	unexpected_instruction
156
	cmp	[virtual_data],0
157
	jne	unexpected_instruction
158
	cmp	[output_format],0
159
	jne	unexpected_instruction
160
	lods	byte [esi]
161
	cmp	al,17h
162
	je	format_prefix
163
	cmp	al,18h
164
	jne	invalid_argument
165
	lods	byte [esi]
166
      select_format:
31 halyavin 167
	mov	dl,al
157 heavyiron 168
	shr	al,4
169
	mov	[output_format],al
170
	and	edx,0Fh
171
	or	[format_flags],edx
172
	cmp	al,2
173
	je	format_mz
174
	cmp	al,3
175
	je	format_pe
176
	cmp	al,4
177
	je	format_coff
178
	cmp	al,5
179
	je	format_elf
180
	jmp	instruction_assembled
181
      format_prefix:
31 halyavin 182
	lods	byte [esi]
157 heavyiron 183
	mov	ah,al
184
	lods	byte [esi]
185
	cmp	al,18h
186
	jne	invalid_argument
187
	lods	byte [esi]
188
	mov	edx,eax
189
	shr	dl,4
190
	shr	dh,4
191
	cmp	dl,dh
192
	jne	invalid_argument
193
	or	al,ah
194
	jmp	select_format
195
entry_directive:
31 halyavin 196
	bts	[format_flags],10h
157 heavyiron 197
	jc	setting_already_specified
198
	mov	al,[output_format]
199
	cmp	al,2
200
	je	mz_entry
201
	cmp	al,3
202
	je	pe_entry
203
	cmp	al,5
204
	jne	illegal_instruction
205
	bt	[format_flags],0
206
	jc	elf_entry
207
	jmp	illegal_instruction
208
stack_directive:
31 halyavin 209
	bts	[format_flags],11h
157 heavyiron 210
	jc	setting_already_specified
211
	mov	al,[output_format]
212
	cmp	al,2
213
	je	mz_stack
214
	cmp	al,3
215
	je	pe_stack
216
	jmp	illegal_instruction
217
heap_directive:
31 halyavin 218
	bts	[format_flags],12h
157 heavyiron 219
	jc	setting_already_specified
220
	mov	al,[output_format]
221
	cmp	al,2
222
	je	mz_heap
223
	cmp	al,3
224
	je	pe_heap
225
	jmp	illegal_instruction
226
segment_directive:
109 heavyiron 227
	cmp	[virtual_data],0
157 heavyiron 228
	jne	illegal_instruction
229
	mov	al,[output_format]
230
	cmp	al,2
231
	je	mz_segment
232
	cmp	al,5
233
	je	elf_segment
234
	jmp	illegal_instruction
235
section_directive:
31 halyavin 236
	cmp	[virtual_data],0
157 heavyiron 237
	jne	illegal_instruction
238
	mov	al,[output_format]
239
	cmp	al,3
240
	je	pe_section
241
	cmp	al,4
242
	je	coff_section
243
	cmp	al,5
244
	je	elf_section
245
	jmp	illegal_instruction
246
public_directive:
31 halyavin 247
	mov	al,[output_format]
157 heavyiron 248
	cmp	al,4
249
	je	public_allowed
250
	cmp	al,5
251
	jne	illegal_instruction
252
	bt	[format_flags],0
253
	jc	illegal_instruction
254
      public_allowed:
31 halyavin 255
	lods	byte [esi]
157 heavyiron 256
	cmp	al,2
257
	jne	invalid_argument
258
	lods	dword [esi]
259
	cmp	eax,0Fh
260
	jb	invalid_use_of_symbol
261
	je	reserved_word_used_as_symbol
262
	mov	dx,[current_pass]
263
	mov	[eax+18],dx
264
	or	byte [eax+8],8
265
	inc	esi
266
	mov	ebx,[free_additional_memory]
267
	lea	edx,[ebx+10h]
268
	cmp	edx,[structures_buffer]
269
	jae	out_of_memory
270
	mov	[free_additional_memory],edx
271
	mov	[ebx+8],eax
272
	mov	eax,[current_line]
273
	mov	[ebx+0Ch],eax
274
	lods	byte [esi]
275
	cmp	al,86h
276
	jne	invalid_argument
277
	lods	word [esi]
278
	cmp	ax,'('
279
	jne	invalid_argument
280
	mov	[ebx+4],esi
281
	lods	dword [esi]
282
	lea	esi,[esi+eax+1]
283
	mov	byte [ebx],80h
284
	jmp	instruction_assembled
285
extrn_directive:
31 halyavin 286
	mov	al,[output_format]
157 heavyiron 287
	cmp	al,4
288
	je	extrn_allowed
289
	cmp	al,5
290
	jne	illegal_instruction
291
	bt	[format_flags],0
292
	jc	illegal_instruction
293
      extrn_allowed:
31 halyavin 294
	lods	word [esi]
157 heavyiron 295
	cmp	ax,'('
296
	jne	invalid_argument
297
	mov	ebx,esi
298
	lods	dword [esi]
299
	lea	esi,[esi+eax+1]
300
	mov	edx,[free_additional_memory]
301
	lea	eax,[edx+0Ch]
302
	cmp	eax,[structures_buffer]
303
	jae	out_of_memory
304
	mov	[free_additional_memory],eax
305
	mov	byte [edx],81h
306
	mov	[edx+4],ebx
307
	lods	byte [esi]
308
	cmp	al,86h
309
	jne	invalid_argument
310
	lods	byte [esi]
311
	cmp	al,2
312
	jne	invalid_argument
313
	lods	dword [esi]
314
	cmp	eax,0Fh
315
	jb	invalid_use_of_symbol
316
	je	reserved_word_used_as_symbol
317
	inc	esi
318
	mov	ebx,eax
319
	xor	ah,ah
320
	lods	byte [esi]
321
	cmp	al,':'
322
	je	get_extrn_size
323
	dec	esi
324
	cmp	al,11h
325
	jne	extrn_size_ok
326
      get_extrn_size:
31 halyavin 327
	lods	word [esi]
157 heavyiron 328
	cmp	al,11h
329
	jne	invalid_argument
330
      extrn_size_ok:
31 halyavin 331
	mov	[address_symbol],edx
157 heavyiron 332
	movzx	ecx,ah
333
	mov	[edx+8],ecx
334
	xor	eax,eax
335
	xor	edx,edx
336
	xor	ebp,ebp
337
	mov	ch,2
338
	test	[format_flags],8
339
	jz	make_free_label
340
	mov	ch,4
341
	jmp	make_free_label
342
mark_relocation:
31 halyavin 343
	cmp	[value_type],0
157 heavyiron 344
	je	relocation_ok
345
	cmp	[virtual_data],0
346
	jne	relocation_ok
347
	cmp	[output_format],2
348
	je	mark_mz_relocation
349
	cmp	[output_format],3
350
	je	mark_pe_relocation
351
	cmp	[output_format],4
352
	je	mark_coff_relocation
353
	cmp	[output_format],5
354
	je	mark_elf_relocation
355
      relocation_ok:
31 halyavin 356
	ret
157 heavyiron 357
close_pass:
31 halyavin 358
	mov	al,[output_format]
157 heavyiron 359
	cmp	al,3
360
	je	close_pe
361
	cmp	al,4
362
	je	close_coff
363
	cmp	al,5
364
	je	close_elf
365
	ret
366
31 halyavin 367
 
368
	mov	edx,[additional_memory]
157 heavyiron 369
	push	edi
370
	mov	edi,edx
371
	mov	ecx,1Ch shr 2
372
	xor	eax,eax
373
	rep	stos dword [edi]
374
	mov	[free_additional_memory],edi
375
	pop	edi
376
	mov	word [edx+0Ch],0FFFFh
377
	mov	word [edx+10h],1000h
378
	mov	[code_type],16
379
	jmp	instruction_assembled
380
mark_mz_relocation:
31 halyavin 381
	push	eax ebx
157 heavyiron 382
	inc	[number_of_relocations]
383
	mov	ebx,[free_additional_memory]
384
	mov	eax,edi
385
	sub	eax,[code_start]
386
	mov	[ebx],ax
387
	shr	eax,16
388
	shl	ax,12
389
	mov	[ebx+2],ax
390
	cmp	word [ebx],0FFFFh
391
	jne	mz_relocation_ok
392
	inc	word [ebx+2]
393
	sub	word [ebx],10h
394
      mz_relocation_ok:
31 halyavin 395
	add	ebx,4
157 heavyiron 396
	cmp	ebx,[structures_buffer]
397
	jae	out_of_memory
398
	mov	[free_additional_memory],ebx
399
	pop	ebx eax
400
	ret
401
mz_segment:
109 heavyiron 402
	lods	byte [esi]
157 heavyiron 403
	cmp	al,2
404
	jne	invalid_argument
405
	lods	dword [esi]
406
	cmp	eax,0Fh
407
	jb	invalid_use_of_symbol
408
	je	reserved_word_used_as_symbol
409
	inc	esi
410
	mov	ebx,eax
411
	mov	eax,edi
412
	sub	eax,[code_start]
413
	mov	ecx,0Fh
414
	add	eax,0Fh
415
	and	eax,1111b
416
	sub	ecx,eax
417
	mov	edx,edi
418
	xor	al,al
419
	rep	stos byte [edi]
420
	mov	dword [org_origin],edi
421
	mov	dword [org_origin+4],0
422
	mov	[org_registers],0
423
	mov	[org_start],edi
424
	mov	eax,edx
425
	call	undefined_data
426
	mov	eax,edi
427
	sub	eax,[code_start]
428
	shr	eax,4
429
	cmp	eax,10000h
430
	jae	value_out_of_range
431
	mov	edx,eax
432
	mov	al,16
433
	cmp	byte [esi],13h
434
	jne	segment_type_ok
435
	inc	esi
436
	lods	byte [esi]
437
      segment_type_ok:
31 halyavin 438
	mov	[code_type],al
157 heavyiron 439
	mov	eax,edx
440
	mov	cx,0100h
441
	xor	edx,edx
442
	xor	ebp,ebp
443
	mov	[address_symbol],edx
444
	jmp	make_free_label
445
mz_entry:
31 halyavin 446
	lods	byte [esi]
157 heavyiron 447
	cmp	al,'('
448
	jne	invalid_argument
449
	call	get_word_value
450
	cmp	[value_type],1
451
	je	initial_cs_ok
452
	cmp	[error_line],0
453
	jne	initial_cs_ok
454
	mov	eax,[current_line]
455
	mov	[error_line],eax
456
	mov	[error],invalid_address
457
      initial_cs_ok:
31 halyavin 458
	mov	edx,[additional_memory]
157 heavyiron 459
	mov	[edx+16h],ax
460
	lods	byte [esi]
461
	cmp	al,':'
462
	jne	invalid_argument
463
	lods	byte [esi]
464
	cmp	al,'('
465
	jne	invalid_argument
466
	ja	invalid_address
467
	call	get_word_value
468
	cmp	[value_type],0
469
	jne	invalid_use_of_symbol
470
	mov	edx,[additional_memory]
471
	mov	[edx+14h],ax
472
	jmp	instruction_assembled
473
mz_stack:
31 halyavin 474
	lods	byte [esi]
157 heavyiron 475
	cmp	al,'('
476
	jne	invalid_argument
477
	call	get_word_value
478
	cmp	byte [esi],':'
479
	je	stack_pointer
480
	cmp	ax,10h
481
	jb	invalid_value
482
	cmp	[value_type],0
483
	jne	invalid_use_of_symbol
484
	mov	edx,[additional_memory]
485
	mov	[edx+10h],ax
486
	jmp	instruction_assembled
487
      stack_pointer:
31 halyavin 488
	cmp	[value_type],1
157 heavyiron 489
	je	initial_ss_ok
490
	cmp	[error_line],0
491
	jne	initial_ss_ok
492
	mov	eax,[current_line]
493
	mov	[error_line],eax
494
	mov	[error],invalid_address
495
      initial_ss_ok:
31 halyavin 496
	mov	edx,[additional_memory]
157 heavyiron 497
	mov	[edx+0Eh],ax
498
	lods	byte [esi]
499
	cmp	al,':'
500
	jne	invalid_argument
501
	lods	byte [esi]
502
	cmp	al,'('
503
	jne	invalid_argument
504
	call	get_word_value
505
	cmp	[value_type],0
506
	jne	invalid_use_of_symbol
507
	mov	edx,[additional_memory]
508
	mov	[edx+10h],ax
509
	bts	[format_flags],4
510
	jmp	instruction_assembled
511
mz_heap:
31 halyavin 512
	cmp	[output_format],2
157 heavyiron 513
	jne	illegal_instruction
514
	lods	byte [esi]
515
	call	get_size_operator
516
	cmp	ah,1
517
	je	invalid_value
518
	cmp	ah,2
519
	ja	invalid_value
520
	cmp	al,'('
521
	jne	invalid_argument
522
	call	get_word_value
523
	cmp	[value_type],0
524
	jne	invalid_use_of_symbol
525
	mov	edx,[additional_memory]
526
	mov	[edx+0Ch],ax
527
	jmp	instruction_assembled
528
write_mz_header:
31 halyavin 529
	mov	edx,[additional_memory]
157 heavyiron 530
	bt	[format_flags],4
531
	jc	mz_stack_ok
532
	mov	eax,[real_code_size]
533
	dec	eax
534
	shr	eax,4
535
	inc	eax
536
	mov	[edx+0Eh],ax
537
	shl	eax,4
538
	movzx	ecx,word [edx+10h]
539
	add	eax,ecx
540
	mov	[real_code_size],eax
541
      mz_stack_ok:
31 halyavin 542
	mov	edi,[free_additional_memory]
157 heavyiron 543
	mov	eax,[number_of_relocations]
544
	shl	eax,2
545
	add	eax,1Ch
546
	sub	edi,eax
547
	xchg	edi,[free_additional_memory]
548
	mov	ecx,0Fh
549
	add	eax,0Fh
550
	and	eax,1111b
551
	sub	ecx,eax
552
	xor	al,al
553
	rep	stos byte [edi]
554
	sub	edi,[free_additional_memory]
555
	mov	ecx,edi
556
	shr	edi,4
557
	mov	word [edx],'MZ' 	; signature
558
	mov	[edx+8],di		; header size in paragraphs
559
	mov	eax,[number_of_relocations]
560
	mov	[edx+6],ax		; number of relocation entries
561
	mov	eax,[code_size]
562
	add	eax,ecx
563
	mov	esi,eax
564
	shr	esi,9
565
	and	eax,1FFh
566
	inc	si
567
	or	ax,ax
568
	jnz	mz_size_ok
569
	mov	ax,200h
570
	dec	si
571
      mz_size_ok:
31 halyavin 572
	mov	[edx+2],ax		; number of bytes in last page
157 heavyiron 573
	mov	[edx+4],si		; number of pages
574
	mov	eax,[real_code_size]
575
	dec	eax
576
	shr	eax,4
577
	inc	eax
578
	mov	esi,[code_size]
579
	dec	esi
580
	shr	esi,4
581
	inc	esi
582
	sub	eax,esi
583
	mov	[edx+0Ah],ax		; minimum memory in addition to code
584
	add	[edx+0Ch],ax		; maximum memory in addition to code
585
	salc
586
	mov	ah,al
587
	or	[edx+0Ch],ax
588
	mov	word [edx+18h],1Ch	; offset of relocation table
589
	add	[written_size],ecx
590
	call	write
591
	jc	write_failed
592
	ret
593
31 halyavin 594
 
595
	mov	[stub_file],edx
157 heavyiron 596
	or	edx,edx
597
	jnz	stub_from_file
598
	push	esi
599
	mov	edx,edi
600
	xor	eax,eax
601
	mov	ecx,20h
602
	rep	stos dword [edi]
603
	mov	eax,40h+default_stub_end-default_stub
604
	mov	cx,100h+default_stub_end-default_stub
605
	mov	word [edx],'MZ'
606
	mov	word [edx+4],1
607
	mov	word [edx+2],ax
608
	mov	word [edx+8],4
609
	mov	word [edx+0Ah],10h
610
	mov	word [edx+0Ch],0FFFFh
611
	mov	word [edx+10h],cx
612
	mov	word [edx+3Ch],ax
613
	mov	word [edx+18h],40h
614
	lea	edi,[edx+40h]
615
	mov	esi,default_stub
616
	mov	ecx,default_stub_end-default_stub
617
	rep	movs byte [edi],[esi]
618
	pop	esi
619
	jmp	stub_ok
620
      default_stub:
31 halyavin 621
	use16
157 heavyiron 622
	push	cs
623
	pop	ds
624
	mov	dx,stub_message-default_stub
625
	mov	ah,9
626
	int	21h
627
	mov	ax,4C01h
628
	int	21h
629
      stub_message db 'This program cannot be run in DOS mode.',0Dh,0Ah,24h
31 halyavin 630
	rq	1
157 heavyiron 631
      default_stub_end:
31 halyavin 632
	use32
157 heavyiron 633
      stub_from_file:
31 halyavin 634
	push	esi
157 heavyiron 635
	mov	esi,edx
636
	call	open_binary_file
637
	mov	edx,edi
638
	mov	ecx,1Ch
639
	mov	esi,edx
640
	call	read
641
	jc	binary_stub
642
	cmp	word [esi],'MZ'
643
	jne	binary_stub
644
	add	edi,1Ch
645
	movzx	ecx,word [esi+6]
646
	add	ecx,11b
647
	and	ecx,not 11b
648
	add	ecx,(40h-1Ch) shr 2
649
	lea	eax,[edi+ecx*4]
650
	cmp	edi,[display_buffer]
651
	jae	out_of_memory
652
	xor	eax,eax
653
	rep	stos dword [edi]
654
	mov	edx,40h
655
	xchg	dx,[esi+18h]
656
	xor	al,al
657
	call	lseek
658
	movzx	ecx,word [esi+6]
659
	shl	ecx,2
660
	lea	edx,[esi+40h]
661
	call	read
662
	mov	edx,edi
663
	sub	edx,esi
664
	shr	edx,4
665
	xchg	dx,[esi+8]
666
	shl	edx,4
667
	xor	al,al
668
	call	lseek
669
	movzx	ecx,word [esi+4]
670
	dec	ecx
671
	shl	ecx,9
672
	movzx	edx,word [esi+2]
673
	add	ecx,edx
674
	mov	edx,edi
675
	sub	ecx,eax
676
	je	read_stub_code
677
	jb	stub_code_ok
678
	push	ecx
679
	dec	ecx
680
	shr	ecx,3
681
	inc	ecx
682
	shl	ecx,1
683
	lea	eax,[edi+ecx*4]
684
	cmp	eax,[display_buffer]
685
	jae	out_of_memory
686
	xor	eax,eax
687
	rep	stos dword [edi]
688
	pop	ecx
689
     read_stub_code:
31 halyavin 690
	call	read
157 heavyiron 691
     stub_code_ok:
31 halyavin 692
	call	close
157 heavyiron 693
	mov	edx,edi
694
	sub	edx,esi
695
	mov	ax,dx
696
	and	ax,1FFh
697
	mov	[esi+2],ax
698
	dec	edx
699
	shr	edx,9
700
	inc	edx
701
	mov	[esi+4],dx
702
	mov	eax,edi
703
	sub	eax,esi
704
	mov	[esi+3Ch],eax
705
	pop	esi
706
      stub_ok:
31 halyavin 707
	ret
157 heavyiron 708
      binary_stub:
31 halyavin 709
	mov	esi,edi
157 heavyiron 710
	mov	ecx,40h shr 2
711
	xor	eax,eax
712
	rep	stos dword [edi]
713
	mov	al,2
714
	xor	edx,edx
715
	call	lseek
716
	push	eax
717
	xor	al,al
718
	xor	edx,edx
719
	call	lseek
720
	mov	ecx,[esp]
721
	add	ecx,40h+111b
722
	and	ecx,not 111b
723
	mov	ax,cx
724
	and	ax,1FFh
725
	mov	[esi+2],ax
726
	lea	eax,[ecx+1FFh]
727
	shr	eax,9
728
	mov	[esi+4],ax
729
	mov	[esi+3Ch],ecx
730
	sub	ecx,40h
731
	mov	eax,10000h
732
	sub	eax,ecx
733
	jbe	binary_heap_ok
734
	shr	eax,4
735
	mov	[esi+0Ah],ax
736
      binary_heap_ok:
31 halyavin 737
	mov	word [esi],'MZ'
157 heavyiron 738
	mov	word [esi+8],4
739
	mov	ax,0FFFFh
740
	mov	[esi+0Ch],ax
741
	dec	ax
742
	mov	[esi+10h],ax
743
	sub	ax,0Eh
744
	mov	[esi+0Eh],ax
745
	mov	[esi+16h],ax
746
	mov	word [esi+14h],100h
747
	mov	word [esi+18h],40h
748
	mov	eax,[display_buffer]
749
	sub	eax,ecx
750
	cmp	edi,eax
751
	jae	out_of_memory
752
	mov	edx,edi
753
	shr	ecx,2
754
	xor	eax,eax
755
	rep	stos dword [edi]
756
	pop	ecx
757
	call	read
758
	call	close
759
	pop	esi
760
	ret
761
31 halyavin 762
 
763
	xor	edx,edx
157 heavyiron 764
	mov	[machine],14Ch
765
	mov	[subsystem],3
766
	mov	[subsystem_version],3 + 10 shl 16
767
	mov	[image_base],400000h
768
	test	[format_flags],8
769
	jz	pe_settings
770
	mov	[machine],8664h
771
	mov	[subsystem_version],5 + 0 shl 16
772
	mov	[image_base_high],0
773
      pe_settings:
31 halyavin 774
	cmp	byte [esi],84h
157 heavyiron 775
	je	get_stub_name
776
	cmp	byte [esi],80h
777
	je	get_pe_base
778
	cmp	byte [esi],1Bh
779
	jne	pe_settings_ok
780
	lods	byte [esi]
781
	lods	byte [esi]
782
	test	al,80h+40h
783
	jz	subsystem_setting
784
	cmp	al,80h
785
	je	dll_flag
786
	cmp	al,81h
787
	je	wdm_flag
788
	jmp	pe_settings
789
      dll_flag:
31 halyavin 790
	bts	[format_flags],8
157 heavyiron 791
	jc	setting_already_specified
792
	jmp	pe_settings
793
      wdm_flag:
31 halyavin 794
	bts	[format_flags],9
157 heavyiron 795
	jc	setting_already_specified
796
	jmp	pe_settings
797
      subsystem_setting:
31 halyavin 798
	bts	[format_flags],7
157 heavyiron 799
	jc	setting_already_specified
800
	and	ax,3Fh
801
	mov	[subsystem],ax
802
	cmp	byte [esi],'('
803
	jne	pe_settings
804
	inc	esi
805
	cmp	byte [esi],'.'
806
	jne	invalid_value
807
	inc	esi
808
	push	edx
809
	cmp	byte [esi+11],0
810
	jne	invalid_value
811
	cmp	byte [esi+10],2
812
	ja	invalid_value
813
	mov	dx,[esi+8]
814
	cmp	dx,8000h
815
	je	zero_version
816
	mov	eax,[esi+4]
817
	cmp	dx,7
818
	jg	invalid_value
819
	mov	cx,7
820
	sub	cx,dx
821
	mov	eax,[esi+4]
822
	shr	eax,cl
823
	mov	ebx,eax
824
	shr	ebx,24
825
	cmp	bl,100
826
	jae	invalid_value
827
	and	eax,0FFFFFFh
828
	mov	ecx,100
829
	mul	ecx
830
	shrd	eax,edx,24
831
	jnc	version_value_ok
832
	inc	eax
833
      version_value_ok:
31 halyavin 834
	shl	eax,16
157 heavyiron 835
	mov	ax,bx
836
	jmp	subsystem_version_ok
837
      zero_version:
31 halyavin 838
	xor	eax,eax
157 heavyiron 839
      subsystem_version_ok:
31 halyavin 840
	pop	edx
157 heavyiron 841
	add	esi,13
842
	mov	[subsystem_version],eax
843
	jmp	pe_settings
844
      get_pe_base:
31 halyavin 845
	bts	[format_flags],10
157 heavyiron 846
	jc	setting_already_specified
847
	lods	word [esi]
848
	cmp	ah,'('
849
	jne	invalid_argument
850
	cmp	byte [esi],'.'
851
	je	invalid_value
852
	push	edx edi
853
	add	edi,[stub_size]
854
	test	[format_flags],8
855
	jnz	get_pe64_base
856
	call	get_dword_value
857
	mov	[image_base],eax
858
	jmp	pe_base_ok
859
      get_pe64_base:
31 halyavin 860
	call	get_qword_value
157 heavyiron 861
	mov	[image_base],eax
862
	mov	[image_base_high],edx
863
      pe_base_ok:
31 halyavin 864
	pop	edi edx
157 heavyiron 865
	cmp	[value_type],0
866
	jne	invalid_use_of_symbol
867
	cmp	byte [esi],84h
868
	jne	pe_settings_ok
869
      get_stub_name:
31 halyavin 870
	lods	byte [esi]
157 heavyiron 871
	lods	word [esi]
872
	cmp	ax,'('
873
	jne	invalid_argument
874
	lods	dword [esi]
875
	mov	edx,esi
876
	add	esi,eax
877
	inc	esi
878
      pe_settings_ok:
31 halyavin 879
	mov	ebp,[stub_size]
157 heavyiron 880
	or	ebp,ebp
881
	jz	make_pe_stub
882
	cmp	edx,[stub_file]
883
	je	pe_stub_ok
884
	sub	edi,[stub_size]
885
	mov	[code_start],edi
886
      make_pe_stub:
31 halyavin 887
	call	make_stub
157 heavyiron 888
	mov	eax,edi
889
	sub	eax,[code_start]
890
	mov	[stub_size],eax
891
	mov	[code_start],edi
892
	mov	ebp,eax
893
      pe_stub_ok:
31 halyavin 894
	mov	edx,edi
157 heavyiron 895
	mov	ecx,18h+0E0h
896
	test	[format_flags],8
897
	jz	zero_pe_header
898
	add	ecx,10h
899
      zero_pe_header:
31 halyavin 900
	add	ebp,ecx
157 heavyiron 901
	shr	ecx,2
902
	xor	eax,eax
903
	rep	stos dword [edi]
904
	mov	word [edx],'PE' 	; signature
905
	mov	ax,[machine]
906
	mov	word [edx+4],ax
907
	mov	dword [edx+38h],1000h	; section alignment
908
	mov	dword [edx+3Ch],200h	; file alignment
909
	mov	word [edx+40h],1	; OS version
910
	mov	eax,[subsystem_version]
911
	mov	[edx+48h],eax
912
	mov	ax,[subsystem]
913
	mov	[edx+5Ch],ax
914
	cmp	ax,1
915
	jne	pe_alignment_ok
916
	mov	eax,20h
917
	mov	dword [edx+38h],eax
918
	mov	dword [edx+3Ch],eax
919
      pe_alignment_ok:
31 halyavin 920
	mov	word [edx+1Ah],VERSION_MAJOR + VERSION_MINOR shl 8
157 heavyiron 921
	test	[format_flags],8
922
	jnz	init_pe64_specific
923
	mov	dword [edx+14h],0E0h	; size of optional header
924
	mov	dword [edx+16h],10B010Eh; flags and magic value
925
	mov	eax,[image_base]
926
	mov	dword [edx+34h],eax
927
	mov	dword [edx+60h],1000h	; stack reserve
928
	mov	dword [edx+64h],1000h	; stack commit
929
	mov	dword [edx+68h],10000h	; heap reserve
930
	mov	dword [edx+6Ch],0	; heap commit
931
	mov	dword [edx+74h],16	; number of directories
932
	jmp	pe_header_ok
933
      init_pe64_specific:
31 halyavin 934
	mov	dword [edx+14h],0F0h	; size of optional header
157 heavyiron 935
	mov	dword [edx+16h],20B002Eh; flags and magic value
936
	mov	eax,[image_base]
937
	mov	dword [edx+30h],eax
938
	mov	eax,[image_base_high]
939
	mov	dword [edx+34h],eax
940
	mov	dword [edx+60h],1000h	; stack reserve
941
	mov	dword [edx+68h],1000h	; stack commit
942
	mov	dword [edx+70h],10000h	; heap reserve
943
	mov	dword [edx+78h],0	; heap commit
944
	mov	dword [edx+84h],16	; number of directories
945
      pe_header_ok:
31 halyavin 946
	bsf	ecx,[edx+3Ch]
157 heavyiron 947
	imul	ebx,[number_of_sections],28h
948
	or	ebx,ebx
949
	jnz	reserve_space_for_section_headers
950
	mov	ebx,28h
951
      reserve_space_for_section_headers:
31 halyavin 952
	add	ebx,ebp
157 heavyiron 953
	dec	ebx
954
	shr	ebx,cl
955
	inc	ebx
956
	shl	ebx,cl
957
	sub	ebx,ebp
958
	mov	ecx,ebx
959
	mov	eax,[display_buffer]
960
	sub	eax,ecx
961
	cmp	edi,eax
962
	jae	out_of_memory
963
	shr	ecx,2
964
	xor	eax,eax
965
	rep	stos dword [edi]
966
	mov	eax,edi
967
	sub	eax,[code_start]
968
	add	eax,[stub_size]
969
	mov	[edx+54h],eax		; size of headers
970
	mov	ecx,[edx+38h]
971
	dec	ecx
972
	add	eax,ecx
973
	not	ecx
974
	and	eax,ecx
975
	bt	[format_flags],8
976
	jc	pe_entry_init_ok
977
	mov	[edx+28h],eax		; entry point rva
978
      pe_entry_init_ok:
31 halyavin 979
	mov	[number_of_sections],0
157 heavyiron 980
	movzx	ebx,word [edx+14h]
981
	lea	ebx,[edx+18h+ebx]
982
	mov	[current_section],ebx
983
	mov	dword [ebx],'.fla'
984
	mov	dword [ebx+4],'t'
985
	mov	[ebx+14h],edi
986
	mov	[ebx+0Ch],eax
987
	mov	dword [ebx+24h],0E0000060h
988
	xor	ecx,ecx
989
	not	eax
990
	not	ecx
991
	add	eax,1
992
	adc	ecx,0
993
	add	eax,edi
994
	adc	ecx,0
995
	test	[format_flags],8
996
	jnz	pe64_org
997
	sub	eax,[edx+34h]
998
	sbb	ecx,0
999
	mov	bl,2
1000
	mov	[code_type],32
1001
	jmp	pe_org_ok
1002
      pe64_org:
31 halyavin 1003
	sub	eax,[edx+30h]
157 heavyiron 1004
	sbb	ecx,[edx+34h]
1005
	mov	bl,4
1006
	mov	[code_type],64
1007
      pe_org_ok:
31 halyavin 1008
	bt	[resolver_flags],0
157 heavyiron 1009
	jc	pe_labels_type_ok
1010
	xor	bl,bl
1011
      pe_labels_type_ok:
109 heavyiron 1012
	mov	[labels_type],bl
157 heavyiron 1013
	mov	dword [org_origin],eax
1014
	mov	dword [org_origin+4],ecx
1015
	mov	[org_registers],0
1016
	mov	[org_start],edi
1017
	bt	[format_flags],8
1018
	jnc	dll_flag_ok
1019
	or	dword [edx+16h],2000h
1020
      dll_flag_ok:
31 halyavin 1021
	bt	[format_flags],9
157 heavyiron 1022
	jnc	wdm_flag_ok
1023
	or	word [edx+5Eh],2000h
1024
      wdm_flag_ok:
31 halyavin 1025
	jmp	instruction_assembled
157 heavyiron 1026
pe_section:
31 halyavin 1027
	call	close_pe_section
157 heavyiron 1028
	bts	[format_flags],5
1029
	lea	ecx,[ebx+28h]
1030
	add	edx,[edx+54h]
1031
	sub	edx,[stub_size]
1032
	cmp	ecx,edx
1033
	jbe	new_section
1034
	lea	ebx,[edx-28h]
1035
	or	[next_pass_needed],-1
1036
	push	edi
1037
	mov	edi,ebx
1038
	mov	ecx,28h shr 4
1039
	xor	eax,eax
1040
	rep	stos dword [edi]
1041
	pop	edi
1042
      new_section:
31 halyavin 1043
	mov	[ebx+0Ch],eax
157 heavyiron 1044
	lods	word [esi]
1045
	cmp	ax,'('
1046
	jne	invalid_argument
1047
	lea	edx,[esi+4]
1048
	mov	ecx,[esi]
1049
	lea	esi,[esi+4+ecx+1]
1050
	cmp	ecx,8
1051
	ja	name_too_long
1052
	xor	eax,eax
1053
	mov	[ebx],eax
1054
	mov	[ebx+4],eax
1055
	push	esi edi
1056
	mov	edi,ebx
1057
	mov	esi,edx
1058
	rep	movs byte [edi],[esi]
1059
	pop	edi esi
1060
	mov	dword [ebx+24h],0
1061
	mov	[ebx+14h],edi
1062
	mov	edx,[code_start]
1063
	mov	eax,edi
1064
	xor	ecx,ecx
1065
	sub	eax,[ebx+0Ch]
1066
	sbb	ecx,0
1067
	test	[format_flags],8
1068
	jnz	pe64_section_org
1069
	sub	eax,[edx+34h]
1070
	sbb	ecx,0
1071
	mov	[labels_type],2
1072
	mov	[code_type],32
1073
	bt	[resolver_flags],0
1074
	jc	pe_section_org_ok
1075
	mov	[labels_type],0
1076
	jmp	pe_section_org_ok
1077
      pe64_section_org:
31 halyavin 1078
	sub	eax,[edx+30h]
157 heavyiron 1079
	sbb	ecx,[edx+34h]
1080
	mov	[labels_type],4
1081
	mov	[code_type],64
1082
	bt	[resolver_flags],0
1083
	jc	pe_section_org_ok
1084
	mov	[labels_type],0
1085
      pe_section_org_ok:
31 halyavin 1086
	mov	dword [org_origin],eax
157 heavyiron 1087
	mov	dword [org_origin+4],ecx
1088
	mov	[org_registers],0
1089
	mov	[org_start],edi
1090
      get_section_flags:
31 halyavin 1091
	lods	byte [esi]
157 heavyiron 1092
	cmp	al,1Ah
1093
	je	set_directory
1094
	cmp	al,19h
1095
	je	section_flag
1096
	dec	esi
1097
	jmp	instruction_assembled
1098
      set_directory:
31 halyavin 1099
	movzx	eax,byte [esi]
157 heavyiron 1100
	inc	esi
1101
	mov	ecx,ebx
1102
	test	[format_flags],8
1103
	jnz	pe64_directory
1104
	xchg	ecx,[edx+78h+eax*8]
1105
	mov	dword [edx+78h+eax*8+4],-1
1106
	jmp	pe_directory_set
1107
      pe64_directory:
31 halyavin 1108
	xchg	ecx,[edx+88h+eax*8]
157 heavyiron 1109
	mov	dword [edx+88h+eax*8+4],-1
1110
      pe_directory_set:
31 halyavin 1111
	or	ecx,ecx
157 heavyiron 1112
	jnz	data_already_defined
1113
	push	ebx edx
1114
	call	generate_pe_data
1115
	pop	edx ebx
1116
	jmp	get_section_flags
1117
      section_flag:
31 halyavin 1118
	lods	byte [esi]
157 heavyiron 1119
	cmp	al,9
1120
	je	invalid_argument
1121
	cmp	al,11
1122
	je	invalid_argument
1123
	mov	cl,al
1124
	mov	eax,1
1125
	shl	eax,cl
1126
	test	dword [ebx+24h],eax
1127
	jnz	setting_already_specified
1128
	or	dword [ebx+24h],eax
1129
	jmp	get_section_flags
1130
      close_pe_section:
31 halyavin 1131
	mov	ebx,[current_section]
157 heavyiron 1132
	mov	edx,[code_start]
1133
	mov	eax,edi
1134
	sub	eax,[ebx+14h]
1135
	jnz	finish_section
1136
	bt	[format_flags],5
1137
	jc	finish_section
1138
	mov	eax,[ebx+0Ch]
1139
	ret
1140
      finish_section:
31 halyavin 1141
	mov	[ebx+8],eax
157 heavyiron 1142
	cmp	edi,[undefined_data_end]
1143
	jne	align_section
1144
	cmp	dword [edx+38h],1000h
1145
	jb	align_section
1146
	mov	edi,[undefined_data_start]
1147
      align_section:
31 halyavin 1148
	mov	[undefined_data_end],0
157 heavyiron 1149
	mov	ebp,edi
1150
	sub	ebp,[ebx+14h]
1151
	mov	ecx,[edx+3Ch]
1152
	dec	ecx
1153
	lea	eax,[ebp+ecx]
1154
	not	ecx
1155
	and	eax,ecx
1156
	mov	[ebx+10h],eax
1157
	sub	eax,ebp
1158
	mov	ecx,eax
1159
	xor	al,al
1160
	rep	stos byte [edi]
1161
	mov	eax,[code_start]
1162
	sub	eax,[stub_size]
1163
	sub	[ebx+14h],eax
1164
	mov	eax,[ebx+8]
1165
	or	eax,eax
1166
	jz	udata_ok
1167
	cmp	dword [ebx+10h],0
1168
	jne	udata_ok
1169
	or	byte [ebx+24h],80h
1170
      udata_ok:
31 halyavin 1171
	mov	ecx,[edx+38h]
157 heavyiron 1172
	dec	ecx
1173
	add	eax,ecx
1174
	not	ecx
1175
	and	eax,ecx
1176
	add	eax,[ebx+0Ch]
1177
	add	ebx,28h
1178
	mov	[current_section],ebx
1179
	inc	word [number_of_sections]
1180
	jz	format_limitations_exceeded
1181
	ret
1182
data_directive:
31 halyavin 1183
	cmp	[output_format],3
157 heavyiron 1184
	jne	illegal_instruction
1185
	lods	byte [esi]
1186
	cmp	al,1Ah
1187
	je	predefined_data_type
1188
	cmp	al,'('
1189
	jne	invalid_argument
1190
	call	get_byte_value
1191
	cmp	al,16
1192
	jb	data_type_ok
1193
	jmp	invalid_value
1194
      predefined_data_type:
31 halyavin 1195
	movzx	eax,byte [esi]
157 heavyiron 1196
	inc	esi
1197
      data_type_ok:
31 halyavin 1198
	mov	ebx,[current_section]
157 heavyiron 1199
	mov	ecx,edi
1200
	sub	ecx,[ebx+14h]
1201
	add	ecx,[ebx+0Ch]
1202
	mov	edx,[code_start]
1203
	test	[format_flags],8
1204
	jnz	pe64_data
1205
	xchg	ecx,[edx+78h+eax*8]
1206
	jmp	init_pe_data
1207
      pe64_data:
31 halyavin 1208
	xchg	ecx,[edx+88h+eax*8]
157 heavyiron 1209
      init_pe_data:
31 halyavin 1210
	or	ecx,ecx
157 heavyiron 1211
	jnz	data_already_defined
1212
	call	allocate_structure_data
1213
	mov	word [ebx],data_directive-assembler
1214
	mov	[ebx+2],al
1215
	mov	edx,[current_line]
1216
	mov	[ebx+4],edx
1217
	call	generate_pe_data
1218
	jmp	instruction_assembled
1219
      end_data:
31 halyavin 1220
	cmp	[output_format],3
157 heavyiron 1221
	jne	illegal_instruction
1222
	call	find_structure_data
1223
	jc	unexpected_instruction
1224
	movzx	eax,byte [ebx+2]
1225
	mov	edx,[current_section]
1226
	mov	ecx,edi
1227
	sub	ecx,[edx+14h]
1228
	add	ecx,[edx+0Ch]
1229
	mov	edx,[code_start]
1230
	test	[format_flags],8
1231
	jnz	end_pe64_data
1232
	sub	ecx,[edx+78h+eax*8]
1233
	mov	[edx+78h+eax*8+4],ecx
1234
	jmp	remove_structure_data
1235
      end_pe64_data:
31 halyavin 1236
	sub	ecx,[edx+88h+eax*8]
157 heavyiron 1237
	mov	[edx+88h+eax*8+4],ecx
1238
	jmp	remove_structure_data
1239
pe_entry:
31 halyavin 1240
	lods	byte [esi]
157 heavyiron 1241
	cmp	al,'('
1242
	jne	invalid_argument
1243
	cmp	byte [esi],'.'
1244
	je	invalid_value
1245
	test	[format_flags],8
1246
	jnz	pe64_entry
1247
	call	get_dword_value
1248
	mov	bl,2
1249
	bt	[resolver_flags],0
1250
	jc	check_pe_entry_label_type
1251
	xor	bl,bl
1252
      check_pe_entry_label_type:
109 heavyiron 1253
	cmp	[value_type],bl
157 heavyiron 1254
	je	pe_entry_ok
1255
	cmp	[error_line],0
1256
	jne	pe_entry_ok
1257
	mov	edx,[current_line]
1258
	mov	[error_line],edx
1259
	mov	[error],invalid_address
1260
      pe_entry_ok:
31 halyavin 1261
	mov	edx,[code_start]
157 heavyiron 1262
	sub	eax,[edx+34h]
1263
	mov	[edx+28h],eax
1264
	jmp	instruction_assembled
1265
      pe64_entry:
31 halyavin 1266
	call	get_qword_value
157 heavyiron 1267
	mov	bl,4
1268
	bt	[resolver_flags],0
1269
	jc	check_pe64_entry_label_type
1270
	xor	bl,bl
1271
      check_pe64_entry_label_type:
109 heavyiron 1272
	cmp	[value_type],bl
157 heavyiron 1273
	je	pe64_entry_type_ok
1274
	cmp	[error_line],0
1275
	jne	pe64_entry_type_ok
1276
	mov	edx,[current_line]
1277
	mov	[error_line],edx
1278
	mov	[error],invalid_address
1279
      pe64_entry_type_ok:
109 heavyiron 1280
	mov	ecx,[code_start]
157 heavyiron 1281
	sub	eax,[ecx+30h]
1282
	sbb	edx,[ecx+34h]
1283
	jz	pe64_entry_range_ok
1284
	mov	edx,[current_line]
1285
	mov	[error_line],edx
1286
	mov	[error],value_out_of_range
1287
      pe64_entry_range_ok:
109 heavyiron 1288
	mov	[ecx+28h],eax
157 heavyiron 1289
	jmp	instruction_assembled
1290
pe_stack:
31 halyavin 1291
	lods	byte [esi]
157 heavyiron 1292
	cmp	al,'('
1293
	jne	invalid_argument
1294
	cmp	byte [esi],'.'
1295
	je	invalid_value
1296
	test	[format_flags],8
1297
	jnz	pe64_stack
1298
	call	get_dword_value
1299
	cmp	[value_type],0
1300
	jne	invalid_use_of_symbol
1301
	mov	edx,[code_start]
1302
	mov	[edx+60h],eax
1303
	cmp	byte [esi],','
1304
	jne	default_stack_commit
1305
	lods	byte [esi]
1306
	lods	byte [esi]
1307
	cmp	al,'('
1308
	jne	invalid_argument
1309
	cmp	byte [esi],'.'
1310
	je	invalid_value
1311
	call	get_dword_value
1312
	cmp	[value_type],0
1313
	jne	invalid_use_of_symbol
1314
	mov	edx,[code_start]
1315
	mov	[edx+64h],eax
1316
	cmp	eax,[edx+60h]
1317
	ja	value_out_of_range
1318
	jmp	instruction_assembled
1319
      default_stack_commit:
31 halyavin 1320
	mov	dword [edx+64h],1000h
157 heavyiron 1321
	mov	eax,[edx+60h]
1322
	cmp	eax,1000h
1323
	ja	instruction_assembled
1324
	mov	dword [edx+64h],eax
1325
	jmp	instruction_assembled
1326
      pe64_stack:
31 halyavin 1327
	call	get_qword_value
157 heavyiron 1328
	cmp	[value_type],0
1329
	jne	invalid_use_of_symbol
1330
	mov	ecx,[code_start]
1331
	mov	[ecx+60h],eax
1332
	mov	[ecx+64h],edx
1333
	cmp	byte [esi],','
1334
	jne	default_pe64_stack_commit
1335
	lods	byte [esi]
1336
	lods	byte [esi]
1337
	cmp	al,'('
1338
	jne	invalid_argument
1339
	cmp	byte [esi],'.'
1340
	je	invalid_value
1341
	call	get_qword_value
1342
	cmp	[value_type],0
1343
	jne	invalid_use_of_symbol
1344
	mov	ecx,[code_start]
1345
	mov	[ecx+68h],eax
1346
	mov	[ecx+6Ch],edx
1347
	cmp	edx,[ecx+64h]
1348
	ja	value_out_of_range
1349
	jb	instruction_assembled
1350
	cmp	eax,[edx+60h]
1351
	ja	value_out_of_range
1352
	jmp	instruction_assembled
1353
      default_pe64_stack_commit:
31 halyavin 1354
	mov	dword [edx+68h],1000h
157 heavyiron 1355
	cmp	dword [edx+64h],0
1356
	jne	instruction_assembled
1357
	mov	eax,[edx+60h]
1358
	cmp	eax,1000h
1359
	ja	instruction_assembled
1360
	mov	dword [edx+68h],eax
1361
	jmp	instruction_assembled
1362
pe_heap:
31 halyavin 1363
	lods	byte [esi]
157 heavyiron 1364
	cmp	al,'('
1365
	jne	invalid_argument
1366
	cmp	byte [esi],'.'
1367
	je	invalid_value
1368
	test	[format_flags],8
1369
	jnz	pe64_heap
1370
	call	get_dword_value
1371
	cmp	[value_type],0
1372
	jne	invalid_use_of_symbol
1373
	mov	edx,[code_start]
1374
	mov	[edx+68h],eax
1375
	cmp	byte [esi],','
1376
	jne	instruction_assembled
1377
	lods	byte [esi]
1378
	lods	byte [esi]
1379
	cmp	al,'('
1380
	jne	invalid_argument
1381
	cmp	byte [esi],'.'
1382
	je	invalid_value
1383
	call	get_dword_value
1384
	cmp	[value_type],0
1385
	jne	invalid_use_of_symbol
1386
	mov	edx,[code_start]
1387
	mov	[edx+6Ch],eax
1388
	cmp	eax,[edx+68h]
1389
	ja	value_out_of_range
1390
	jmp	instruction_assembled
1391
      pe64_heap:
31 halyavin 1392
	call	get_qword_value
157 heavyiron 1393
	cmp	[value_type],0
1394
	jne	invalid_use_of_symbol
1395
	mov	ecx,[code_start]
1396
	mov	[ecx+70h],eax
1397
	mov	[ecx+74h],edx
1398
	cmp	byte [esi],','
1399
	jne	instruction_assembled
1400
	lods	byte [esi]
1401
	lods	byte [esi]
1402
	cmp	al,'('
1403
	jne	invalid_argument
1404
	cmp	byte [esi],'.'
1405
	je	invalid_value
1406
	call	get_qword_value
1407
	cmp	[value_type],0
1408
	jne	invalid_use_of_symbol
1409
	mov	ecx,[code_start]
1410
	mov	[ecx+78h],eax
1411
	mov	[ecx+7Ch],edx
1412
	cmp	edx,[ecx+74h]
1413
	ja	value_out_of_range
1414
	jb	instruction_assembled
1415
	cmp	eax,[edx+70h]
1416
	ja	value_out_of_range
1417
	jmp	instruction_assembled
1418
mark_pe_relocation:
31 halyavin 1419
	push	eax ebx
157 heavyiron 1420
	test	[format_flags],8
1421
	jz	check_pe32_relocation_type
370 heavyiron 1422
	cmp	[value_type],4
1423
	je	pe_relocation_type_ok
157 heavyiron 1424
      check_pe32_relocation_type:
370 heavyiron 1425
	cmp	[value_type],2
1426
	je	pe_relocation_type_ok
1427
	cmp	[error_line],0
157 heavyiron 1428
	jne	pe_relocation_type_ok
1429
	mov	eax,[current_line]
1430
	mov	[error_line],eax
1431
	mov	[error],invalid_use_of_symbol
1432
      pe_relocation_type_ok:
109 heavyiron 1433
	mov	ebx,[current_section]
157 heavyiron 1434
	mov	eax,edi
1435
	sub	eax,[ebx+14h]
1436
	add	eax,[ebx+0Ch]
1437
	mov	ebx,[free_additional_memory]
1438
	inc	[number_of_relocations]
1439
	jz	invalid_use_of_symbol
1440
	add	ebx,5
370 heavyiron 1441
	cmp	ebx,[structures_buffer]
157 heavyiron 1442
	jae	out_of_memory
1443
	mov	[free_additional_memory],ebx
1444
	mov	[ebx-5],eax
370 heavyiron 1445
	cmp	[value_type],2
1446
	je	fixup_32bit
1447
	mov	byte [ebx-1],0Ah
1448
	jmp	fixup_ok
1449
      fixup_32bit:
1450
	mov	byte [ebx-1],3
1451
      fixup_ok:
1452
	pop	ebx eax
157 heavyiron 1453
	ret
1454
generate_pe_data:
31 halyavin 1455
	cmp	al,2
157 heavyiron 1456
	je	make_pe_resource
1457
	cmp	al,5
1458
	je	make_pe_fixups
1459
	ret
1460
make_pe_fixups:
370 heavyiron 1461
	bts	[resolver_flags],0
1462
	jc	pe_relocatable_ok
1463
	or	[next_pass_needed],-1
1464
     pe_relocatable_ok:
1465
	push	esi
1466
	mov	ecx,[number_of_relocations]
1467
	mov	esi,[free_additional_memory]
1468
	lea	eax,[ecx*5]
1469
	sub	esi,eax
1470
	mov	[free_additional_memory],esi
1471
	or	[number_of_relocations],-1
1472
	xor	edx,edx
1473
	mov	ebp,edi
1474
      make_fixups:
1475
	cmp	[esi],edx
1476
	jb	store_fixup
1477
	mov	eax,edi
1478
	sub	eax,ebp
1479
	test	eax,11b
1480
	jz	fixups_block
1481
	xor	ax,ax
1482
	stos	word [edi]
1483
	add	dword [ebx],2
1484
      fixups_block:
1485
	mov	eax,edx
1486
	add	edx,1000h
1487
	cmp	[esi],edx
1488
	jae	fixups_block
1489
	stos	dword [edi]
1490
	mov	ebx,edi
1491
	mov	eax,8
1492
	stos	dword [edi]
1493
      store_fixup:
1494
	jecxz	fixups_done
1495
	add	dword [ebx],2
1496
	mov	eax,[esi]
1497
	and	ax,0FFFh
1498
	mov	dl,[esi+4]
1499
	shl	dx,12
1500
	or	ax,dx
1501
	stos	word [edi]
1502
	add	esi,5
1503
	loop	make_fixups
1504
      fixups_done:
1505
	pop	esi
1506
	ret
1507
make_pe_resource:
31 halyavin 1508
	cmp	byte [esi],82h
157 heavyiron 1509
	jne	resource_done
1510
	inc	esi
1511
	lods	word [esi]
1512
	cmp	ax,'('
1513
	jne	invalid_argument
1514
	lods	dword [esi]
1515
	mov	edx,esi
1516
	lea	esi,[esi+eax+1]
1517
	cmp	[next_pass_needed],0
1518
	je	resource_from_file
1519
	cmp	[current_pass],0
1520
	jne	reserve_space_for_resource
1521
	mov	[resource_size],0
1522
      reserve_space_for_resource:
31 halyavin 1523
	add	edi,[resource_size]
157 heavyiron 1524
	cmp	edi,[display_buffer]
1525
	ja	out_of_memory
1526
	jmp	resource_done
1527
      resource_from_file:
31 halyavin 1528
	push	esi
157 heavyiron 1529
	mov	esi,edx
1530
	call	open_binary_file
1531
	push	ebx
1532
	mov	esi,[free_additional_memory]
1533
	lea	eax,[esi+20h]
1534
	cmp	eax,[structures_buffer]
1535
	ja	out_of_memory
1536
	mov	edx,esi
1537
	mov	ecx,20h
1538
	call	read
1539
	jc	invalid_file_format
1540
	xor	eax,eax
1541
	cmp	[esi],eax
1542
	jne	invalid_file_format
1543
	mov	ax,0FFFFh
1544
	cmp	[esi+8],eax
1545
	jne	invalid_file_format
1546
	cmp	[esi+12],eax
1547
	jne	invalid_file_format
1548
	mov	eax,20h
1549
	cmp	[esi+4],eax
1550
	jne	invalid_file_format
1551
      read_resource_headers:
31 halyavin 1552
	test	eax,11b
157 heavyiron 1553
	jz	resource_file_alignment_ok
1554
	mov	edx,4
1555
	and	eax,11b
1556
	sub	edx,eax
1557
	mov	al,1
1558
	call	lseek
1559
      resource_file_alignment_ok:
31 halyavin 1560
	mov	[esi],eax
157 heavyiron 1561
	lea	edx,[esi+12]
1562
	mov	ecx,8
1563
	call	read
1564
	jc	resource_headers_ok
1565
	mov	ecx,[esi+16]
1566
	add	[esi],ecx
1567
	lea	edx,[esi+20]
1568
	sub	ecx,8
1569
	mov	[esi+16],ecx
1570
	lea	eax,[edx+ecx]
1571
	cmp	eax,[structures_buffer]
1572
	ja	out_of_memory
1573
	call	read
1574
	jc	invalid_file_format
1575
	mov	edx,[esi]
1576
	add	edx,[esi+12]
1577
	mov	eax,[esi+16]
1578
	lea	ecx,[esi+20]
1579
	lea	esi,[ecx+eax]
1580
	add	ecx,2
1581
	cmp	word [ecx-2],0FFFFh
1582
	je	resource_header_type_ok
1583
      check_resource_header_type:
31 halyavin 1584
	cmp	ecx,esi
157 heavyiron 1585
	jae	invalid_file_format
1586
	cmp	word [ecx],0
1587
	je	resource_header_type_ok
1588
	add	ecx,2
1589
	jmp	check_resource_header_type
1590
      resource_header_type_ok:
31 halyavin 1591
	add	ecx,2
157 heavyiron 1592
	cmp	word [ecx],0FFFFh
1593
	je	resource_header_name_ok
1594
      check_resource_header_name:
31 halyavin 1595
	cmp	ecx,esi
157 heavyiron 1596
	jae	invalid_file_format
1597
	cmp	word [ecx],0
1598
	je	resource_header_name_ok
1599
	add	ecx,2
1600
	jmp	check_resource_header_name
1601
      resource_header_name_ok:
31 halyavin 1602
	xor	al,al
157 heavyiron 1603
	call	lseek
1604
	jmp	read_resource_headers
1605
      resource_headers_ok:
31 halyavin 1606
	xor	eax,eax
157 heavyiron 1607
	mov	[esi],eax
1608
	mov	[resource_data],edi
1609
	lea	eax,[edi+16]
1610
	cmp	eax,[display_buffer]
1611
	jae	out_of_memory
1612
	xor	eax,eax
1613
	stos	dword [edi]
1614
	call	make_timestamp
1615
	stos	dword [edi]
1616
	xor	eax,eax
1617
	stos	dword [edi]
1618
	stos	dword [edi]
1619
	xor	ebx,ebx
1620
      make_type_name_directory:
31 halyavin 1621
	mov	esi,[free_additional_memory]
157 heavyiron 1622
	xor	edx,edx
1623
      find_type_name:
31 halyavin 1624
	cmp	dword [esi],0
157 heavyiron 1625
	je	type_name_ok
1626
	add	esi,20
1627
	cmp	word [esi],0FFFFh
1628
	je	check_next_type_name
1629
	or	ebx,ebx
1630
	jz	check_this_type_name
1631
	xor	ecx,ecx
1632
      compare_with_previous_type_name:
31 halyavin 1633
	mov	ax,[esi+ecx]
157 heavyiron 1634
	cmp	ax,[ebx+ecx]
1635
	ja	check_this_type_name
1636
	jb	check_next_type_name
1637
	add	ecx,2
1638
	mov	ax,[esi+ecx]
1639
	or	ax,[ebx+ecx]
1640
	jnz	compare_with_previous_type_name
1641
	jmp	check_next_type_name
1642
      check_this_type_name:
31 halyavin 1643
	or	edx,edx
157 heavyiron 1644
	jz	type_name_found
1645
	xor	ecx,ecx
1646
      compare_with_current_type_name:
31 halyavin 1647
	mov	ax,[esi+ecx]
157 heavyiron 1648
	cmp	ax,[edx+ecx]
1649
	ja	check_next_type_name
1650
	jb	type_name_found
1651
	add	ecx,2
1652
	mov	ax,[esi+ecx]
1653
	or	ax,[edx+ecx]
1654
	jnz	compare_with_current_type_name
1655
	jmp	same_type_name
1656
      type_name_found:
31 halyavin 1657
	mov	edx,esi
157 heavyiron 1658
      same_type_name:
31 halyavin 1659
	mov	[esi-16],edi
157 heavyiron 1660
      check_next_type_name:
31 halyavin 1661
	mov	eax,[esi-4]
157 heavyiron 1662
	add	esi,eax
1663
	jmp	find_type_name
1664
      type_name_ok:
31 halyavin 1665
	or	edx,edx
157 heavyiron 1666
	jz	type_name_directory_done
1667
	mov	ebx,edx
1668
      make_type_name_entry:
31 halyavin 1669
	mov	eax,[resource_data]
157 heavyiron 1670
	inc	word [eax+12]
1671
	lea	eax,[edi+8]
1672
	cmp	eax,[display_buffer]
1673
	jae	out_of_memory
1674
	mov	eax,ebx
1675
	stos	dword [edi]
1676
	xor	eax,eax
1677
	stos	dword [edi]
1678
	jmp	make_type_name_directory
1679
      type_name_directory_done:
31 halyavin 1680
	mov	ebx,-1
157 heavyiron 1681
      make_type_id_directory:
31 halyavin 1682
	mov	esi,[free_additional_memory]
157 heavyiron 1683
	mov	edx,10000h
1684
      find_type_id:
31 halyavin 1685
	cmp	dword [esi],0
157 heavyiron 1686
	je	type_id_ok
1687
	add	esi,20
1688
	cmp	word [esi],0FFFFh
1689
	jne	check_next_type_id
1690
	movzx	eax,word [esi+2]
1691
	cmp	eax,ebx
1692
	jle	check_next_type_id
1693
	cmp	eax,edx
1694
	jg	check_next_type_id
1695
	mov	edx,eax
1696
	mov	[esi-16],edi
1697
      check_next_type_id:
31 halyavin 1698
	mov	eax,[esi-4]
157 heavyiron 1699
	add	esi,eax
1700
	jmp	find_type_id
1701
      type_id_ok:
31 halyavin 1702
	cmp	edx,10000h
157 heavyiron 1703
	je	type_id_directory_done
1704
	mov	ebx,edx
1705
      make_type_id_entry:
31 halyavin 1706
	mov	eax,[resource_data]
157 heavyiron 1707
	inc	word [eax+14]
1708
	lea	eax,[edi+8]
1709
	cmp	eax,[display_buffer]
1710
	jae	out_of_memory
1711
	mov	eax,ebx
1712
	stos	dword [edi]
1713
	xor	eax,eax
1714
	stos	dword [edi]
1715
	jmp	make_type_id_directory
1716
      type_id_directory_done:
31 halyavin 1717
	mov	esi,[resource_data]
157 heavyiron 1718
	add	esi,10h
1719
	mov	ecx,[esi-4]
1720
	or	cx,cx
1721
	jz	resource_directories_ok
1722
      make_resource_directories:
31 halyavin 1723
	push	ecx
157 heavyiron 1724
	push	edi
1725
	mov	edx,edi
1726
	sub	edx,[resource_data]
1727
	bts	edx,31
1728
	mov	[esi+4],edx
1729
	lea	eax,[edi+16]
1730
	cmp	eax,[display_buffer]
1731
	jae	out_of_memory
1732
	xor	eax,eax
1733
	stos	dword [edi]
1734
	call	make_timestamp
1735
	stos	dword [edi]
1736
	xor	eax,eax
1737
	stos	dword [edi]
1738
	stos	dword [edi]
1739
	mov	ebp,esi
1740
	xor	ebx,ebx
1741
      make_resource_name_directory:
31 halyavin 1742
	mov	esi,[free_additional_memory]
157 heavyiron 1743
	xor	edx,edx
1744
      find_resource_name:
31 halyavin 1745
	cmp	dword [esi],0
157 heavyiron 1746
	je	resource_name_ok
1747
	push	esi
1748
	cmp	[esi+4],ebp
1749
	jne	check_next_resource_name
1750
	add	esi,20
1751
	call	skip_resource_name
1752
	cmp	word [esi],0FFFFh
1753
	je	check_next_resource_name
1754
	or	ebx,ebx
1755
	jz	check_this_resource_name
1756
	xor	ecx,ecx
1757
      compare_with_previous_resource_name:
31 halyavin 1758
	mov	ax,[esi+ecx]
157 heavyiron 1759
	cmp	ax,[ebx+ecx]
1760
	ja	check_this_resource_name
1761
	jb	check_next_resource_name
1762
	add	ecx,2
1763
	mov	ax,[esi+ecx]
1764
	or	ax,[ebx+ecx]
1765
	jnz	compare_with_previous_resource_name
1766
	jmp	check_next_resource_name
1767
      skip_resource_name:
31 halyavin 1768
	cmp	word [esi],0FFFFh
157 heavyiron 1769
	jne	skip_unicode_string
1770
	add	esi,4
1771
	ret
1772
      skip_unicode_string:
31 halyavin 1773
	add	esi,2
157 heavyiron 1774
	cmp	word [esi-2],0
1775
	jne	skip_unicode_string
1776
	ret
1777
      check_this_resource_name:
31 halyavin 1778
	or	edx,edx
157 heavyiron 1779
	jz	resource_name_found
1780
	xor	ecx,ecx
1781
      compare_with_current_resource_name:
31 halyavin 1782
	mov	ax,[esi+ecx]
157 heavyiron 1783
	cmp	ax,[edx+ecx]
1784
	ja	check_next_resource_name
1785
	jb	resource_name_found
1786
	add	ecx,2
1787
	mov	ax,[esi+ecx]
1788
	or	ax,[edx+ecx]
1789
	jnz	compare_with_current_resource_name
1790
	jmp	same_resource_name
1791
      resource_name_found:
31 halyavin 1792
	mov	edx,esi
157 heavyiron 1793
      same_resource_name:
31 halyavin 1794
	mov	eax,[esp]
157 heavyiron 1795
	mov	[eax+8],edi
1796
      check_next_resource_name:
31 halyavin 1797
	pop	esi
157 heavyiron 1798
	mov	eax,[esi+16]
1799
	lea	esi,[esi+20+eax]
1800
	jmp	find_resource_name
1801
      resource_name_ok:
31 halyavin 1802
	or	edx,edx
157 heavyiron 1803
	jz	resource_name_directory_done
1804
	mov	ebx,edx
1805
      make_resource_name_entry:
31 halyavin 1806
	mov	eax,[esp]
157 heavyiron 1807
	inc	word [eax+12]
1808
	lea	eax,[edi+8]
1809
	cmp	eax,[display_buffer]
1810
	jae	out_of_memory
1811
	mov	eax,ebx
1812
	stos	dword [edi]
1813
	xor	eax,eax
1814
	stos	dword [edi]
1815
	jmp	make_resource_name_directory
1816
      resource_name_directory_done:
31 halyavin 1817
	mov	ebx,-1
157 heavyiron 1818
      make_resource_id_directory:
31 halyavin 1819
	mov	esi,[free_additional_memory]
157 heavyiron 1820
	mov	edx,10000h
1821
      find_resource_id:
31 halyavin 1822
	cmp	dword [esi],0
157 heavyiron 1823
	je	resource_id_ok
1824
	push	esi
1825
	cmp	[esi+4],ebp
1826
	jne	check_next_resource_id
1827
	add	esi,20
1828
	call	skip_resource_name
1829
	cmp	word [esi],0FFFFh
1830
	jne	check_next_resource_id
1831
	movzx	eax,word [esi+2]
1832
	cmp	eax,ebx
1833
	jle	check_next_resource_id
1834
	cmp	eax,edx
1835
	jg	check_next_resource_id
1836
	mov	edx,eax
1837
	mov	eax,[esp]
1838
	mov	[eax+8],edi
1839
      check_next_resource_id:
31 halyavin 1840
	pop	esi
157 heavyiron 1841
	mov	eax,[esi+16]
1842
	lea	esi,[esi+20+eax]
1843
	jmp	find_resource_id
1844
      resource_id_ok:
31 halyavin 1845
	cmp	edx,10000h
157 heavyiron 1846
	je	resource_id_directory_done
1847
	mov	ebx,edx
1848
      make_resource_id_entry:
31 halyavin 1849
	mov	eax,[esp]
157 heavyiron 1850
	inc	word [eax+14]
1851
	lea	eax,[edi+8]
1852
	cmp	eax,[display_buffer]
1853
	jae	out_of_memory
1854
	mov	eax,ebx
1855
	stos	dword [edi]
1856
	xor	eax,eax
1857
	stos	dword [edi]
1858
	jmp	make_resource_id_directory
1859
      resource_id_directory_done:
31 halyavin 1860
	pop	eax
157 heavyiron 1861
	mov	esi,ebp
1862
	pop	ecx
1863
	add	esi,8
1864
	dec	cx
1865
	jnz	make_resource_directories
1866
      resource_directories_ok:
31 halyavin 1867
	shr	ecx,16
157 heavyiron 1868
	jnz	make_resource_directories
1869
	mov	esi,[resource_data]
1870
	add	esi,10h
1871
	movzx	eax,word [esi-4]
1872
	movzx	edx,word [esi-2]
1873
	add	eax,edx
1874
	lea	esi,[esi+eax*8]
1875
	push	edi			; address of language directories
1876
      update_resource_directories:
31 halyavin 1877
	cmp	esi,[esp]
157 heavyiron 1878
	je	resource_directories_updated
1879
	add	esi,10h
1880
	mov	ecx,[esi-4]
1881
	or	cx,cx
1882
	jz	language_directories_ok
1883
      make_language_directories:
31 halyavin 1884
	push	ecx
157 heavyiron 1885
	push	edi
1886
	mov	edx,edi
1887
	sub	edx,[resource_data]
1888
	bts	edx,31
1889
	mov	[esi+4],edx
1890
	lea	eax,[edi+16]
1891
	cmp	eax,[display_buffer]
1892
	jae	out_of_memory
1893
	xor	eax,eax
1894
	stos	dword [edi]
1895
	call	make_timestamp
1896
	stos	dword [edi]
1897
	xor	eax,eax
1898
	stos	dword [edi]
1899
	stos	dword [edi]
1900
	mov	ebp,esi
1901
	mov	ebx,-1
1902
      make_language_id_directory:
31 halyavin 1903
	mov	esi,[free_additional_memory]
157 heavyiron 1904
	mov	edx,10000h
1905
      find_language_id:
31 halyavin 1906
	cmp	dword [esi],0
157 heavyiron 1907
	je	language_id_ok
1908
	push	esi
1909
	cmp	[esi+8],ebp
1910
	jne	check_next_language_id
1911
	add	esi,20
1912
	mov	eax,esi
1913
	call	skip_resource_name
1914
	call	skip_resource_name
1915
	neg	eax
1916
	add	eax,esi
1917
	and	eax,11b
1918
	add	esi,eax
1919
      get_language_id:
31 halyavin 1920
	movzx	eax,word [esi+6]
157 heavyiron 1921
	cmp	eax,ebx
1922
	jle	check_next_language_id
1923
	cmp	eax,edx
1924
	jge	check_next_language_id
1925
	mov	edx,eax
1926
	mov	eax,[esp]
1927
	mov	[current_offset],eax
1928
      check_next_language_id:
31 halyavin 1929
	pop	esi
157 heavyiron 1930
	mov	eax,[esi+16]
1931
	lea	esi,[esi+20+eax]
1932
	jmp	find_language_id
1933
      language_id_ok:
31 halyavin 1934
	cmp	edx,10000h
157 heavyiron 1935
	je	language_id_directory_done
1936
	mov	ebx,edx
1937
      make_language_id_entry:
31 halyavin 1938
	mov	eax,[esp]
157 heavyiron 1939
	inc	word [eax+14]
1940
	lea	eax,[edi+8]
1941
	cmp	eax,[display_buffer]
1942
	jae	out_of_memory
1943
	mov	eax,ebx
1944
	stos	dword [edi]
1945
	mov	eax,[current_offset]
1946
	stos	dword [edi]
1947
	jmp	make_language_id_directory
1948
      language_id_directory_done:
31 halyavin 1949
	pop	eax
157 heavyiron 1950
	mov	esi,ebp
1951
	pop	ecx
1952
	add	esi,8
1953
	dec	cx
1954
	jnz	make_language_directories
1955
      language_directories_ok:
31 halyavin 1956
	shr	ecx,16
157 heavyiron 1957
	jnz	make_language_directories
1958
	jmp	update_resource_directories
1959
      resource_directories_updated:
31 halyavin 1960
	mov	esi,[resource_data]
157 heavyiron 1961
	push	edi
1962
      make_name_strings:
31 halyavin 1963
	add	esi,10h
157 heavyiron 1964
	movzx	eax,word [esi-2]
1965
	movzx	ecx,word [esi-4]
1966
	add	eax,ecx
1967
	lea	eax,[esi+eax*8]
1968
	push	eax
1969
	or	ecx,ecx
1970
	jz	string_entries_processed
1971
      process_string_entries:
31 halyavin 1972
	push	ecx
157 heavyiron 1973
	mov	edx,edi
1974
	sub	edx,[resource_data]
1975
	bts	edx,31
1976
	xchg	[esi],edx
1977
	mov	ebx,edi
1978
	xor	ax,ax
1979
	stos	word [edi]
1980
      copy_string_data:
31 halyavin 1981
	lea	eax,[edi+2]
157 heavyiron 1982
	cmp	eax,[display_buffer]
1983
	jae	out_of_memory
1984
	mov	ax,[edx]
1985
	or	ax,ax
1986
	jz	string_data_copied
1987
	stos	word [edi]
1988
	inc	word [ebx]
1989
	add	edx,2
1990
	jmp	copy_string_data
1991
      string_data_copied:
31 halyavin 1992
	add	esi,8
157 heavyiron 1993
	pop	ecx
1994
	loop	process_string_entries
1995
      string_entries_processed:
31 halyavin 1996
	pop	esi
157 heavyiron 1997
	cmp	esi,[esp]
1998
	jb	make_name_strings
1999
	mov	eax,edi
2000
	sub	eax,[resource_data]
2001
	test	al,11b
2002
	jz	resource_strings_alignment_ok
2003
	xor	ax,ax
2004
	stos	word [edi]
2005
      resource_strings_alignment_ok:
31 halyavin 2006
	pop	edx
157 heavyiron 2007
	pop	ebx			; address of language directories
2008
	mov	ebp,edi
2009
      update_language_directories:
31 halyavin 2010
	add	ebx,10h
157 heavyiron 2011
	movzx	eax,word [ebx-2]
2012
	movzx	ecx,word [ebx-4]
2013
	add	ecx,eax
2014
      make_data_records:
31 halyavin 2015
	push	ecx
157 heavyiron 2016
	mov	esi,edi
2017
	sub	esi,[resource_data]
2018
	xchg	esi,[ebx+4]
2019
	lea	eax,[edi+16]
2020
	cmp	eax,[display_buffer]
2021
	jae	out_of_memory
2022
	mov	eax,esi
2023
	stos	dword [edi]
2024
	mov	eax,[esi+12]
2025
	stos	dword [edi]
2026
	xor	eax,eax
2027
	stos	dword [edi]
2028
	stos	dword [edi]
2029
	pop	ecx
2030
	add	ebx,8
2031
	loop	make_data_records
2032
	cmp	ebx,edx
2033
	jb	update_language_directories
2034
	pop	ebx			; file handle
2035
	mov	esi,ebp
2036
	mov	ebp,edi
2037
      update_data_records:
31 halyavin 2038
	push	ebp
157 heavyiron 2039
	mov	ecx,edi
2040
	mov	eax,[current_section]
2041
	sub	ecx,[eax+14h]
2042
	add	ecx,[eax+0Ch]
2043
	xchg	ecx,[esi]
2044
	mov	edx,[ecx]
2045
	xor	al,al
2046
	call	lseek
2047
	mov	edx,edi
2048
	mov	ecx,[esi+4]
2049
	add	edi,ecx
2050
	cmp	edi,[display_buffer]
2051
	ja	out_of_memory
2052
	call	read
2053
	mov	eax,edi
2054
	sub	eax,[resource_data]
2055
	and	eax,11b
2056
	jz	resource_data_alignment_ok
2057
	mov	ecx,4
2058
	sub	ecx,eax
2059
	xor	al,al
2060
	rep	stos byte [edi]
2061
      resource_data_alignment_ok:
31 halyavin 2062
	pop	ebp
157 heavyiron 2063
	add	esi,16
2064
	cmp	esi,ebp
2065
	jb	update_data_records
2066
	pop	esi
2067
	call	close
2068
	mov	eax,edi
2069
	sub	eax,[resource_data]
2070
	mov	[resource_size],eax
2071
      resource_done:
31 halyavin 2072
	ret
157 heavyiron 2073
close_pe:
31 halyavin 2074
	call	close_pe_section
157 heavyiron 2075
	mov	edx,[code_start]
2076
	mov	[edx+50h],eax
2077
	call	make_timestamp
2078
	mov	edx,[code_start]
2079
	mov	[edx+8],eax
2080
	mov	eax,[number_of_relocations]
2081
	cmp	eax,-1
2082
	je	pe_relocations_ok
2083
	shl	eax,2
2084
	sub	[free_additional_memory],eax
2085
	btr	[resolver_flags],0
2086
	jnc	pe_relocations_ok
2087
	or	[next_pass_needed],-1
2088
      pe_relocations_ok:
109 heavyiron 2089
	mov	eax,[number_of_sections]
157 heavyiron 2090
	mov	[edx+6],ax
2091
	imul	eax,28h
2092
	movzx	ecx,word [edx+14h]
2093
	lea	eax,[eax+18h+ecx]
2094
	add	eax,[stub_size]
2095
	mov	ecx,[edx+3Ch]
2096
	dec	ecx
2097
	add	eax,ecx
2098
	not	ecx
2099
	and	eax,ecx
2100
	cmp	eax,[edx+54h]
2101
	je	pe_sections_ok
2102
	or	[next_pass_needed],-1
2103
      pe_sections_ok:
31 halyavin 2104
	xor	ecx,ecx
157 heavyiron 2105
	add	edx,78h
2106
	test	[format_flags],8
2107
	jz	process_directories
2108
	add	edx,10h
2109
      process_directories:
31 halyavin 2110
	mov	eax,[edx+ecx*8]
157 heavyiron 2111
	or	eax,eax
2112
	jz	directory_ok
2113
	cmp	dword [edx+ecx*8+4],-1
2114
	jne	directory_ok
2115
      section_data:
31 halyavin 2116
	mov	ebx,[edx+ecx*8]
157 heavyiron 2117
	mov	eax,[ebx+0Ch]
2118
	mov	[edx+ecx*8],eax 	; directory rva
2119
	mov	eax,[ebx+8]
2120
	mov	[edx+ecx*8+4],eax	; directory size
2121
      directory_ok:
31 halyavin 2122
	inc	cl
157 heavyiron 2123
	cmp	cl,10h
2124
	jb	process_directories
2125
	mov	ebx,[code_start]
2126
	sub	ebx,[stub_size]
2127
	mov	ecx,edi
2128
	sub	ecx,ebx
2129
	mov	ebp,ecx
2130
	shr	ecx,1
2131
	xor	eax,eax
2132
	cdq
2133
      calculate_checksum:
31 halyavin 2134
	mov	dx,[ebx]
157 heavyiron 2135
	add	eax,edx
2136
	mov	dx,ax
2137
	shr	eax,16
2138
	add	eax,edx
2139
	add	ebx,2
2140
	loop	calculate_checksum
2141
	add	eax,ebp
2142
	mov	ebx,[code_start]
2143
	mov	[ebx+58h],eax
2144
	ret
2145
31 halyavin 2146
 
2147
	mov	eax,[additional_memory]
157 heavyiron 2148
	mov	[symbols_stream],eax
2149
	mov	ebx,eax
2150
	add	eax,20h
2151
	cmp	eax,[structures_buffer]
2152
	jae	out_of_memory
2153
	mov	[free_additional_memory],eax
2154
	xor	eax,eax
2155
	mov	[ebx],al
2156
	mov	[ebx+4],eax
2157
	mov	[ebx+8],edi
2158
	mov	al,4
2159
	mov	[ebx+10h],eax
2160
	mov	al,60h
2161
	bt	[format_flags],0
2162
	jnc	flat_section_flags_ok
2163
	or	eax,0E0000000h
2164
      flat_section_flags_ok:
31 halyavin 2165
	mov	dword [ebx+14h],eax
157 heavyiron 2166
	mov	[current_section],ebx
2167
	mov	[number_of_sections],0
2168
	mov	dword [org_origin],edi
2169
	mov	dword [org_origin+4],0
2170
	mov	[org_registers],0
2171
	mov	[org_start],edi
2172
	mov	[org_symbol],ebx
2173
	mov	[labels_type],2
2174
	mov	[code_type],32
2175
	test	[format_flags],8
2176
	jz	instruction_assembled
2177
	mov	[labels_type],4
2178
	mov	[code_type],64
2179
	jmp	instruction_assembled
2180
coff_section:
31 halyavin 2181
	call	close_coff_section
157 heavyiron 2182
	mov	ebx,[free_additional_memory]
2183
	lea	eax,[ebx+20h]
2184
	cmp	eax,[structures_buffer]
2185
	jae	out_of_memory
2186
	mov	[free_additional_memory],eax
2187
	mov	[current_section],ebx
2188
	inc	[number_of_sections]
2189
	xor	eax,eax
2190
	mov	[ebx],al
2191
	mov	[ebx+8],edi
2192
	mov	dword [org_origin],edi
2193
	mov	dword [org_origin+4],0
2194
	mov	[org_registers],0
2195
	mov	[org_start],edi
2196
	mov	[org_symbol],ebx
2197
	mov	[labels_type],2
2198
	test	[format_flags],8
2199
	jz	coff_labels_type_ok
2200
	mov	[labels_type],4
2201
      coff_labels_type_ok:
31 halyavin 2202
	mov	[ebx+10h],eax
157 heavyiron 2203
	mov	[ebx+14h],eax
2204
	lods	word [esi]
2205
	cmp	ax,'('
2206
	jne	invalid_argument
2207
	mov	[ebx+4],esi
2208
	mov	ecx,[esi]
2209
	lea	esi,[esi+4+ecx+1]
2210
	cmp	ecx,8
2211
	ja	name_too_long
2212
      coff_section_flags:
31 halyavin 2213
	cmp	byte [esi],1Ch
157 heavyiron 2214
	je	coff_section_alignment
2215
	cmp	byte [esi],19h
2216
	jne	coff_section_settings_ok
2217
	inc	esi
2218
	lods	byte [esi]
2219
	bt	[format_flags],0
2220
	jc	coff_section_flag_ok
2221
	cmp	al,7
2222
	ja	invalid_argument
2223
      coff_section_flag_ok:
31 halyavin 2224
	mov	cl,al
157 heavyiron 2225
	mov	eax,1
2226
	shl	eax,cl
2227
	test	dword [ebx+14h],eax
2228
	jnz	setting_already_specified
2229
	or	dword [ebx+14h],eax
2230
	jmp	coff_section_flags
2231
      coff_section_alignment:
31 halyavin 2232
	bt	[format_flags],0
157 heavyiron 2233
	jnc	invalid_argument
2234
	inc	esi
2235
	lods	byte [esi]
2236
	or	al,al
2237
	jnz	invalid_argument
2238
	lods	byte [esi]
2239
	cmp	al,'('
2240
	jne	invalid_argument
2241
	cmp	byte [esi],'.'
2242
	je	invalid_value
2243
	push	ebx
2244
	call	get_dword_value
2245
	pop	ebx
2246
	cmp	[value_type],0
2247
	jne	invalid_use_of_symbol
2248
	mov	edx,eax
2249
	dec	edx
2250
	test	eax,edx
2251
	jnz	invalid_value
2252
	or	eax,eax
2253
	jz	invalid_value
2254
	cmp	eax,2000h
2255
	ja	invalid_value
2256
	bsf	edx,eax
2257
	inc	edx
2258
	shl	edx,20
2259
	or	[ebx+14h],edx
2260
	xchg	[ebx+10h],eax
2261
	or	eax,eax
2262
	jnz	setting_already_specified
2263
	jmp	coff_section_flags
2264
      coff_section_settings_ok:
31 halyavin 2265
	cmp	dword [ebx+10h],0
157 heavyiron 2266
	jne	instruction_assembled
2267
	mov	dword [ebx+10h],4
2268
	bt	[format_flags],0
2269
	jnc	instruction_assembled
2270
	or	dword [ebx+14h],300000h
2271
	jmp	instruction_assembled
2272
      close_coff_section:
31 halyavin 2273
	mov	ebx,[current_section]
157 heavyiron 2274
	mov	eax,edi
2275
	mov	edx,[ebx+8]
2276
	sub	eax,edx
2277
	mov	[ebx+0Ch],eax
2278
	xor	eax,eax
2279
	xchg	[undefined_data_end],eax
2280
	cmp	eax,edi
2281
	jne	coff_section_ok
2282
	cmp	edx,[undefined_data_start]
2283
	jne	coff_section_ok
2284
	mov	edi,edx
2285
	or	byte [ebx+14h],80h
2286
      coff_section_ok:
31 halyavin 2287
	ret
157 heavyiron 2288
mark_coff_relocation:
31 halyavin 2289
	cmp	[value_type],3
157 heavyiron 2290
	je	coff_relocation_relative
2291
	push	ebx eax
2292
	test	[format_flags],8
2293
	jnz	coff_64bit_relocation
2294
	mov	al,6
2295
	jmp	coff_relocation
2296
      coff_64bit_relocation:
31 halyavin 2297
	mov	al,1
157 heavyiron 2298
	cmp	[value_type],4
2299
	je	coff_relocation
2300
	mov	al,2
2301
	jmp	coff_relocation
2302
      coff_relocation_relative:
31 halyavin 2303
	push	ebx
157 heavyiron 2304
	bt	[format_flags],0
2305
	jnc	relative_ok
2306
	mov	ebx,[current_section]
2307
	mov	ebx,[ebx+8]
2308
	sub	ebx,edi
2309
	sub	eax,ebx
2310
	add	eax,4
2311
      relative_ok:
31 halyavin 2312
	push	eax
157 heavyiron 2313
	mov	al,20
2314
	test	[format_flags],8
2315
	jnz	relative_coff_64bit_relocation
2316
	cmp	[labels_type],2
2317
	jne	invalid_use_of_symbol
2318
	jmp	coff_relocation
2319
      relative_coff_64bit_relocation:
31 halyavin 2320
	mov	al,4
157 heavyiron 2321
	cmp	[labels_type],4
2322
	jne	invalid_use_of_symbol
2323
      coff_relocation:
31 halyavin 2324
	mov	ebx,[free_additional_memory]
157 heavyiron 2325
	add	ebx,0Ch
2326
	cmp	ebx,[structures_buffer]
2327
	jae	out_of_memory
2328
	mov	[free_additional_memory],ebx
2329
	mov	byte [ebx-0Ch],al
2330
	mov	eax,[current_section]
2331
	mov	eax,[eax+8]
2332
	neg	eax
2333
	add	eax,edi
2334
	mov	[ebx-0Ch+4],eax
2335
	mov	eax,[symbol_identifier]
2336
	mov	[ebx-0Ch+8],eax
2337
	pop	eax ebx
2338
	ret
2339
close_coff:
31 halyavin 2340
	call	close_coff_section
157 heavyiron 2341
	cmp	[next_pass_needed],0
2342
	je	coff_closed
2343
	mov	eax,[symbols_stream]
2344
	mov	[free_additional_memory],eax
2345
      coff_closed:
31 halyavin 2346
	ret
157 heavyiron 2347
coff_formatter:
31 halyavin 2348
	sub	edi,[code_start]
157 heavyiron 2349
	mov	[code_size],edi
2350
	call	prepare_default_section
2351
	mov	edi,[free_additional_memory]
2352
	mov	ebx,edi
2353
	mov	ecx,28h shr 2
2354
	imul	ecx,[number_of_sections]
2355
	add	ecx,14h shr 2
2356
	lea	eax,[edi+ecx*4]
2357
	cmp	eax,[structures_buffer]
2358
	jae	out_of_memory
2359
	xor	eax,eax
2360
	rep	stos dword [edi]
2361
	mov	word [ebx],14Ch
2362
	test	[format_flags],8
2363
	jz	coff_magic_ok
2364
	mov	word [ebx],8664h
2365
      coff_magic_ok:
31 halyavin 2366
	mov	word [ebx+12h],104h
157 heavyiron 2367
	bt	[format_flags],0
2368
	jnc	coff_flags_ok
2369
	or	byte [ebx+12h],80h
2370
      coff_flags_ok:
31 halyavin 2371
	push	ebx
157 heavyiron 2372
	call	make_timestamp
2373
	pop	ebx
2374
	mov	[ebx+4],eax
2375
	mov	eax,[number_of_sections]
2376
	mov	[ebx+2],ax
2377
	mov	esi,[symbols_stream]
2378
	xor	eax,eax
2379
	xor	ecx,ecx
2380
      enumerate_symbols:
31 halyavin 2381
	cmp	esi,[free_additional_memory]
157 heavyiron 2382
	je	symbols_enumerated
2383
	mov	dl,[esi]
2384
	or	dl,dl
2385
	jz	enumerate_section
2386
	cmp	dl,80h
2387
	je	enumerate_public
2388
	ja	enumerate_extrn
2389
	add	esi,0Ch
2390
	jmp	enumerate_symbols
2391
      enumerate_section:
31 halyavin 2392
	mov	edx,eax
157 heavyiron 2393
	shl	edx,8
2394
	mov	[esi],edx
2395
	inc	eax
2396
	inc	ecx
2397
	mov	[esi+1Eh],cx
2398
	add	esi,20h
2399
	jmp	enumerate_symbols
2400
      enumerate_public:
31 halyavin 2401
	mov	edx,eax
157 heavyiron 2402
	shl	edx,8
2403
	mov	dl,80h
2404
	mov	[esi],edx
2405
	mov	edx,[esi+8]
2406
	add	esi,10h
2407
	inc	eax
2408
	cmp	byte [edx+11],2
2409
	jne	enumerate_symbols
2410
	mov	edx,[edx+20]
2411
	cmp	byte [edx],81h
2412
	jne	enumerate_symbols
2413
	inc	eax
2414
	jmp	enumerate_symbols
2415
      enumerate_extrn:
31 halyavin 2416
	mov	edx,eax
157 heavyiron 2417
	shl	edx,8
2418
	mov	dl,81h
2419
	mov	[esi],edx
2420
	add	esi,0Ch
2421
	inc	eax
2422
	jmp	enumerate_symbols
2423
      prepare_default_section:
31 halyavin 2424
	mov	ebx,[symbols_stream]
157 heavyiron 2425
	cmp	dword [ebx+0Ch],0
2426
	jne	default_section_ok
2427
	cmp	[number_of_sections],0
2428
	je	default_section_ok
2429
	mov	edx,ebx
2430
      find_references_to_default_section:
31 halyavin 2431
	cmp	ebx,[free_additional_memory]
157 heavyiron 2432
	jne	check_reference
2433
	add	[symbols_stream],20h
2434
	ret
2435
      check_reference:
31 halyavin 2436
	mov	al,[ebx]
157 heavyiron 2437
	or	al,al
2438
	jz	skip_other_section
2439
	cmp	al,80h
2440
	je	check_public_reference
2441
	ja	next_reference
2442
	cmp	edx,[ebx+8]
2443
	je	default_section_ok
2444
      next_reference:
31 halyavin 2445
	add	ebx,0Ch
157 heavyiron 2446
	jmp	find_references_to_default_section
2447
      check_public_reference:
31 halyavin 2448
	mov	eax,[ebx+8]
157 heavyiron 2449
	add	ebx,10h
2450
	test	byte [eax+8],1
2451
	jz	find_references_to_default_section
2452
	mov	cx,[current_pass]
2453
	cmp	cx,[eax+16]
2454
	jne	find_references_to_default_section
2455
	cmp	edx,[eax+20]
2456
	je	default_section_ok
2457
	jmp	find_references_to_default_section
2458
      skip_other_section:
31 halyavin 2459
	add	ebx,20h
157 heavyiron 2460
	jmp	find_references_to_default_section
2461
      default_section_ok:
31 halyavin 2462
	inc	[number_of_sections]
157 heavyiron 2463
	ret
2464
      symbols_enumerated:
31 halyavin 2465
	mov	[ebx+0Ch],eax
157 heavyiron 2466
	mov	ebp,edi
2467
	sub	ebp,ebx
2468
	push	ebp
2469
	lea	edi,[ebx+14h]
2470
	mov	esi,[symbols_stream]
2471
      find_section:
31 halyavin 2472
	cmp	esi,[free_additional_memory]
157 heavyiron 2473
	je	sections_finished
2474
	mov	al,[esi]
2475
	or	al,al
2476
	jz	section_found
2477
	add	esi,0Ch
2478
	cmp	al,80h
2479
	jne	find_section
2480
	add	esi,4
2481
	jmp	find_section
2482
      section_found:
31 halyavin 2483
	push	esi edi
157 heavyiron 2484
	mov	esi,[esi+4]
2485
	or	esi,esi
2486
	jz	default_section
2487
	mov	ecx,[esi]
2488
	add	esi,4
2489
	rep	movs byte [edi],[esi]
2490
	jmp	section_name_ok
2491
      default_section:
31 halyavin 2492
	mov	al,'.'
157 heavyiron 2493
	stos	byte [edi]
2494
	mov	eax,'flat'
2495
	stos	dword [edi]
2496
      section_name_ok:
31 halyavin 2497
	pop	edi esi
157 heavyiron 2498
	mov	eax,[esi+0Ch]
2499
	mov	[edi+10h],eax
2500
	mov	eax,[esi+14h]
2501
	mov	[edi+24h],eax
2502
	test	al,80h
2503
	jnz	section_ptr_ok
2504
	mov	eax,[esi+8]
2505
	sub	eax,[code_start]
2506
	add	eax,ebp
2507
	mov	[edi+14h],eax
2508
      section_ptr_ok:
31 halyavin 2509
	mov	ebx,[code_start]
157 heavyiron 2510
	mov	edx,[code_size]
2511
	add	ebx,edx
2512
	add	edx,ebp
2513
	xor	ecx,ecx
2514
	add	esi,20h
2515
      find_relocations:
31 halyavin 2516
	cmp	esi,[free_additional_memory]
157 heavyiron 2517
	je	section_relocations_done
2518
	mov	al,[esi]
2519
	or	al,al
2520
	jz	section_relocations_done
2521
	cmp	al,80h
2522
	jb	add_relocation
2523
	ja	next_relocation
2524
	add	esi,10h
2525
	jmp	find_relocations
2526
      add_relocation:
31 halyavin 2527
	lea	eax,[ebx+0Ah]
157 heavyiron 2528
	cmp	eax,[display_buffer]
2529
	ja	out_of_memory
2530
	mov	eax,[esi+4]
2531
	mov	[ebx],eax
2532
	mov	eax,[esi+8]
2533
	mov	eax,[eax]
2534
	shr	eax,8
2535
	mov	[ebx+4],eax
2536
	movzx	ax,byte [esi]
2537
	mov	[ebx+8],ax
2538
	add	ebx,0Ah
2539
	inc	ecx
2540
      next_relocation:
31 halyavin 2541
	add	esi,0Ch
157 heavyiron 2542
	jmp	find_relocations
2543
      section_relocations_done:
31 halyavin 2544
	cmp	ecx,10000h
157 heavyiron 2545
	jb	section_relocations_count_16bit
2546
	bt	[format_flags],0
2547
	jnc	format_limitations_exceeded
2548
	mov	word [edi+20h],0FFFFh
2549
	or	dword [edi+24h],1000000h
2550
	mov	[edi+18h],edx
2551
	push	esi edi
2552
	push	ecx
2553
	lea	esi,[ebx-1]
2554
	add	ebx,0Ah
2555
	lea	edi,[ebx-1]
2556
	imul	ecx,0Ah
2557
	std
2558
	rep	movs byte [edi],[esi]
2559
	cld
2560
	pop	ecx
2561
	inc	esi
2562
	inc	ecx
2563
	mov	[esi],ecx
2564
	xor	eax,eax
2565
	mov	[esi+4],eax
2566
	mov	[esi+8],ax
2567
	pop	edi esi
2568
	jmp	section_relocations_ok
2569
      section_relocations_count_16bit:
31 halyavin 2570
	mov	[edi+20h],cx
157 heavyiron 2571
	jcxz	section_relocations_ok
2572
	mov	[edi+18h],edx
2573
      section_relocations_ok:
31 halyavin 2574
	sub	ebx,[code_start]
157 heavyiron 2575
	mov	[code_size],ebx
2576
	add	edi,28h
2577
	jmp	find_section
2578
      sections_finished:
31 halyavin 2579
	mov	edx,[free_additional_memory]
157 heavyiron 2580
	mov	ebx,[code_size]
2581
	add	ebp,ebx
2582
	mov	[edx+8],ebp
2583
	add	ebx,[code_start]
2584
	mov	edi,ebx
2585
	mov	ecx,[edx+0Ch]
2586
	imul	ecx,12h shr 1
2587
	xor	eax,eax
2588
	shr	ecx,1
2589
	jnc	zero_symbols_table
2590
	stos	word [edi]
2591
      zero_symbols_table:
31 halyavin 2592
	rep	stos dword [edi]
157 heavyiron 2593
	mov	edx,edi
2594
	stos	dword [edi]
2595
	mov	esi,[symbols_stream]
2596
      make_symbols_table:
109 heavyiron 2597
	cmp	esi,[free_additional_memory]
157 heavyiron 2598
	je	symbols_table_ok
2599
	mov	al,[esi]
2600
	cmp	al,80h
2601
	je	add_public_symbol
2602
	ja	add_extrn_symbol
2603
	or	al,al
2604
	jz	add_section_symbol
2605
	add	esi,0Ch
2606
	jmp	make_symbols_table
2607
      add_section_symbol:
31 halyavin 2608
	call	store_symbol_name
157 heavyiron 2609
	movzx	eax,word [esi+1Eh]
2610
	mov	[ebx+0Ch],ax
2611
	mov	byte [ebx+10h],3
2612
	add	esi,20h
2613
	add	ebx,12h
2614
	jmp	make_symbols_table
2615
      add_extrn_symbol:
31 halyavin 2616
	call	store_symbol_name
157 heavyiron 2617
	mov	byte [ebx+10h],2
2618
	add	esi,0Ch
2619
	add	ebx,12h
2620
	jmp	make_symbols_table
2621
      add_public_symbol:
31 halyavin 2622
	call	store_symbol_name
157 heavyiron 2623
	mov	eax,[esi+0Ch]
2624
	mov	[current_line],eax
2625
	mov	eax,[esi+8]
2626
	test	byte [eax+8],1
2627
	jz	undefined_symbol
2628
	mov	cx,[current_pass]
2629
	cmp	cx,[eax+16]
2630
	jne	undefined_symbol
2631
	mov	cl,[eax+11]
2632
	or	cl,cl
2633
	jz	public_constant
2634
	test	[format_flags],8
2635
	jnz	check_64bit_public_symbol
2636
	cmp	cl,2
2637
	je	public_symbol_type_ok
2638
	jmp	invalid_use_of_symbol
2639
      check_64bit_public_symbol:
31 halyavin 2640
	cmp	cl,4
157 heavyiron 2641
	jne	invalid_use_of_symbol
2642
      public_symbol_type_ok:
31 halyavin 2643
	mov	ecx,[eax+20]
157 heavyiron 2644
	cmp	byte [ecx],81h
2645
	je	alias_symbol
2646
	cmp	byte [ecx],0
2647
	jne	invalid_use_of_symbol
2648
	mov	cx,[ecx+1Eh]
2649
	mov	[ebx+0Ch],cx
2650
      public_symbol_section_ok:
31 halyavin 2651
	cmp	dword [eax+4],0
157 heavyiron 2652
	je	store_public_symbol
2653
	cmp	dword [eax+4],-1
2654
	jne	value_out_of_range
2655
	bt	dword [eax],31
2656
	jnc	value_out_of_range
2657
      store_public_symbol:
31 halyavin 2658
	mov	eax,[eax]
157 heavyiron 2659
	mov	[ebx+8],eax
2660
	mov	byte [ebx+10h],2
2661
	add	esi,10h
2662
	add	ebx,12h
2663
	jmp	make_symbols_table
2664
      alias_symbol:
31 halyavin 2665
	bt	[format_flags],0
157 heavyiron 2666
	jnc	invalid_use_of_symbol
2667
	mov	ecx,[eax]
2668
	or	ecx,[eax+4]
2669
	jnz	invalid_use_of_symbol
2670
	mov	byte [ebx+10h],69h
2671
	mov	byte [ebx+11h],1
2672
	add	ebx,12h
2673
	mov	ecx,[eax+20]
2674
	mov	ecx,[ecx]
2675
	shr	ecx,8
2676
	mov	[ebx],ecx
2677
	mov	byte [ebx+4],3
2678
	add	esi,10h
2679
	add	ebx,12h
2680
	jmp	make_symbols_table
2681
      public_constant:
31 halyavin 2682
	mov	word [ebx+0Ch],0FFFFh
157 heavyiron 2683
	jmp	public_symbol_section_ok
2684
      symbols_table_ok:
31 halyavin 2685
	mov	eax,edi
157 heavyiron 2686
	sub	eax,edx
2687
	mov	[edx],eax
2688
	sub	edi,[code_start]
2689
	mov	[code_size],edi
2690
	mov	[written_size],0
2691
	mov	edx,[output_file]
2692
	call	create
2693
	jc	write_failed
2694
	mov	edx,[free_additional_memory]
2695
	pop	ecx
2696
	add	[written_size],ecx
2697
	call	write
2698
	jc	write_failed
2699
	jmp	write_output
2700
      store_symbol_name:
31 halyavin 2701
	push	esi
157 heavyiron 2702
	mov	esi,[esi+4]
2703
	or	esi,esi
2704
	jz	default_name
2705
	lods	dword [esi]
2706
	mov	ecx,eax
2707
	cmp	ecx,8
2708
	ja	add_string
2709
	push	edi
2710
	mov	edi,ebx
2711
	rep	movs byte [edi],[esi]
2712
	pop	edi esi
2713
	ret
2714
      default_name:
31 halyavin 2715
	mov	dword [ebx],'.fla'
157 heavyiron 2716
	mov	dword [ebx+4],'t'
2717
	pop	esi
2718
	ret
2719
      add_string:
31 halyavin 2720
	mov	eax,edi
157 heavyiron 2721
	sub	eax,edx
2722
	mov	[ebx+4],eax
2723
	inc	ecx
2724
	rep	movs byte [edi],[esi]
2725
	pop	esi
2726
	ret
2727
31 halyavin 2728
 
2729
	test	[format_flags],8
157 heavyiron 2730
	jnz	format_elf64
2731
	mov	edx,edi
2732
	mov	ecx,34h shr 2
2733
	lea	eax,[edi+ecx*4]
2734
	cmp	eax,[display_buffer]
2735
	jae	out_of_memory
2736
	xor	eax,eax
2737
	rep	stos dword [edi]
2738
	mov	dword [edx],7Fh + 'ELF' shl 8
2739
	mov	al,1
2740
	mov	[edx+4],al
2741
	mov	[edx+5],al
2742
	mov	[edx+6],al
2743
	mov	[edx+14h],al
2744
	mov	byte [edx+12h],3
2745
	mov	byte [edx+28h],34h
2746
	mov	byte [edx+2Eh],28h
2747
	mov	[code_type],32
2748
	cmp	word [esi],1D19h
2749
	je	format_elf_exe
2750
	mov	[labels_type],2
2751
      elf_header_ok:
31 halyavin 2752
	mov	byte [edx+10h],1
157 heavyiron 2753
	mov	eax,[additional_memory]
2754
	mov	[symbols_stream],eax
2755
	mov	ebx,eax
2756
	add	eax,20h
2757
	cmp	eax,[structures_buffer]
2758
	jae	out_of_memory
2759
	mov	[free_additional_memory],eax
2760
	xor	eax,eax
2761
	mov	[current_section],ebx
2762
	mov	[number_of_sections],eax
2763
	mov	dword [org_origin],edi
2764
	mov	dword [org_origin+4],eax
2765
	mov	[org_registers],eax
2766
	mov	[org_start],edi
2767
	mov	[org_symbol],ebx
2768
	mov	[ebx],al
2769
	mov	[ebx+4],eax
2770
	mov	[ebx+8],edi
2771
	mov	al,111b
2772
	mov	[ebx+14h],eax
2773
	mov	al,4
2774
	mov	[ebx+10h],eax
2775
	test	[format_flags],8
2776
	jz	instruction_assembled
2777
	mov	byte [ebx+10h],8
2778
	jmp	instruction_assembled
2779
      format_elf64:
31 halyavin 2780
	mov	edx,edi
157 heavyiron 2781
	mov	ecx,40h shr 2
2782
	lea	eax,[edi+ecx*4]
2783
	cmp	eax,[display_buffer]
2784
	jae	out_of_memory
2785
	xor	eax,eax
2786
	rep	stos dword [edi]
2787
	mov	dword [edx],7Fh + 'ELF' shl 8
2788
	mov	al,1
2789
	mov	[edx+5],al
2790
	mov	[edx+6],al
2791
	mov	[edx+14h],al
2792
	mov	byte [edx+4],2
2793
	mov	byte [edx+12h],62
2794
	mov	byte [edx+34h],40h
2795
	mov	byte [edx+3Ah],40h
2796
	mov	[code_type],64
2797
	cmp	word [esi],1D19h
2798
	je	format_elf64_exe
2799
	mov	[labels_type],4
2800
	jmp	elf_header_ok
2801
elf_section:
31 halyavin 2802
	bt	[format_flags],0
157 heavyiron 2803
	jc	illegal_instruction
2804
	call	close_coff_section
2805
	mov	ebx,[free_additional_memory]
2806
	lea	eax,[ebx+20h]
2807
	cmp	eax,[structures_buffer]
2808
	jae	out_of_memory
2809
	mov	[free_additional_memory],eax
2810
	mov	[current_section],ebx
2811
	inc	word [number_of_sections]
2812
	jz	format_limitations_exceeded
2813
	xor	eax,eax
2814
	mov	[ebx],al
2815
	mov	[ebx+8],edi
2816
	mov	dword [org_origin],edi
2817
	mov	dword [org_origin+4],0
2818
	mov	[org_registers],0
2819
	mov	[org_start],edi
2820
	mov	[org_symbol],ebx
2821
	test	[format_flags],8
2822
	jnz	elf64_labels_type
2823
	mov	[labels_type],2
2824
	jmp	elf_labels_type_ok
2825
      elf64_labels_type:
31 halyavin 2826
	mov	[labels_type],4
157 heavyiron 2827
      elf_labels_type_ok:
31 halyavin 2828
	mov	[ebx+10h],eax
157 heavyiron 2829
	mov	al,10b
2830
	mov	[ebx+14h],eax
2831
	lods	word [esi]
2832
	cmp	ax,'('
2833
	jne	invalid_argument
2834
	mov	[ebx+4],esi
2835
	mov	ecx,[esi]
2836
	lea	esi,[esi+4+ecx+1]
2837
      elf_section_flags:
31 halyavin 2838
	cmp	byte [esi],1Ch
157 heavyiron 2839
	je	elf_section_alignment
2840
	cmp	byte [esi],19h
2841
	jne	elf_section_settings_ok
2842
	inc	esi
2843
	lods	byte [esi]
2844
	sub	al,28
2845
	xor	al,11b
2846
	test	al,not 10b
2847
	jnz	invalid_argument
2848
	mov	cl,al
2849
	mov	al,1
2850
	shl	al,cl
2851
	test	byte [ebx+14h],al
2852
	jnz	setting_already_specified
2853
	or	byte [ebx+14h],al
2854
	jmp	elf_section_flags
2855
      elf_section_alignment:
31 halyavin 2856
	inc	esi
157 heavyiron 2857
	lods	byte [esi]
2858
	or	al,al
2859
	jnz	invalid_argument
2860
	lods	byte [esi]
2861
	cmp	al,'('
2862
	jne	invalid_argument
2863
	cmp	byte [esi],'.'
2864
	je	invalid_value
2865
	push	ebx
2866
	call	get_dword_value
2867
	pop	ebx
2868
	cmp	[value_type],0
2869
	jne	invalid_use_of_symbol
2870
	mov	edx,eax
2871
	dec	edx
2872
	test	eax,edx
2873
	jnz	invalid_value
2874
	or	eax,eax
2875
	jz	invalid_value
2876
	xchg	[ebx+10h],eax
2877
	or	eax,eax
2878
	jnz	setting_already_specified
2879
	jmp	elf_section_flags
2880
      elf_section_settings_ok:
31 halyavin 2881
	cmp	dword [ebx+10h],0
157 heavyiron 2882
	jne	instruction_assembled
2883
	mov	dword [ebx+10h],4
2884
	test	[format_flags],8
2885
	jz	instruction_assembled
2886
	mov	byte [ebx+10h],8
2887
	jmp	instruction_assembled
2888
mark_elf_relocation:
31 halyavin 2889
	cmp	[value_type],3
157 heavyiron 2890
	je	elf_relocation_relative
2891
	cmp	[value_type],7
174 heavyiron 2892
	je	elf_relocation_relative
2893
	push	ebx eax
157 heavyiron 2894
	cmp	[value_type],5
174 heavyiron 2895
	je	elf_gotoff_relocation
157 heavyiron 2896
	ja	invalid_use_of_symbol
174 heavyiron 2897
	mov	al,1			; R_386_32 / R_AMD64_64
2898
	test	[format_flags],8
157 heavyiron 2899
	jz	coff_relocation
2900
	cmp	[value_type],4
2901
	je	coff_relocation
2902
	mov	al,11			; R_AMD64_32S
174 heavyiron 2903
	jmp	coff_relocation
157 heavyiron 2904
      elf_gotoff_relocation:
109 heavyiron 2905
	test	[format_flags],8
174 heavyiron 2906
	jnz	invalid_use_of_symbol
2907
	mov	al,9			; R_386_GOTOFF
2908
	jmp	coff_relocation
157 heavyiron 2909
      elf_relocation_relative:
31 halyavin 2910
	cmp	[labels_type],0
157 heavyiron 2911
	je	invalid_use_of_symbol
2912
	push	ebx
2913
	mov	ebx,[current_section]
2914
	mov	ebx,[ebx+8]
2915
	sub	ebx,edi
2916
	sub	eax,ebx
2917
	push	eax
2918
	mov	al,2			; R_386_PC32 / R_AMD64_PC32
174 heavyiron 2919
	cmp	[value_type],3
2920
	je	coff_relocation
2921
	mov	al,4			; R_386_PLT32 / R_AMD64_PLT32
2922
	jmp	coff_relocation
157 heavyiron 2923
close_elf:
31 halyavin 2924
	bt	[format_flags],0
157 heavyiron 2925
	jc	close_elf_exe
2926
	call	close_coff_section
2927
	cmp	[next_pass_needed],0
2928
	je	elf_closed
2929
	mov	eax,[symbols_stream]
2930
	mov	[free_additional_memory],eax
2931
      elf_closed:
31 halyavin 2932
	ret
157 heavyiron 2933
elf_formatter:
31 halyavin 2934
	push	edi
157 heavyiron 2935
	call	prepare_default_section
2936
	mov	esi,[symbols_stream]
2937
	mov	edi,[free_additional_memory]
2938
	xor	eax,eax
2939
	mov	ecx,4
2940
	rep	stos dword [edi]
2941
	test	[format_flags],8
2942
	jz	find_first_section
2943
	mov	ecx,2
2944
	rep	stos dword [edi]
2945
      find_first_section:
31 halyavin 2946
	mov	al,[esi]
157 heavyiron 2947
	or	al,al
2948
	jz	first_section_found
2949
	cmp	al,80h
2950
	jne	skip_other_symbol
2951
	add	esi,4
2952
      skip_other_symbol:
31 halyavin 2953
	add	esi,0Ch
157 heavyiron 2954
	jmp	find_first_section
2955
      first_section_found:
31 halyavin 2956
	mov	ebx,esi
157 heavyiron 2957
	mov	ebp,esi
2958
	add	esi,20h
2959
	xor	ecx,ecx
2960
	xor	edx,edx
2961
      find_next_section:
31 halyavin 2962
	cmp	esi,[free_additional_memory]
157 heavyiron 2963
	je	make_section_symbol
2964
	mov	al,[esi]
2965
	or	al,al
2966
	jz	make_section_symbol
2967
	cmp	al,80h
2968
	je	skip_public
2969
	ja	skip_extrn
2970
	or	byte [ebx+14h],40h
2971
      skip_extrn:
31 halyavin 2972
	add	esi,0Ch
157 heavyiron 2973
	jmp	find_next_section
2974
      skip_public:
31 halyavin 2975
	add	esi,10h
157 heavyiron 2976
	jmp	find_next_section
2977
      make_section_symbol:
31 halyavin 2978
	mov	eax,edi
157 heavyiron 2979
	xchg	eax,[ebx+4]
2980
	stos	dword [edi]
2981
	test	[format_flags],8
2982
	jnz	elf64_section_symbol
2983
	xor	eax,eax
2984
	stos	dword [edi]
2985
	stos	dword [edi]
2986
	call	store_section_index
2987
	jmp	section_symbol_ok
2988
      store_section_index:
31 halyavin 2989
	inc	ecx
157 heavyiron 2990
	mov	eax,ecx
2991
	shl	eax,8
2992
	mov	[ebx],eax
2993
	inc	dx
2994
	jz	format_limitations_exceeded
2995
	mov	eax,edx
2996
	shl	eax,16
2997
	mov	al,3
2998
	test	byte [ebx+14h],40h
2999
	jz	section_index_ok
3000
	or	ah,-1
3001
	inc	dx
3002
	jz	format_limitations_exceeded
3003
      section_index_ok:
31 halyavin 3004
	stos	dword [edi]
157 heavyiron 3005
	ret
3006
      elf64_section_symbol:
31 halyavin 3007
	call	store_section_index
157 heavyiron 3008
	xor	eax,eax
3009
	stos	dword [edi]
3010
	stos	dword [edi]
3011
	stos	dword [edi]
3012
	stos	dword [edi]
3013
      section_symbol_ok:
31 halyavin 3014
	mov	ebx,esi
157 heavyiron 3015
	add	esi,20h
3016
	cmp	ebx,[free_additional_memory]
3017
	jne	find_next_section
3018
	inc	dx
3019
	jz	format_limitations_exceeded
3020
	mov	[current_section],edx
3021
	mov	esi,[symbols_stream]
3022
      find_other_symbols:
31 halyavin 3023
	cmp	esi,[free_additional_memory]
157 heavyiron 3024
	je	elf_symbol_table_ok
3025
	mov	al,[esi]
3026
	or	al,al
3027
	jz	skip_section
3028
	cmp	al,80h
3029
	je	make_public_symbol
3030
	ja	make_extrn_symbol
3031
	add	esi,0Ch
3032
	jmp	find_other_symbols
3033
      skip_section:
31 halyavin 3034
	add	esi,20h
157 heavyiron 3035
	jmp	find_other_symbols
3036
      make_public_symbol:
31 halyavin 3037
	mov	eax,[esi+0Ch]
157 heavyiron 3038
	mov	[current_line],eax
3039
	mov	ebx,[esi+8]
3040
	test	byte [ebx+8],1
3041
	jz	undefined_symbol
3042
	mov	ax,[current_pass]
3043
	cmp	ax,[ebx+16]
3044
	jne	undefined_symbol
3045
	mov	dl,[ebx+11]
3046
	or	dl,dl
3047
	jz	public_absolute
3048
	mov	eax,[ebx+20]
3049
	cmp	byte [eax],0
3050
	jne	invalid_use_of_symbol
3051
	mov	eax,[eax+4]
3052
	test	[format_flags],8
3053
	jnz	elf64_public
3054
	cmp	dl,2
3055
	jne	invalid_use_of_symbol
3056
	mov	dx,[eax+0Eh]
3057
	jmp	section_for_public_ok
3058
      elf64_public:
31 halyavin 3059
	cmp	dl,4
157 heavyiron 3060
	jne	invalid_use_of_symbol
3061
	mov	dx,[eax+6]
3062
	jmp	section_for_public_ok
3063
      public_absolute:
31 halyavin 3064
	mov	dx,0FFF1h
157 heavyiron 3065
      section_for_public_ok:
31 halyavin 3066
	mov	eax,[esi+4]
157 heavyiron 3067
	stos	dword [edi]
3068
	test	[format_flags],8
3069
	jnz	elf64_public_symbol
3070
	call	get_public_value
3071
	stos	dword [edi]
3072
	xor	eax,eax
3073
	mov	al,[ebx+10]
3074
	stos	dword [edi]
3075
	mov	eax,edx
3076
	shl	eax,16
3077
	mov	al,10h
3078
	cmp	byte [ebx+10],0
3079
	je	elf_public_function
3080
	or	al,1
3081
	jmp	store_elf_public_info
3082
      elf_public_function:
109 heavyiron 3083
	or	al,2
157 heavyiron 3084
      store_elf_public_info:
109 heavyiron 3085
	stos	dword [edi]
157 heavyiron 3086
	jmp	public_symbol_ok
3087
      elf64_public_symbol:
31 halyavin 3088
	mov	eax,edx
157 heavyiron 3089
	shl	eax,16
3090
	mov	al,10h
3091
	cmp	byte [ebx+10],0
3092
	je	elf64_public_function
3093
	or	al,1
3094
	jmp	store_elf64_public_info
3095
      elf64_public_function:
109 heavyiron 3096
	or	al,2
157 heavyiron 3097
      store_elf64_public_info:
109 heavyiron 3098
	stos	dword [edi]
157 heavyiron 3099
	call	get_public_value
3100
	stos	dword [edi]
3101
	xor	eax,eax
3102
	stos	dword [edi]
3103
	mov	al,[ebx+10]
3104
	stos	dword [edi]
3105
	xor	al,al
3106
	stos	dword [edi]
3107
      public_symbol_ok:
31 halyavin 3108
	inc	ecx
157 heavyiron 3109
	mov	eax,ecx
3110
	shl	eax,8
3111
	mov	al,80h
3112
	mov	[esi],eax
3113
	add	esi,10h
3114
	jmp	find_other_symbols
3115
      get_public_value:
31 halyavin 3116
	mov	eax,[ebx]
157 heavyiron 3117
	cmp	dword [ebx+4],0
3118
	je	public_value_ok
3119
	cmp	dword [ebx+4],-1
3120
	jne	value_out_of_range
3121
	bt	eax,31
3122
	jnc	value_out_of_range
3123
      public_value_ok:
31 halyavin 3124
	ret
157 heavyiron 3125
      make_extrn_symbol:
31 halyavin 3126
	mov	eax,[esi+4]
157 heavyiron 3127
	stos	dword [edi]
3128
	test	[format_flags],8
3129
	jnz	elf64_extrn_symbol
3130
	xor	eax,eax
3131
	stos	dword [edi]
3132
	mov	eax,[esi+8]
3133
	stos	dword [edi]
3134
	mov	eax,10h
3135
	stos	dword [edi]
3136
	jmp	extrn_symbol_ok
3137
      elf64_extrn_symbol:
31 halyavin 3138
	mov	eax,10h
157 heavyiron 3139
	stos	dword [edi]
3140
	xor	al,al
3141
	stos	dword [edi]
3142
	stos	dword [edi]
3143
	mov	eax,[esi+8]
3144
	stos	dword [edi]
3145
	xor	eax,eax
3146
	stos	dword [edi]
3147
      extrn_symbol_ok:
31 halyavin 3148
	inc	ecx
157 heavyiron 3149
	mov	eax,ecx
3150
	shl	eax,8
3151
	mov	al,81h
3152
	mov	[esi],eax
3153
	add	esi,0Ch
3154
	jmp	find_other_symbols
3155
      elf_symbol_table_ok:
31 halyavin 3156
	mov	edx,edi
157 heavyiron 3157
	mov	ebx,[free_additional_memory]
3158
	xor	al,al
3159
	stos	byte [edi]
3160
	add	edi,16
3161
	mov	[edx+1],edx
3162
	add	ebx,10h
3163
	test	[format_flags],8
3164
	jz	make_string_table
3165
	add	ebx,8
3166
      make_string_table:
31 halyavin 3167
	cmp	ebx,edx
157 heavyiron 3168
	je	elf_string_table_ok
3169
	test	[format_flags],8
3170
	jnz	make_elf64_string
3171
	cmp	byte [ebx+0Dh],0
3172
	je	rel_prefix_ok
3173
	mov	byte [ebx+0Dh],0
3174
	mov	eax,'.rel'
3175
	stos	dword [edi]
3176
      rel_prefix_ok:
31 halyavin 3177
	mov	esi,edi
157 heavyiron 3178
	sub	esi,edx
3179
	xchg	esi,[ebx]
3180
	add	ebx,10h
3181
      make_elf_string:
31 halyavin 3182
	or	esi,esi
157 heavyiron 3183
	jz	default_string
3184
	lods	dword [esi]
3185
	mov	ecx,eax
3186
	rep	movs byte [edi],[esi]
3187
	xor	al,al
3188
	stos	byte [edi]
3189
	jmp	make_string_table
3190
      make_elf64_string:
31 halyavin 3191
	cmp	byte [ebx+5],0
157 heavyiron 3192
	je	elf64_rel_prefix_ok
3193
	mov	byte [ebx+5],0
3194
	mov	eax,'.rel'
3195
	stos	dword [edi]
3196
	mov	al,'a'
3197
	stos	byte [edi]
3198
      elf64_rel_prefix_ok:
31 halyavin 3199
	mov	esi,edi
157 heavyiron 3200
	sub	esi,edx
3201
	xchg	esi,[ebx]
3202
	add	ebx,18h
3203
	jmp	make_elf_string
3204
      default_string:
31 halyavin 3205
	mov	eax,'.fla'
157 heavyiron 3206
	stos	dword [edi]
3207
	mov	ax,'t'
3208
	stos	word [edi]
3209
	jmp	make_string_table
3210
      elf_string_table_ok:
31 halyavin 3211
	mov	[edx+1+8],edi
157 heavyiron 3212
	mov	ebx,[code_start]
3213
	mov	eax,edi
3214
	sub	eax,[free_additional_memory]
3215
	test	[format_flags],8
3216
	jnz	finish_elf64_header
3217
	mov	[ebx+20h],eax
3218
	mov	eax,[current_section]
3219
	inc	ax
3220
	jz	format_limitations_exceeded
3221
	mov	[ebx+32h],ax
3222
	inc	ax
3223
	jz	format_limitations_exceeded
3224
	mov	[ebx+30h],ax
3225
	jmp	elf_header_finished
3226
      finish_elf64_header:
31 halyavin 3227
	mov	[ebx+28h],eax
157 heavyiron 3228
	mov	eax,[current_section]
3229
	inc	ax
3230
	jz	format_limitations_exceeded
3231
	mov	[ebx+3Eh],ax
3232
	inc	ax
3233
	jz	format_limitations_exceeded
3234
	mov	[ebx+3Ch],ax
3235
      elf_header_finished:
31 halyavin 3236
	xor	eax,eax
157 heavyiron 3237
	mov	ecx,10
3238
	rep	stos dword [edi]
3239
	test	[format_flags],8
3240
	jz	elf_null_section_ok
3241
	mov	ecx,6
3242
	rep	stos dword [edi]
3243
      elf_null_section_ok:
31 halyavin 3244
	mov	esi,ebp
157 heavyiron 3245
	xor	ecx,ecx
3246
      make_section_entry:
31 halyavin 3247
	mov	ebx,edi
157 heavyiron 3248
	mov	eax,[esi+4]
3249
	mov	eax,[eax]
3250
	stos	dword [edi]
3251
	mov	eax,1
3252
	cmp	dword [esi+0Ch],0
3253
	je	bss_section
3254
	test	byte [esi+14h],80h
3255
	jz	section_type_ok
3256
      bss_section:
31 halyavin 3257
	mov	al,8
157 heavyiron 3258
      section_type_ok:
31 halyavin 3259
	stos	dword [edi]
157 heavyiron 3260
	mov	eax,[esi+14h]
3261
	and	al,3Fh
3262
	call	store_elf_machine_word
3263
	xor	eax,eax
3264
	call	store_elf_machine_word
3265
	mov	eax,[esi+8]
3266
	mov	[image_base],eax
3267
	sub	eax,[code_start]
3268
	call	store_elf_machine_word
3269
	mov	eax,[esi+0Ch]
3270
	call	store_elf_machine_word
3271
	xor	eax,eax
3272
	stos	dword [edi]
3273
	stos	dword [edi]
3274
	mov	eax,[esi+10h]
3275
	call	store_elf_machine_word
3276
	xor	eax,eax
3277
	call	store_elf_machine_word
3278
	inc	ecx
3279
	add	esi,20h
3280
	xchg	edi,[esp]
3281
	mov	ebp,edi
3282
      convert_relocations:
31 halyavin 3283
	cmp	esi,[free_additional_memory]
157 heavyiron 3284
	je	relocations_converted
3285
	mov	al,[esi]
3286
	or	al,al
3287
	jz	relocations_converted
3288
	cmp	al,80h
3289
	jb	make_relocation_entry
3290
	ja	relocation_entry_ok
3291
	add	esi,10h
3292
	jmp	convert_relocations
3293
      make_relocation_entry:
31 halyavin 3294
	test	[format_flags],8
157 heavyiron 3295
	jnz	make_elf64_relocation_entry
3296
	mov	eax,[esi+4]
3297
	stos	dword [edi]
3298
	mov	eax,[esi+8]
3299
	mov	eax,[eax]
3300
	mov	al,[esi]
3301
	stos	dword [edi]
3302
	jmp	relocation_entry_ok
3303
      make_elf64_relocation_entry:
31 halyavin 3304
	mov	eax,[esi+4]
157 heavyiron 3305
	stos	dword [edi]
3306
	xor	eax,eax
3307
	stos	dword [edi]
3308
	movzx	eax,byte [esi]
3309
	stos	dword [edi]
3310
	mov	eax,[esi+8]
3311
	mov	eax,[eax]
3312
	shr	eax,8
3313
	stos	dword [edi]
3314
	xor	eax,eax
3315
	stos	dword [edi]
3316
	stos	dword [edi]
3317
      relocation_entry_ok:
31 halyavin 3318
	add	esi,0Ch
157 heavyiron 3319
	jmp	convert_relocations
3320
      store_elf_machine_word:
31 halyavin 3321
	stos	dword [edi]
157 heavyiron 3322
	test	[format_flags],8
3323
	jz	elf_machine_word_ok
3324
	mov	dword [edi],0
3325
	add	edi,4
3326
      elf_machine_word_ok:
31 halyavin 3327
	ret
157 heavyiron 3328
      relocations_converted:
31 halyavin 3329
	cmp	edi,ebp
157 heavyiron 3330
	xchg	edi,[esp]
3331
	je	rel_section_ok
3332
	mov	eax,[ebx]
3333
	sub	eax,4
3334
	test	[format_flags],8
3335
	jz	store_relocations_name_offset
3336
	dec	eax
3337
      store_relocations_name_offset:
31 halyavin 3338
	stos	dword [edi]
157 heavyiron 3339
	test	[format_flags],8
3340
	jnz	rela_section
3341
	mov	eax,9
3342
	jmp	store_relocations_type
3343
      rela_section:
31 halyavin 3344
	mov	eax,4
157 heavyiron 3345
      store_relocations_type:
31 halyavin 3346
	stos	dword [edi]
157 heavyiron 3347
	xor	al,al
3348
	call	store_elf_machine_word
3349
	call	store_elf_machine_word
3350
	mov	eax,ebp
3351
	sub	eax,[code_start]
3352
	call	store_elf_machine_word
3353
	mov	eax,[esp]
3354
	sub	eax,ebp
3355
	call	store_elf_machine_word
3356
	mov	eax,[current_section]
3357
	stos	dword [edi]
3358
	mov	eax,ecx
3359
	stos	dword [edi]
3360
	inc	ecx
3361
	test	[format_flags],8
3362
	jnz	finish_elf64_rela_section
3363
	mov	eax,4
3364
	stos	dword [edi]
3365
	mov	al,8
3366
	stos	dword [edi]
3367
	jmp	rel_section_ok
3368
      finish_elf64_rela_section:
31 halyavin 3369
	mov	eax,8
157 heavyiron 3370
	stos	dword [edi]
3371
	xor	al,al
3372
	stos	dword [edi]
3373
	mov	al,24
3374
	stos	dword [edi]
3375
	xor	al,al
3376
	stos	dword [edi]
3377
      rel_section_ok:
31 halyavin 3378
	cmp	esi,[free_additional_memory]
157 heavyiron 3379
	jne	make_section_entry
3380
	pop	eax
3381
	mov	ebx,[code_start]
3382
	sub	eax,ebx
3383
	mov	[code_size],eax
3384
	mov	ecx,20h
3385
	test	[format_flags],8
3386
	jz	adjust_elf_section_headers_offset
3387
	mov	ecx,28h
3388
      adjust_elf_section_headers_offset:
31 halyavin 3389
	add	[ebx+ecx],eax
157 heavyiron 3390
	mov	eax,1
3391
	stos	dword [edi]
3392
	mov	al,2
3393
	stos	dword [edi]
3394
	xor	al,al
3395
	call	store_elf_machine_word
3396
	call	store_elf_machine_word
3397
	mov	eax,[code_size]
3398
	call	store_elf_machine_word
3399
	mov	eax,[edx+1]
3400
	sub	eax,[free_additional_memory]
3401
	call	store_elf_machine_word
3402
	mov	eax,[current_section]
3403
	inc	eax
3404
	stos	dword [edi]
3405
	mov	eax,[number_of_sections]
3406
	inc	eax
3407
	stos	dword [edi]
3408
	test	[format_flags],8
3409
	jnz	finish_elf64_sym_section
3410
	mov	eax,4
3411
	stos	dword [edi]
3412
	mov	al,10h
3413
	stos	dword [edi]
3414
	jmp	sym_section_ok
3415
      finish_elf64_sym_section:
31 halyavin 3416
	mov	eax,8
157 heavyiron 3417
	stos	dword [edi]
3418
	xor	al,al
3419
	stos	dword [edi]
3420
	mov	al,18h
3421
	stos	dword [edi]
3422
	xor	al,al
3423
	stos	dword [edi]
3424
      sym_section_ok:
31 halyavin 3425
	mov	al,1+8
157 heavyiron 3426
	stos	dword [edi]
3427
	mov	al,3
3428
	stos	dword [edi]
3429
	xor	al,al
3430
	call	store_elf_machine_word
3431
	call	store_elf_machine_word
3432
	mov	eax,[edx+1]
3433
	sub	eax,[free_additional_memory]
3434
	add	eax,[code_size]
3435
	call	store_elf_machine_word
3436
	mov	eax,[edx+1+8]
3437
	sub	eax,[edx+1]
3438
	call	store_elf_machine_word
3439
	xor	eax,eax
3440
	stos	dword [edi]
3441
	stos	dword [edi]
3442
	mov	al,1
3443
	call	store_elf_machine_word
3444
	xor	eax,eax
3445
	call	store_elf_machine_word
3446
	mov	eax,'tab'
3447
	mov	dword [edx+1],'.sym'
3448
	mov	[edx+1+4],eax
3449
	mov	dword [edx+1+8],'.str'
3450
	mov	[edx+1+8+4],eax
3451
	mov	[written_size],0
3452
	mov	edx,[output_file]
3453
	call	create
3454
	jc	write_failed
3455
	call	write_code
3456
	mov	ecx,edi
3457
	mov	edx,[free_additional_memory]
3458
	sub	ecx,edx
3459
	add	[written_size],ecx
3460
	call	write
3461
	jc	write_failed
3462
	jmp	output_written
3463
31 halyavin 3464
 
3465
	add	esi,2
157 heavyiron 3466
	or	[format_flags],1
3467
	mov	[image_base],8048000h
3468
	cmp	byte [esi],80h
3469
	jne	elf_exe_base_ok
3470
	lods	word [esi]
3471
	cmp	ah,'('
3472
	jne	invalid_argument
3473
	cmp	byte [esi],'.'
3474
	je	invalid_value
3475
	push	edx
3476
	call	get_dword_value
3477
	cmp	[value_type],0
3478
	jne	invalid_use_of_symbol
3479
	mov	[image_base],eax
3480
	pop	edx
3481
      elf_exe_base_ok:
31 halyavin 3482
	mov	byte [edx+10h],2
157 heavyiron 3483
	mov	byte [edx+2Ah],20h
3484
	mov	ebx,edi
3485
	mov	ecx,20h shr 2
3486
	cmp	[current_pass],0
3487
	je	init_elf_segments
3488
	imul	ecx,[number_of_sections]
3489
      init_elf_segments:
109 heavyiron 3490
	xor	eax,eax
157 heavyiron 3491
	rep	stos dword [edi]
3492
	mov	[number_of_sections],0
3493
	mov	byte [ebx],1
3494
	mov	word [ebx+1Ch],1000h
3495
	mov	byte [ebx+18h],111b
3496
	mov	eax,edi
3497
	sub	eax,[code_start]
3498
	mov	[ebx+4],eax
3499
	add	eax,[image_base]
3500
	mov	[ebx+8],eax
3501
	mov	[ebx+0Ch],eax
3502
	mov	[edx+18h],eax
3503
	xor	edx,edx
3504
	not	eax
3505
	not	edx
3506
	add	eax,1
3507
	adc	edx,0
3508
	add	eax,edi
3509
	adc	edx,0
3510
	mov	dword [org_origin],eax
3511
	mov	dword [org_origin+4],edx
3512
	mov	[org_registers],0
3513
	mov	[org_start],edi
3514
	mov	[symbols_stream],edi
3515
	jmp	instruction_assembled
3516
      format_elf64_exe:
31 halyavin 3517
	add	esi,2
157 heavyiron 3518
	or	[format_flags],1
3519
	mov	[image_base],400000h
3520
	mov	[image_base_high],0
3521
	cmp	byte [esi],80h
3522
	jne	elf64_exe_base_ok
3523
	lods	word [esi]
3524
	cmp	ah,'('
3525
	jne	invalid_argument
3526
	cmp	byte [esi],'.'
3527
	je	invalid_value
3528
	push	edx
3529
	call	get_qword_value
3530
	cmp	[value_type],0
3531
	jne	invalid_use_of_symbol
3532
	mov	[image_base],eax
3533
	mov	[image_base_high],edx
3534
	pop	edx
3535
      elf64_exe_base_ok:
31 halyavin 3536
	mov	byte [edx+10h],2
157 heavyiron 3537
	mov	byte [edx+36h],38h
3538
	mov	ebx,edi
3539
	mov	ecx,38h shr 2
3540
	cmp	[current_pass],0
3541
	je	init_elf64_segments
3542
	imul	ecx,[number_of_sections]
3543
      init_elf64_segments:
109 heavyiron 3544
	xor	eax,eax
157 heavyiron 3545
	rep	stos dword [edi]
3546
	mov	[number_of_sections],0
3547
	mov	byte [ebx],1
3548
	mov	word [ebx+30h],1000h
3549
	mov	byte [ebx+4],111b
3550
	push	edx
3551
	mov	eax,edi
3552
	sub	eax,[code_start]
3553
	mov	[ebx+8],eax
3554
	xor	edx,edx
3555
	add	eax,[image_base]
3556
	adc	edx,[image_base_high]
3557
	mov	[ebx+10h],eax
3558
	mov	[ebx+10h+4],edx
3559
	mov	[ebx+18h],eax
3560
	mov	[ebx+18h+4],edx
3561
	pop	ebx
3562
	mov	[ebx+18h],eax
3563
	mov	[ebx+18h+4],edx
3564
	not	eax
3565
	not	edx
3566
	add	eax,1
3567
	adc	edx,0
3568
	add	eax,edi
3569
	adc	edx,0
3570
	mov	dword [org_origin],eax
3571
	mov	dword [org_origin+4],edx
3572
	mov	[org_registers],0
3573
	mov	[org_start],edi
3574
	mov	[symbols_stream],edi
3575
	jmp	instruction_assembled
3576
elf_entry:
31 halyavin 3577
	lods	byte [esi]
157 heavyiron 3578
	cmp	al,'('
3579
	jne	invalid_argument
3580
	cmp	byte [esi],'.'
3581
	je	invalid_value
3582
	test	[format_flags],8
3583
	jnz	elf64_entry
3584
	call	get_dword_value
3585
	cmp	[value_type],0
3586
	jne	invalid_use_of_symbol
3587
	mov	edx,[code_start]
3588
	mov	[edx+18h],eax
3589
	jmp	instruction_assembled
3590
      elf64_entry:
31 halyavin 3591
	call	get_qword_value
157 heavyiron 3592
	cmp	[value_type],0
3593
	jne	invalid_use_of_symbol
3594
	mov	ebx,[code_start]
3595
	mov	[ebx+18h],eax
3596
	mov	[ebx+1Ch],edx
3597
	jmp	instruction_assembled
3598
elf_segment:
109 heavyiron 3599
	bt	[format_flags],0
157 heavyiron 3600
	jnc	illegal_instruction
3601
	test	[format_flags],8
3602
	jnz	elf64_segment
3603
	call	close_elf_segment
3604
	push	eax
3605
	mov	ebx,[number_of_sections]
3606
	shl	ebx,5
3607
	add	ebx,[code_start]
3608
	add	ebx,34h
3609
	cmp	ebx,[symbols_stream]
3610
	jb	new_elf_segment
3611
	mov	ebx,[symbols_stream]
3612
	sub	ebx,20h
3613
	push	edi
3614
	mov	edi,ebx
3615
	mov	ecx,20h shr 2
3616
	xor	eax,eax
3617
	rep	stos dword [edi]
3618
	pop	edi
3619
	or	[next_pass_needed],-1
3620
      new_elf_segment:
109 heavyiron 3621
	mov	byte [ebx],1
157 heavyiron 3622
	mov	word [ebx+1Ch],1000h
3623
      elf_segment_flags:
109 heavyiron 3624
	cmp	byte [esi],19h
157 heavyiron 3625
	jne	elf_segment_flags_ok
3626
	lods	word [esi]
3627
	sub	ah,28
3628
	jbe	invalid_argument
3629
	cmp	ah,1
3630
	je	mark_elf_segment_flag
3631
	cmp	ah,3
3632
	ja	invalid_argument
3633
	xor	ah,1
3634
	cmp	ah,2
3635
	je	mark_elf_segment_flag
3636
	inc	ah
3637
      mark_elf_segment_flag:
109 heavyiron 3638
	test	[ebx+18h],ah
157 heavyiron 3639
	jnz	setting_already_specified
3640
	or	[ebx+18h],ah
3641
	jmp	elf_segment_flags
3642
      elf_segment_flags_ok:
109 heavyiron 3643
	mov	eax,edi
157 heavyiron 3644
	sub	eax,[code_start]
3645
	mov	[ebx+4],eax
3646
	pop	edx
3647
	and	eax,0FFFh
3648
	add	edx,eax
3649
	mov	[ebx+8],edx
3650
	mov	[ebx+0Ch],edx
3651
	mov	eax,edx
3652
	xor	edx,edx
3653
	not	eax
3654
	not	edx
3655
	add	eax,1
3656
	adc	edx,0
3657
	add	eax,edi
3658
	adc	edx,0
3659
	mov	dword [org_origin],eax
3660
	mov	dword [org_origin+4],edx
3661
	mov	[org_registers],0
3662
	mov	[org_start],edi
3663
	inc	[number_of_sections]
3664
	jmp	instruction_assembled
3665
      close_elf_segment:
109 heavyiron 3666
	cmp	[number_of_sections],0
157 heavyiron 3667
	jne	finish_elf_segment
3668
	cmp	edi,[symbols_stream]
3669
	jne	first_elf_segment_ok
3670
	push	edi
3671
	mov	edi,[code_start]
3672
	add	edi,34h
3673
	mov	ecx,20h shr 2
3674
	xor	eax,eax
3675
	rep	stos dword [edi]
3676
	pop	edi
3677
	mov	eax,[image_base]
3678
	ret
3679
      first_elf_segment_ok:
109 heavyiron 3680
	inc	[number_of_sections]
157 heavyiron 3681
      finish_elf_segment:
109 heavyiron 3682
	mov	ebx,[number_of_sections]
157 heavyiron 3683
	dec	ebx
3684
	shl	ebx,5
3685
	add	ebx,[code_start]
3686
	add	ebx,34h
3687
	mov	eax,edi
3688
	sub	eax,[code_start]
3689
	sub	eax,[ebx+4]
3690
	mov	edx,edi
3691
	cmp	edi,[undefined_data_end]
3692
	jne	elf_segment_size_ok
3693
	mov	edi,[undefined_data_start]
3694
      elf_segment_size_ok:
109 heavyiron 3695
	mov	[ebx+14h],eax
157 heavyiron 3696
	add	eax,edi
3697
	sub	eax,edx
3698
	mov	[ebx+10h],eax
3699
	mov	eax,[ebx+8]
3700
	add	eax,[ebx+14h]
3701
	add	eax,0FFFh
3702
	and	eax,not 0FFFh
3703
	ret
3704
      elf64_segment:
109 heavyiron 3705
	call	close_elf64_segment
157 heavyiron 3706
	push	eax edx
3707
	mov	ebx,[number_of_sections]
3708
	imul	ebx,38h
3709
	add	ebx,[code_start]
3710
	add	ebx,40h
3711
	cmp	ebx,[symbols_stream]
3712
	jb	new_elf64_segment
3713
	mov	ebx,[symbols_stream]
3714
	sub	ebx,38h
3715
	push	edi
3716
	mov	edi,ebx
3717
	mov	ecx,38h shr 2
3718
	xor	eax,eax
3719
	rep	stos dword [edi]
3720
	pop	edi
3721
	or	[next_pass_needed],-1
3722
      new_elf64_segment:
109 heavyiron 3723
	mov	byte [ebx],1
157 heavyiron 3724
	mov	word [ebx+30h],1000h
3725
      elf64_segment_flags:
109 heavyiron 3726
	cmp	byte [esi],19h
157 heavyiron 3727
	jne	elf64_segment_flags_ok
3728
	lods	word [esi]
3729
	sub	ah,28
3730
	jbe	invalid_argument
3731
	cmp	ah,1
3732
	je	mark_elf64_segment_flag
3733
	cmp	ah,3
3734
	ja	invalid_argument
3735
	xor	ah,1
3736
	cmp	ah,2
3737
	je	mark_elf64_segment_flag
3738
	inc	ah
3739
      mark_elf64_segment_flag:
109 heavyiron 3740
	test	[ebx+4],ah
157 heavyiron 3741
	jnz	setting_already_specified
3742
	or	[ebx+4],ah
3743
	jmp	elf64_segment_flags
3744
      elf64_segment_flags_ok:
109 heavyiron 3745
	mov	ecx,edi
157 heavyiron 3746
	sub	ecx,[code_start]
3747
	mov	[ebx+8],ecx
3748
	pop	edx eax
3749
	and	ecx,0FFFh
3750
	add	eax,ecx
3751
	adc	edx,0
3752
	mov	[ebx+10h],eax
3753
	mov	[ebx+10h+4],edx
3754
	mov	[ebx+18h],eax
3755
	mov	[ebx+18h+4],edx
3756
	not	eax
3757
	not	edx
3758
	add	eax,1
3759
	adc	edx,0
3760
	add	eax,edi
3761
	adc	edx,0
3762
	mov	dword [org_origin],eax
3763
	mov	dword [org_origin+4],edx
3764
	mov	[org_registers],0
3765
	mov	[org_start],edi
3766
	inc	[number_of_sections]
3767
	jmp	instruction_assembled
3768
      close_elf64_segment:
109 heavyiron 3769
	cmp	[number_of_sections],0
157 heavyiron 3770
	jne	finish_elf64_segment
3771
	cmp	edi,[symbols_stream]
3772
	jne	first_elf64_segment_ok
3773
	push	edi
3774
	mov	edi,[code_start]
3775
	add	edi,40h
3776
	mov	ecx,38h shr 2
3777
	xor	eax,eax
3778
	rep	stos dword [edi]
3779
	pop	edi
3780
	mov	eax,[image_base]
3781
	mov	edx,[image_base_high]
3782
	ret
3783
      first_elf64_segment_ok:
109 heavyiron 3784
	inc	[number_of_sections]
157 heavyiron 3785
      finish_elf64_segment:
109 heavyiron 3786
	mov	ebx,[number_of_sections]
157 heavyiron 3787
	dec	ebx
3788
	imul	ebx,38h
3789
	add	ebx,[code_start]
3790
	add	ebx,40h
3791
	mov	eax,edi
3792
	sub	eax,[code_start]
3793
	sub	eax,[ebx+8]
3794
	mov	edx,edi
3795
	cmp	edi,[undefined_data_end]
3796
	jne	elf64_segment_size_ok
3797
	mov	edi,[undefined_data_start]
3798
      elf64_segment_size_ok:
109 heavyiron 3799
	mov	[ebx+28h],eax
157 heavyiron 3800
	add	eax,edi
3801
	sub	eax,edx
3802
	mov	[ebx+20h],eax
3803
	mov	eax,[ebx+10h]
3804
	mov	edx,[ebx+10h+4]
3805
	add	eax,[ebx+28h]
3806
	adc	edx,0
3807
	sub	eax,1
3808
	sbb	edx,0
3809
	shrd	eax,edx,12
3810
	shr	edx,12
3811
	add	eax,1
3812
	adc	edx,0
3813
	shld	edx,eax,12
3814
	shl	eax,12
3815
	ret
3816
close_elf_exe:
31 halyavin 3817
	test	[format_flags],8
157 heavyiron 3818
	jnz	close_elf64_exe
3819
	call	close_elf_segment
3820
	mov	edx,[code_start]
3821
	mov	eax,[number_of_sections]
3822
	mov	byte [edx+1Ch],34h
3823
	mov	[edx+2Ch],ax
3824
	shl	eax,5
3825
	add	eax,edx
3826
	add	eax,34h
3827
	cmp	eax,[symbols_stream]
3828
	je	elf_exe_ok
3829
	or	[next_pass_needed],-1
3830
      elf_exe_ok:
31 halyavin 3831
	ret
157 heavyiron 3832
      close_elf64_exe:
31 halyavin 3833
	call	close_elf64_segment
157 heavyiron 3834
	mov	edx,[code_start]
3835
	mov	eax,[number_of_sections]
3836
	mov	byte [edx+20h],40h
3837
	mov	[edx+38h],ax
3838
	imul	eax,38h
3839
	add	eax,edx
3840
	add	eax,40h
3841
	cmp	eax,[symbols_stream]
3842
	je	elf64_exe_ok
3843
	or	[next_pass_needed],-1
3844
      elf64_exe_ok:
31 halyavin 3845
	ret
157 heavyiron 3846