Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

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