symbol_dump:

	push	edi
	mov	edx,[memory_end]
      dump_symbols:
	cmp	edx,[labels_list]
	jbe	symbols_dumped
	sub	edx,LABEL_STRUCTURE_SIZE
	cmp	dword [edx+24],0
	je	dump_symbols	; do not dump anonymous symbols
	test	byte [edx+8],1
	jz	dump_symbols	; do not dump symbols that didn't get defined
	mov	ax,[current_pass]
	cmp	ax,[edx+16]
	jne	dump_symbols
	test	byte [edx+8],4
	jnz	dump_symbols	; do not dump assembly-time variables

	mov	esi,[edx+24]
	movzx	ecx,byte [esi-1]
	rep	movsb
	mov	eax,': va'
	stosd
	mov	eax,'lue '
	stosd
	mov	al,[edx+12]
	or	al,al
	jz	symbol_first_register_ok
	call	find_register_name
	rep	movsb
	cmp	byte [edx+14],1
	je	symbol_first_register_count_ok
	mov	al,'*'
	stosb
	movzx	eax,byte [edx+14]
	call	write_dec_number
      symbol_first_register_count_ok:
	mov	al,'+'
	stosb
      symbol_first_register_ok:
	mov	al,[edx+13]
	or	al,al
	jz	symbol_second_register_ok
	call	find_register_name
	rep	movsb
	mov	al,'*'
	stosb
	cmp	byte [edx+15],1
	je	symbol_second_register_count_ok
	movzx	eax,byte [edx+15]
	call	write_dec_number
      symbol_second_register_count_ok:
	mov	al,'+'
	stosb
      symbol_second_register_ok:
	mov	ax,'0x'
	stosw
	mov	ebx,[edx+4]
	call	write_hex_dword
	mov	ebx,[edx]
	call	write_hex_dword
	mov	ax,', '
	stosw
	cmp	byte [edx+11],0
	jne	dump_relocatable
	mov	eax,'abso'
	stosd
	mov	eax,'lute'
	stosd
	jmp	symbol_type_dumped
      dump_relocatable:
	cmp	byte [edx+11],1
	je	dump_segment
	cmp	dword [edx+20],0
	jne	dump_relative
	mov	eax,'virt'
	stosd
	mov	eax,'ual '
	stosd
	mov	eax,'addr'
	stosd
	mov	ax,'es'
	stosw
	mov	al,'s'
	stosb
	jmp	symbol_type_dumped
      dump_relative:
	mov	eax,'rela'
	stosd
	mov	eax,'tive'
	stosd
	mov	eax,' to '
	stosd
	mov	ebx,[edx+20]
	cmp	byte [ebx],0
	je	dump_section_name
	mov	eax,'exte'
	stosd
	mov	eax,'rnal'
	stosd
	mov	al,' '
	stosb
	mov	esi,[ebx+4]
	mov	ecx,[esi]
	add	esi,4
	rep	movsb
	jmp	symbol_type_dumped
      dump_section_name:
	mov	eax,'sect'
	stosd
	mov	eax,'ion '
	stosd
	mov	esi,[ebx+4]
	or	esi,esi
	jz	dump_.flat_section
	mov	ecx,[esi]
	add	esi,4
	rep	movsb
	jmp	symbol_type_dumped
      dump_.flat_section:
	mov	al,'.'
	stosb
	mov	eax,'flat'
	stosd
	jmp	symbol_type_dumped
     dump_segment:
	mov	eax,'segm'
	stosd
	mov	ax,'en'
	stosw
	mov	al,'t'
	stosb
      symbol_type_dumped:
	mov	eax,', de'
	stosd
	mov	eax,'fine'
	stosd
	mov	eax,'d in'
	stosd
	mov	al,' '
	stosb
	mov	ebx,[edx+28]
	call	dump_line_identifier



	mov	ax,0A0Dh
	stosw

	jmp	dump_symbols

      symbols_dumped:
	mov	edx,_symb_dump
	call	create
	mov	edx,[esp]
	mov	ecx,edi
	sub	ecx,edx
	call	write
	call	close
	pop	edi

	ret

dump_line_identifier:
	test	dword [ebx+4],80000000h
	jnz	dump_macro_generated_line
	mov	esi,[ebx]
	call	write_string
	mov	al,'['
	stosb
	mov	eax,[ebx+4]
	call	write_dec_number
	mov	al,']'
	stosb
	ret
      dump_macro_generated_line:
	mov	eax,'line'
	stosd
	mov	eax,' gen'
	stosd
	mov	eax,'erat'
	stosd
	mov	eax,'ed b'
	stosd
	mov	ax,'y '
	stosw
	mov	al,'('
	stosb
	push	ebx
	mov	ebx,[ebx+8]
	call	dump_line_identifier
	pop	ebx
	mov	eax,') fr'
	stosd
	mov	eax,'om ('
	stosd
	push	ebx
	mov	ebx,[ebx+12]
	call	dump_line_identifier
	pop	ebx
	mov	al,')'
	stosb
	ret

write_hex_dword:
	mov	ecx,8
      write_hex_digits:
	xor	al,al
	shld	eax,ebx,4
	cmp	al,10
	sbb	al,69h
	das
	stosb
	shl	ebx,4
	loop	write_hex_digits
	ret

write_dec_number:
	push	ebx edx
	mov	ecx,1000000000
	xor	edx,edx
	xor	bl,bl
      dec_number_loop:
	div	ecx
	push	edx
	cmp	ecx,1
	je	write_dec_digit
	or	bl,bl
	jnz	write_dec_digit
	or	al,al
	jz	dec_digit_ok
	not	bl
      write_dec_digit:
	add	al,30h
	stosb
      dec_digit_ok:
	mov	eax,ecx
	xor	edx,edx
	mov	ecx,10
	div	ecx
	mov	ecx,eax
	pop	eax
	or	ecx,ecx
	jnz	dec_number_loop
	pop	edx ebx
	ret

write_string:
	lodsb
	or	al,al
	jz	string_written
	stosb
	jmp	write_string
      string_written:
	ret

find_register_name:
	mov	esi,address_registers
      scan_address_registers:
	movzx	ecx,byte [esi]
	inc	esi
	jecxz	register_name_found
	cmp	al,[esi+ecx+1]
	je	register_name_found
	lea	esi,[esi+ecx+2]
	jmp	scan_address_registers
      register_name_found:
	ret

_symb_dump db 'SYMBDUMP.TXT',0