Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
692 heavyiron 1
 
2287 heavyiron 2
; Copyright (c) 1999-2011, Tomasz Grysztar.
3
; All rights reserved.
4
692 heavyiron 5
 
2287 heavyiron 6
	mov	edi,[code_start]
7
	call	setup_dump_header
8
	mov	esi,[input_file]
9
	call	copy_asciiz
10
	cmp	edi,[display_buffer]
11
	jae	out_of_memory
12
	mov	eax,edi
13
	sub	eax,ebx
14
	mov	[ebx-38h+0Ch],eax
15
	mov	esi,[output_file]
16
	call	copy_asciiz
17
	cmp	edi,[display_buffer]
18
	jae	out_of_memory
19
	mov	edx,[symbols_stream]
20
	mov	ebp,[free_additional_memory]
21
	mov	[number_of_sections],0
22
	cmp	[output_format],4
23
	je	prepare_strings_table
24
	cmp	[output_format],5
25
	jne	strings_table_ready
26
	bt	[format_flags],0
27
	jc	strings_table_ready
28
      prepare_strings_table:
29
	cmp	edx,ebp
30
	je	strings_table_ready
31
	mov	al,[edx]
32
	test	al,al
33
	jz	prepare_string
34
	cmp	al,80h
35
	je	prepare_string
36
	add	edx,0Ch
37
	cmp	al,0C0h
38
	jb	prepare_strings_table
39
	add	edx,4
40
	jmp	prepare_strings_table
41
      prepare_string:
42
	mov	esi,edi
43
	sub	esi,ebx
44
	xchg	esi,[edx+4]
45
	test	al,al
46
	jz	prepare_section_string
47
	or	dword [edx+4],1 shl 31
48
	add	edx,0Ch
49
      prepare_external_string:
50
	mov	ecx,[esi]
51
	add	esi,4
52
	rep	movs byte [edi],[esi]
53
	mov	byte [edi],0
54
	inc	edi
55
	cmp	edi,[display_buffer]
56
	jae	out_of_memory
57
	jmp	prepare_strings_table
58
      prepare_section_string:
59
	mov	ecx,[number_of_sections]
60
	mov	eax,ecx
61
	inc	eax
62
	mov	[number_of_sections],eax
63
	xchg	eax,[edx+4]
64
	shl	ecx,2
65
	add	ecx,[free_additional_memory]
66
	mov	[ecx],eax
67
	add	edx,20h
68
	test	esi,esi
69
	jz	prepare_default_section_string
70
	cmp	[output_format],5
71
	jne	prepare_external_string
72
	bt	[format_flags],0
73
	jc	prepare_external_string
74
	mov	esi,[esi]
75
	add	esi,[resource_data]
76
      copy_elf_section_name:
77
	lods	byte [esi]
78
	cmp	edi,[display_buffer]
79
	jae	out_of_memory
80
	stos	byte [edi]
81
	test	al,al
82
	jnz	copy_elf_section_name
83
	jmp	prepare_strings_table
84
      prepare_default_section_string:
85
	mov	eax,'.fla'
86
	stos	dword [edi]
87
	mov	ax,'t'
88
	stos	word [edi]
89
	cmp	edi,[display_buffer]
90
	jae	out_of_memory
91
	jmp	prepare_strings_table
92
      strings_table_ready:
93
	mov	edx,[display_buffer]
94
	mov	ebp,[memory_end]
95
	sub	ebp,[labels_list]
96
	add	ebp,edx
97
      prepare_labels_dump:
98
	cmp	edx,ebp
99
	je	labels_dump_ok
100
	mov	eax,[edx+24]
101
	test	eax,eax
102
	jz	label_dump_name_ok
103
	cmp	eax,[memory_start]
104
	jb	label_name_outside_source
105
	cmp	eax,[source_start]
106
	ja	label_name_outside_source
107
	sub	eax,[memory_start]
108
	dec	eax
109
	mov	[edx+24],eax
110
	jmp	label_dump_name_ok
111
      label_name_outside_source:
112
	mov	esi,eax
113
	mov	eax,edi
114
	sub	eax,ebx
115
	or	eax,1 shl 31
116
	mov	[edx+24],eax
117
	movzx	ecx,byte [esi-1]
692 heavyiron 118
	lea	eax,[edi+ecx+1]
2287 heavyiron 119
	cmp	edi,[display_buffer]
120
	jae	out_of_memory
121
	rep	movsb
692 heavyiron 122
	xor	al,al
2287 heavyiron 123
	stosb
692 heavyiron 124
      label_dump_name_ok:
2287 heavyiron 125
	mov	eax,[edx+28]
126
	test	eax,eax
127
	jz	label_dump_line_ok
128
	sub	eax,[memory_start]
129
	mov	[edx+28],eax
130
      label_dump_line_ok:
131
	mov	eax,[edx+20]
132
	test	eax,eax
133
	jz	base_symbol_for_label_ok
134
	cmp	eax,[symbols_stream]
135
	mov	eax,[eax+4]
136
	jae	base_symbol_for_label_ok
137
	xor	eax,eax
138
      base_symbol_for_label_ok:
139
	mov	[edx+20],eax
140
	mov	ax,[current_pass]
141
	cmp	ax,[edx+16]
142
	je	label_defined_flag_ok
143
	and	byte [edx+8],not 1
144
      label_defined_flag_ok:
145
	cmp	ax,[edx+18]
146
	je	label_used_flag_ok
147
	and	byte [edx+8],not 8
148
      label_used_flag_ok:
149
	add	edx,LABEL_STRUCTURE_SIZE
150
	jmp	prepare_labels_dump
151
      labels_dump_ok:
152
	mov	eax,edi
153
	sub	eax,ebx
154
	mov	[ebx-38h+14h],eax
155
	add	eax,38h
156
	mov	[ebx-38h+18h],eax
157
	mov	ecx,[memory_end]
158
	sub	ecx,[labels_list]
159
	mov	[ebx-38h+1Ch],ecx
160
	add	eax,ecx
161
	mov	[ebx-38h+20h],eax
162
	mov	ecx,[source_start]
163
	sub	ecx,[memory_start]
164
	mov	[ebx-38h+24h],ecx
165
	add	eax,ecx
166
	mov	[ebx-38h+28h],eax
167
	mov	eax,[number_of_sections]
168
	shl	eax,2
169
	mov	[ebx-38h+34h],eax
170
	call	prepare_preprocessed_source
171
	mov	esi,[labels_list]
172
	mov	ebp,edi
173
      make_lines_dump:
174
	cmp	esi,[display_buffer]
175
	je	lines_dump_ok
176
	mov	eax,[esi-4]
177
	mov	ecx,[esi-8]
178
	sub	esi,8
179
	sub	esi,ecx
180
	cmp	eax,1
181
	jne	make_lines_dump
182
	mov	eax,[esi+4]
183
	sub	eax,[code_start]
184
	add	eax,[headers_size]
185
	cmp	byte [esi+1Ah],0
186
	je	store_offset
187
	xor	eax,eax
188
      store_offset:
189
	stos	dword [edi]
190
	mov	eax,[esi]
191
	sub	eax,[memory_start]
192
	stos	dword [edi]
193
	mov	eax,[esi+4]
194
	xor	edx,edx
195
	sub	eax,[esi+8]
196
	sbb	edx,[esi+8+4]
197
	stos	dword [edi]
198
	mov	eax,edx
199
	stos	dword [edi]
200
	mov	eax,[esi+10h]
201
	stos	dword [edi]
202
	mov	eax,[esi+14h]
203
	test	eax,eax
204
	jz	base_symbol_for_line_ok
205
	cmp	eax,[symbols_stream]
206
	mov	eax,[eax+4]
207
	jae	base_symbol_for_line_ok
208
	xor	eax,eax
209
      base_symbol_for_line_ok:
210
	stos	dword [edi]
211
	mov	eax,[esi+18h]
212
	and	eax,001FFFFh
213
	stos	dword [edi]
214
	cmp	edi,[display_buffer]
215
	jae	out_of_memory
216
	jmp	make_lines_dump
217
      lines_dump_ok:
218
	mov	edx,edi
219
	mov	eax,[current_offset]
220
	sub	eax,[code_start]
221
	add	eax,[headers_size]
222
	stos	dword [edi]
223
	mov	ecx,edi
224
	sub	ecx,ebx
225
	sub	ecx,[ebx-38h+14h]
226
	mov	[ebx-38h+2Ch],ecx
227
	add	ecx,[ebx-38h+28h]
228
	mov	[ebx-38h+30h],ecx
229
      find_inexisting_offsets:
230
	sub	edx,1Ch
231
	cmp	edx,ebp
232
	jb	write_symbols
233
	test	byte [edx+1Ah],1
234
	jnz	find_inexisting_offsets
235
	cmp	eax,[edx]
236
	jb	correct_inexisting_offset
237
	mov	eax,[edx]
238
	jmp	find_inexisting_offsets
239
      correct_inexisting_offset:
240
	mov	dword [edx],0
241
	or	byte [edx+1Ah],2
242
	jmp	find_inexisting_offsets
243
      write_symbols:
244
	mov	edx,[symbols_file]
245
	call	create
692 heavyiron 246
	jc	write_failed
2287 heavyiron 247
	mov	edx,[code_start]
248
	mov	ecx,[edx+14h]
249
	add	ecx,38h
250
	call	write
251
	jc	write_failed
252
	mov	edx,[display_buffer]
253
	mov	ecx,[memory_end]
254
	sub	ecx,[labels_list]
255
	call	write
256
	jc	write_failed
257
	mov	edx,[memory_start]
258
	mov	ecx,[source_start]
259
	sub	ecx,edx
260
	call	write
261
	jc	write_failed
262
	mov	edx,ebp
263
	mov	ecx,edi
692 heavyiron 264
	sub	ecx,edx
265
	call	write
266
	jc	write_failed
2287 heavyiron 267
	mov	edx,[free_additional_memory]
268
	mov	ecx,[number_of_sections]
269
	shl	ecx,2
270
	call	write
271
	jc	write_failed
272
	call	close
692 heavyiron 273
	ret
274
      setup_dump_header:
2287 heavyiron 275
	xor	eax,eax
276
	mov	ecx,38h shr 2
277
	rep	stos dword [edi]
278
	mov	ebx,edi
279
	mov	dword [ebx-38h],'fas'+1Ah shl 24
280
	mov	dword [ebx-38h+4],VERSION_MAJOR + VERSION_MINOR shl 8 + 38h shl 16
281
	mov	dword [ebx-38h+10h],38h
282
	ret
283
prepare_preprocessed_source:
284
	mov	esi,[memory_start]
285
	mov	ebp,[source_start]
286
	test	ebp,ebp
287
	jnz	prepare_preprocessed_line
288
	mov	ebp,[current_line]
289
	inc	ebp
290
      prepare_preprocessed_line:
291
	cmp	esi,ebp
292
	jae	preprocessed_source_ok
293
	mov	eax,[memory_start]
294
	mov	edx,[input_file]
295
	cmp	[esi],edx
296
	jne	line_not_from_main_input
297
	mov	[esi],eax
298
      line_not_from_main_input:
299
	sub	[esi],eax
300
	test	byte [esi+7],1 shl 7
301
	jz	prepare_next_preprocessed_line
302
	sub	[esi+8],eax
303
	sub	[esi+12],eax
304
      prepare_next_preprocessed_line:
305
	call	skip_preprocessed_line
306
	jmp	prepare_preprocessed_line
307
      preprocessed_source_ok:
308
	ret
309
      skip_preprocessed_line:
310
	add	esi,16
311
      skip_preprocessed_line_content:
312
	lods	byte [esi]
313
	cmp	al,1Ah
314
	je	skip_preprocessed_symbol
315
	cmp	al,3Bh
316
	je	skip_preprocessed_symbol
317
	cmp	al,22h
318
	je	skip_preprocessed_string
319
	or	al,al
320
	jnz	skip_preprocessed_line_content
321
	ret
322
      skip_preprocessed_string:
323
	lods	dword [esi]
324
	add	esi,eax
325
	jmp	skip_preprocessed_line_content
326
      skip_preprocessed_symbol:
327
	lods	byte [esi]
328
	movzx	eax,al
329
	add	esi,eax
330
	jmp	skip_preprocessed_line_content
331
restore_preprocessed_source:
332
	mov	esi,[memory_start]
333
	mov	ebp,[source_start]
334
	test	ebp,ebp
335
	jnz	restore_preprocessed_line
336
	mov	ebp,[current_line]
337
	inc	ebp
338
      restore_preprocessed_line:
339
	cmp	esi,ebp
340
	jae	preprocessed_source_restored
341
	mov	eax,[memory_start]
342
	add	[esi],eax
343
	cmp	[esi],eax
344
	jne	preprocessed_line_source_restored
345
	mov	edx,[input_file]
346
	mov	[esi],edx
347
      preprocessed_line_source_restored:
348
	test	byte [esi+7],1 shl 7
349
	jz	restore_next_preprocessed_line
350
	add	[esi+8],eax
351
	add	[esi+12],eax
352
      restore_next_preprocessed_line:
353
	call	skip_preprocessed_line
354
	jmp	restore_preprocessed_line
355
      preprocessed_source_restored:
356
	ret
357
dump_preprocessed_source:
358
	mov	edi,[free_additional_memory]
359
	call	setup_dump_header
360
	mov	esi,[input_file]
361
	call	copy_asciiz
362
	cmp	edi,[additional_memory_end]
363
	jae	out_of_memory
364
	mov	eax,edi
365
	sub	eax,ebx
366
	dec	eax
367
	mov	[ebx-38h+0Ch],eax
368
	mov	eax,edi
369
	sub	eax,ebx
370
	mov	[ebx-38h+14h],eax
371
	add	eax,38h
372
	mov	[ebx-38h+20h],eax
373
	call	prepare_preprocessed_source
374
	sub	esi,[memory_start]
375
	mov	[ebx-38h+24h],esi
376
	mov	edx,[symbols_file]
377
	call	create
378
	jc	write_failed
379
	mov	edx,[free_additional_memory]
380
	mov	ecx,[edx+14h]
381
	add	ecx,38h
382
	call	write
383
	jc	write_failed
384
	mov	edx,[memory_start]
385
	mov	ecx,esi
386
	call	write
387
	jc	write_failed
388
	call	close
389
	ret
390