; flat assembler core ; Copyright (c) 1999-2011, Tomasz Grysztar. ; All rights reserved. dump_symbols: mov edi,[code_start] call setup_dump_header mov esi,[input_file] call copy_asciiz cmp edi,[display_buffer] jae out_of_memory mov eax,edi sub eax,ebx mov [ebx-38h+0Ch],eax mov esi,[output_file] call copy_asciiz cmp edi,[display_buffer] jae out_of_memory mov edx,[symbols_stream] mov ebp,[free_additional_memory] mov [number_of_sections],0 cmp [output_format],4 je prepare_strings_table cmp [output_format],5 jne strings_table_ready bt [format_flags],0 jc strings_table_ready prepare_strings_table: cmp edx,ebp je strings_table_ready mov al,[edx] test al,al jz prepare_string cmp al,80h je prepare_string add edx,0Ch cmp al,0C0h jb prepare_strings_table add edx,4 jmp prepare_strings_table prepare_string: mov esi,edi sub esi,ebx xchg esi,[edx+4] test al,al jz prepare_section_string or dword [edx+4],1 shl 31 add edx,0Ch prepare_external_string: mov ecx,[esi] add esi,4 rep movs byte [edi],[esi] mov byte [edi],0 inc edi cmp edi,[display_buffer] jae out_of_memory jmp prepare_strings_table prepare_section_string: mov ecx,[number_of_sections] mov eax,ecx inc eax mov [number_of_sections],eax xchg eax,[edx+4] shl ecx,2 add ecx,[free_additional_memory] mov [ecx],eax add edx,20h test esi,esi jz prepare_default_section_string cmp [output_format],5 jne prepare_external_string bt [format_flags],0 jc prepare_external_string mov esi,[esi] add esi,[resource_data] copy_elf_section_name: lods byte [esi] cmp edi,[display_buffer] jae out_of_memory stos byte [edi] test al,al jnz copy_elf_section_name jmp prepare_strings_table prepare_default_section_string: mov eax,'.fla' stos dword [edi] mov ax,'t' stos word [edi] cmp edi,[display_buffer] jae out_of_memory jmp prepare_strings_table strings_table_ready: mov edx,[display_buffer] mov ebp,[memory_end] sub ebp,[labels_list] add ebp,edx prepare_labels_dump: cmp edx,ebp je labels_dump_ok mov eax,[edx+24] test eax,eax jz label_dump_name_ok cmp eax,[memory_start] jb label_name_outside_source cmp eax,[source_start] ja label_name_outside_source sub eax,[memory_start] dec eax mov [edx+24],eax jmp label_dump_name_ok label_name_outside_source: mov esi,eax mov eax,edi sub eax,ebx or eax,1 shl 31 mov [edx+24],eax movzx ecx,byte [esi-1] lea eax,[edi+ecx+1] cmp edi,[display_buffer] jae out_of_memory rep movsb xor al,al stosb label_dump_name_ok: mov eax,[edx+28] test eax,eax jz label_dump_line_ok sub eax,[memory_start] mov [edx+28],eax label_dump_line_ok: mov eax,[edx+20] test eax,eax jz base_symbol_for_label_ok cmp eax,[symbols_stream] mov eax,[eax+4] jae base_symbol_for_label_ok xor eax,eax base_symbol_for_label_ok: mov [edx+20],eax mov ax,[current_pass] cmp ax,[edx+16] je label_defined_flag_ok and byte [edx+8],not 1 label_defined_flag_ok: cmp ax,[edx+18] je label_used_flag_ok and byte [edx+8],not 8 label_used_flag_ok: add edx,LABEL_STRUCTURE_SIZE jmp prepare_labels_dump labels_dump_ok: mov eax,edi sub eax,ebx mov [ebx-38h+14h],eax add eax,38h mov [ebx-38h+18h],eax mov ecx,[memory_end] sub ecx,[labels_list] mov [ebx-38h+1Ch],ecx add eax,ecx mov [ebx-38h+20h],eax mov ecx,[source_start] sub ecx,[memory_start] mov [ebx-38h+24h],ecx add eax,ecx mov [ebx-38h+28h],eax mov eax,[number_of_sections] shl eax,2 mov [ebx-38h+34h],eax call prepare_preprocessed_source mov esi,[labels_list] mov ebp,edi make_lines_dump: cmp esi,[display_buffer] je lines_dump_ok mov eax,[esi-4] mov ecx,[esi-8] sub esi,8 sub esi,ecx cmp eax,1 jne make_lines_dump mov eax,[esi+4] sub eax,[code_start] add eax,[headers_size] cmp byte [esi+1Ah],0 je store_offset xor eax,eax store_offset: stos dword [edi] mov eax,[esi] sub eax,[memory_start] stos dword [edi] mov eax,[esi+4] xor edx,edx sub eax,[esi+8] sbb edx,[esi+8+4] stos dword [edi] mov eax,edx stos dword [edi] mov eax,[esi+10h] stos dword [edi] mov eax,[esi+14h] test eax,eax jz base_symbol_for_line_ok cmp eax,[symbols_stream] mov eax,[eax+4] jae base_symbol_for_line_ok xor eax,eax base_symbol_for_line_ok: stos dword [edi] mov eax,[esi+18h] and eax,001FFFFh stos dword [edi] cmp edi,[display_buffer] jae out_of_memory jmp make_lines_dump lines_dump_ok: mov edx,edi mov eax,[current_offset] sub eax,[code_start] add eax,[headers_size] stos dword [edi] mov ecx,edi sub ecx,ebx sub ecx,[ebx-38h+14h] mov [ebx-38h+2Ch],ecx add ecx,[ebx-38h+28h] mov [ebx-38h+30h],ecx find_inexisting_offsets: sub edx,1Ch cmp edx,ebp jb write_symbols test byte [edx+1Ah],1 jnz find_inexisting_offsets cmp eax,[edx] jb correct_inexisting_offset mov eax,[edx] jmp find_inexisting_offsets correct_inexisting_offset: mov dword [edx],0 or byte [edx+1Ah],2 jmp find_inexisting_offsets write_symbols: mov edx,[symbols_file] call create jc write_failed mov edx,[code_start] mov ecx,[edx+14h] add ecx,38h call write jc write_failed mov edx,[display_buffer] mov ecx,[memory_end] sub ecx,[labels_list] call write jc write_failed mov edx,[memory_start] mov ecx,[source_start] sub ecx,edx call write jc write_failed mov edx,ebp mov ecx,edi sub ecx,edx call write jc write_failed mov edx,[free_additional_memory] mov ecx,[number_of_sections] shl ecx,2 call write jc write_failed call close ret setup_dump_header: xor eax,eax mov ecx,38h shr 2 rep stos dword [edi] mov ebx,edi mov dword [ebx-38h],'fas'+1Ah shl 24 mov dword [ebx-38h+4],VERSION_MAJOR + VERSION_MINOR shl 8 + 38h shl 16 mov dword [ebx-38h+10h],38h ret prepare_preprocessed_source: mov esi,[memory_start] mov ebp,[source_start] test ebp,ebp jnz prepare_preprocessed_line mov ebp,[current_line] inc ebp prepare_preprocessed_line: cmp esi,ebp jae preprocessed_source_ok mov eax,[memory_start] mov edx,[input_file] cmp [esi],edx jne line_not_from_main_input mov [esi],eax line_not_from_main_input: sub [esi],eax test byte [esi+7],1 shl 7 jz prepare_next_preprocessed_line sub [esi+8],eax sub [esi+12],eax prepare_next_preprocessed_line: call skip_preprocessed_line jmp prepare_preprocessed_line preprocessed_source_ok: ret skip_preprocessed_line: add esi,16 skip_preprocessed_line_content: lods byte [esi] cmp al,1Ah je skip_preprocessed_symbol cmp al,3Bh je skip_preprocessed_symbol cmp al,22h je skip_preprocessed_string or al,al jnz skip_preprocessed_line_content ret skip_preprocessed_string: lods dword [esi] add esi,eax jmp skip_preprocessed_line_content skip_preprocessed_symbol: lods byte [esi] movzx eax,al add esi,eax jmp skip_preprocessed_line_content restore_preprocessed_source: mov esi,[memory_start] mov ebp,[source_start] test ebp,ebp jnz restore_preprocessed_line mov ebp,[current_line] inc ebp restore_preprocessed_line: cmp esi,ebp jae preprocessed_source_restored mov eax,[memory_start] add [esi],eax cmp [esi],eax jne preprocessed_line_source_restored mov edx,[input_file] mov [esi],edx preprocessed_line_source_restored: test byte [esi+7],1 shl 7 jz restore_next_preprocessed_line add [esi+8],eax add [esi+12],eax restore_next_preprocessed_line: call skip_preprocessed_line jmp restore_preprocessed_line preprocessed_source_restored: ret dump_preprocessed_source: mov edi,[free_additional_memory] call setup_dump_header mov esi,[input_file] call copy_asciiz cmp edi,[additional_memory_end] jae out_of_memory mov eax,edi sub eax,ebx dec eax mov [ebx-38h+0Ch],eax mov eax,edi sub eax,ebx mov [ebx-38h+14h],eax add eax,38h mov [ebx-38h+20h],eax call prepare_preprocessed_source sub esi,[memory_start] mov [ebx-38h+24h],esi mov edx,[symbols_file] call create jc write_failed mov edx,[free_additional_memory] mov ecx,[edx+14h] add ecx,38h call write jc write_failed mov edx,[memory_start] mov ecx,esi call write jc write_failed call close ret