450 lines
9.0 KiB
PHP
450 lines
9.0 KiB
PHP
|
|
; flat assembler core
|
|
; Copyright (c) 1999-2016, Tomasz Grysztar.
|
|
; All rights reserved.
|
|
|
|
dump_symbols:
|
|
mov edi,[code_start]
|
|
call setup_dump_header
|
|
mov esi,[input_file]
|
|
call copy_asciiz
|
|
cmp edi,[tagged_blocks]
|
|
jae out_of_memory
|
|
mov eax,edi
|
|
sub eax,ebx
|
|
mov [ebx-40h+0Ch],eax
|
|
mov esi,[output_file]
|
|
call copy_asciiz
|
|
cmp edi,[tagged_blocks]
|
|
jae out_of_memory
|
|
mov edx,[symbols_stream]
|
|
mov ebp,[free_additional_memory]
|
|
and [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,[tagged_blocks]
|
|
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,[tagged_blocks]
|
|
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,[tagged_blocks]
|
|
jae out_of_memory
|
|
jmp prepare_strings_table
|
|
strings_table_ready:
|
|
mov edx,[tagged_blocks]
|
|
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,[tagged_blocks]
|
|
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:
|
|
test byte [edx+9],4
|
|
jz convert_base_symbol_for_label
|
|
xor eax,eax
|
|
mov [edx],eax
|
|
mov [edx+4],eax
|
|
jmp base_symbol_for_label_ok
|
|
convert_base_symbol_for_label:
|
|
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-40h+14h],eax
|
|
add eax,40h
|
|
mov [ebx-40h+18h],eax
|
|
mov ecx,[memory_end]
|
|
sub ecx,[labels_list]
|
|
mov [ebx-40h+1Ch],ecx
|
|
add eax,ecx
|
|
mov [ebx-40h+20h],eax
|
|
mov ecx,[source_start]
|
|
sub ecx,[memory_start]
|
|
mov [ebx-40h+24h],ecx
|
|
add eax,ecx
|
|
mov [ebx-40h+28h],eax
|
|
mov eax,[number_of_sections]
|
|
shl eax,2
|
|
mov [ebx-40h+34h],eax
|
|
call prepare_preprocessed_source
|
|
mov esi,[labels_list]
|
|
mov ebp,edi
|
|
make_lines_dump:
|
|
cmp esi,[tagged_blocks]
|
|
je lines_dump_ok
|
|
mov eax,[esi-4]
|
|
mov ecx,[esi-8]
|
|
sub esi,8
|
|
sub esi,ecx
|
|
cmp eax,1
|
|
je process_line_dump
|
|
cmp eax,2
|
|
jne make_lines_dump
|
|
add dword [ebx-40h+3Ch],8
|
|
jmp make_lines_dump
|
|
process_line_dump:
|
|
push ebx
|
|
mov ebx,[esi+8]
|
|
mov eax,[esi+4]
|
|
sub eax,[code_start]
|
|
add eax,[headers_size]
|
|
test byte [ebx+0Ah],1
|
|
jz 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
|
|
xor cl,cl
|
|
sub eax,[ebx]
|
|
sbb edx,[ebx+4]
|
|
sbb cl,[ebx+8]
|
|
stos dword [edi]
|
|
mov eax,edx
|
|
stos dword [edi]
|
|
mov eax,[ebx+10h]
|
|
stos dword [edi]
|
|
mov eax,[ebx+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 al,[ebx+9]
|
|
stos byte [edi]
|
|
mov al,[esi+10h]
|
|
stos byte [edi]
|
|
mov al,[ebx+0Ah]
|
|
and al,1
|
|
stos byte [edi]
|
|
mov al,cl
|
|
stos byte [edi]
|
|
pop ebx
|
|
cmp edi,[tagged_blocks]
|
|
jae out_of_memory
|
|
mov eax,edi
|
|
sub eax,1Ch
|
|
sub eax,ebp
|
|
mov [esi],eax
|
|
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-40h+14h]
|
|
mov [ebx-40h+2Ch],ecx
|
|
add ecx,[ebx-40h+28h]
|
|
mov [ebx-40h+30h],ecx
|
|
add ecx,[ebx-40h+34h]
|
|
mov [ebx-40h+38h],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:
|
|
and 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,40h
|
|
call write
|
|
jc write_failed
|
|
mov edx,[tagged_blocks]
|
|
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
|
|
mov esi,[labels_list]
|
|
mov edi,[memory_start]
|
|
make_references_dump:
|
|
cmp esi,[tagged_blocks]
|
|
je references_dump_ok
|
|
mov eax,[esi-4]
|
|
mov ecx,[esi-8]
|
|
sub esi,8
|
|
sub esi,ecx
|
|
cmp eax,2
|
|
je dump_reference
|
|
cmp eax,1
|
|
jne make_references_dump
|
|
mov edx,[esi]
|
|
jmp make_references_dump
|
|
dump_reference:
|
|
mov eax,[memory_end]
|
|
sub eax,[esi]
|
|
sub eax,LABEL_STRUCTURE_SIZE
|
|
stosd
|
|
mov eax,edx
|
|
stosd
|
|
cmp edi,[tagged_blocks]
|
|
jb make_references_dump
|
|
jmp out_of_memory
|
|
references_dump_ok:
|
|
mov edx,[memory_start]
|
|
mov ecx,edi
|
|
sub ecx,edx
|
|
call write
|
|
jc write_failed
|
|
call close
|
|
ret
|
|
setup_dump_header:
|
|
xor eax,eax
|
|
mov ecx,40h shr 2
|
|
rep stos dword [edi]
|
|
mov ebx,edi
|
|
mov dword [ebx-40h],'fas'+1Ah shl 24
|
|
mov dword [ebx-40h+4],VERSION_MAJOR + VERSION_MINOR shl 8 + 40h shl 16
|
|
mov dword [ebx-40h+10h],40h
|
|
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-40h+0Ch],eax
|
|
mov eax,edi
|
|
sub eax,ebx
|
|
mov [ebx-40h+14h],eax
|
|
add eax,40h
|
|
mov [ebx-40h+20h],eax
|
|
call prepare_preprocessed_source
|
|
sub esi,[memory_start]
|
|
mov [ebx-40h+24h],esi
|
|
mov edx,[symbols_file]
|
|
call create
|
|
jc write_failed
|
|
mov edx,[free_additional_memory]
|
|
mov ecx,[edx+14h]
|
|
add ecx,40h
|
|
call write
|
|
jc write_failed
|
|
mov edx,[memory_start]
|
|
mov ecx,esi
|
|
call write
|
|
jc write_failed
|
|
call close
|
|
ret |