fasm: 1.71.16

git-svn-id: svn://kolibrios.org@4478 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Ivan Baravy 2014-01-18 17:28:37 +00:00
parent b2e030871f
commit 69834ba166
13 changed files with 9528 additions and 9330 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
@erase lang.inc @erase lang.inc
@echo lang fix en >lang.inc @echo lang fix en >lang.inc
@fasm -m 16384 fasm.asm fasm @fasm -m 16384 fasm.asm fasm
@erase lang.inc @erase lang.inc
@kpack fasm @kpack fasm
@pause @pause

View File

@ -1,6 +1,6 @@
@erase lang.inc @erase lang.inc
@echo lang fix ru >lang.inc @echo lang fix ru >lang.inc
@fasm -m 16384 fasm.asm fasm @fasm -m 16384 fasm.asm fasm
@erase lang.inc @erase lang.inc
@kpack fasm @kpack fasm
@pause @pause

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -3707,6 +3707,7 @@ format_elf_exe:
add eax,edi add eax,edi
adc ebp,0 adc ebp,0
adc cl,0 adc cl,0
mov edx,ebp
elf_exe_addressing_setup: elf_exe_addressing_setup:
push eax push eax
call init_addressing_space call init_addressing_space
@ -3938,6 +3939,7 @@ elf_segment:
add eax,edi add eax,edi
sub eax,edx sub eax,edx
mov [ebx+10h],eax mov [ebx+10h],eax
and [undefined_data_end],0
mov eax,[ebx+8] mov eax,[ebx+8]
cmp byte [ebx],1 cmp byte [ebx],1
jne elf_segment_position_ok jne elf_segment_position_ok
@ -4067,6 +4069,7 @@ elf_segment:
add eax,edi add eax,edi
sub eax,edx sub eax,edx
mov [ebx+20h],eax mov [ebx+20h],eax
and [undefined_data_end],0
mov eax,[ebx+10h] mov eax,[ebx+10h]
mov edx,[ebx+10h+4] mov edx,[ebx+10h+4]
cmp byte [ebx],1 cmp byte [ebx],1

View File

@ -1,6 +1,6 @@
flat assembler version 1.70 flat assembler version 1.71
Copyright (c) 1999-2012, Tomasz Grysztar. Copyright (c) 1999-2013, Tomasz Grysztar.
All rights reserved. All rights reserved.
This program is free for commercial and non-commercial use as long as This program is free for commercial and non-commercial use as long as

View File

@ -1,52 +1,52 @@
; flat assembler core ; flat assembler core
; Copyright (c) 1999-2013, Tomasz Grysztar. ; Copyright (c) 1999-2013, Tomasz Grysztar.
; All rights reserved. ; All rights reserved.
_out_of_memory db 'out of memory',0 _out_of_memory db 'out of memory',0
_stack_overflow db 'out of stack space',0 _stack_overflow db 'out of stack space',0
_main_file_not_found db 'source file not found',0 _main_file_not_found db 'source file not found',0
_unexpected_end_of_file db 'unexpected end of file',0 _unexpected_end_of_file db 'unexpected end of file',0
_code_cannot_be_generated db 'code cannot be generated',0 _code_cannot_be_generated db 'code cannot be generated',0
_format_limitations_exceeded db 'format limitations exceeded',0 _format_limitations_exceeded db 'format limitations exceeded',0
_invalid_definition db 'invalid definition provided',0 _invalid_definition db 'invalid definition provided',0
_write_failed db 'write failed',0 _write_failed db 'write failed',0
_file_not_found db 'file not found',0 _file_not_found db 'file not found',0
_error_reading_file db 'error reading file',0 _error_reading_file db 'error reading file',0
_invalid_file_format db 'invalid file format',0 _invalid_file_format db 'invalid file format',0
_invalid_macro_arguments db 'invalid macro arguments',0 _invalid_macro_arguments db 'invalid macro arguments',0
_incomplete_macro db 'incomplete macro',0 _incomplete_macro db 'incomplete macro',0
_unexpected_characters db 'unexpected characters',0 _unexpected_characters db 'unexpected characters',0
_invalid_argument db 'invalid argument',0 _invalid_argument db 'invalid argument',0
_illegal_instruction db 'illegal instruction',0 _illegal_instruction db 'illegal instruction',0
_invalid_operand db 'invalid operand',0 _invalid_operand db 'invalid operand',0
_invalid_operand_size db 'invalid size of operand',0 _invalid_operand_size db 'invalid size of operand',0
_operand_size_not_specified db 'operand size not specified',0 _operand_size_not_specified db 'operand size not specified',0
_operand_sizes_do_not_match db 'operand sizes do not match',0 _operand_sizes_do_not_match db 'operand sizes do not match',0
_invalid_address_size db 'invalid size of address value',0 _invalid_address_size db 'invalid size of address value',0
_address_sizes_do_not_agree db 'address sizes do not agree',0 _address_sizes_do_not_agree db 'address sizes do not agree',0
_disallowed_combination_of_registers db 'disallowed combination of registers',0 _disallowed_combination_of_registers db 'disallowed combination of registers',0
_long_immediate_not_encodable db 'not encodable with long immediate',0 _long_immediate_not_encodable db 'not encodable with long immediate',0
_relative_jump_out_of_range db 'relative jump out of range',0 _relative_jump_out_of_range db 'relative jump out of range',0
_invalid_expression db 'invalid expression',0 _invalid_expression db 'invalid expression',0
_invalid_address db 'invalid address',0 _invalid_address db 'invalid address',0
_invalid_value db 'invalid value',0 _invalid_value db 'invalid value',0
_value_out_of_range db 'value out of range',0 _value_out_of_range db 'value out of range',0
_undefined_symbol db 'undefined symbol',0 _undefined_symbol db 'undefined symbol',0
_symbol_out_of_scope_1 db 'symbol',0 _symbol_out_of_scope_1 db 'symbol',0
_symbol_out_of_scope_2 db 'out of scope',0 _symbol_out_of_scope_2 db 'out of scope',0
_invalid_use_of_symbol db 'invalid use of symbol',0 _invalid_use_of_symbol db 'invalid use of symbol',0
_name_too_long db 'name too long',0 _name_too_long db 'name too long',0
_invalid_name db 'invalid name',0 _invalid_name db 'invalid name',0
_reserved_word_used_as_symbol db 'reserved word used as symbol',0 _reserved_word_used_as_symbol db 'reserved word used as symbol',0
_symbol_already_defined db 'symbol already defined',0 _symbol_already_defined db 'symbol already defined',0
_missing_end_quote db 'missing end quote',0 _missing_end_quote db 'missing end quote',0
_missing_end_directive db 'missing end directive',0 _missing_end_directive db 'missing end directive',0
_unexpected_instruction db 'unexpected instruction',0 _unexpected_instruction db 'unexpected instruction',0
_extra_characters_on_line db 'extra characters on line',0 _extra_characters_on_line db 'extra characters on line',0
_section_not_aligned_enough db 'section is not aligned enough',0 _section_not_aligned_enough db 'section is not aligned enough',0
_setting_already_specified db 'setting already specified',0 _setting_already_specified db 'setting already specified',0
_data_already_defined db 'data already defined',0 _data_already_defined db 'data already defined',0
_too_many_repeats db 'too many repeats',0 _too_many_repeats db 'too many repeats',0
_invoked_error db 'error directive encountered in source file',0 _invoked_error db 'error directive encountered in source file',0
_assertion_failed db 'assertion failed',0 _assertion_failed db 'assertion failed',0

View File

@ -48,12 +48,45 @@ preprocessor:
jc main_file_not_found jc main_file_not_found
mov edi,[memory_start] mov edi,[memory_start]
call preprocess_file call preprocess_file
cmp [macro_status],0
je process_postponed
mov eax,[error_line] mov eax,[error_line]
mov [current_line],eax mov [current_line],eax
cmp [macro_status],0 jmp incomplete_macro
jne incomplete_macro process_postponed:
mov edx,hash_tree
mov ecx,32
find_postponed_list:
mov edx,[edx]
or edx,edx
loopnz find_postponed_list
jz preprocessing_finished
process_postponed_list:
mov eax,[edx]
or eax,eax
jz preprocessing_finished
push edx
mov ebx,edx
find_earliest_postponed:
mov eax,[edx]
or eax,eax
jz earliest_postponed_found
mov ebx,edx
mov edx,eax
jmp find_earliest_postponed
earliest_postponed_found:
mov [ebx],eax
call use_postponed_macro
pop edx
jmp process_postponed_list
preprocessing_finished:
mov [source_start],edi mov [source_start],edi
ret ret
use_postponed_macro:
lea esi,[edi-1]
push ecx esi
mov [struc_name],0
jmp use_macro
preprocess_file: preprocess_file:
push [memory_end] push [memory_end]
@ -691,6 +724,9 @@ get_preprocessor_symbol:
ret ret
add_preprocessor_symbol: add_preprocessor_symbol:
push edi esi push edi esi
xor eax,eax
or cl,cl
jz reshape_hash
cmp ch,11b cmp ch,11b
je preprocessor_symbol_name_ok je preprocessor_symbol_name_ok
push ecx push ecx
@ -701,6 +737,7 @@ add_preprocessor_symbol:
pop ecx pop ecx
preprocessor_symbol_name_ok: preprocessor_symbol_name_ok:
call calculate_hash call calculate_hash
reshape_hash:
mov ebp,eax mov ebp,eax
and ebp,3FFh and ebp,3FFh
shr eax,10 shr eax,10
@ -1013,6 +1050,27 @@ define_macro:
lods dword [esi] lods dword [esi]
add esi,eax add esi,eax
jmp skip_macro_block jmp skip_macro_block
postpone_directive:
push esi
mov esi,edx
xor ecx,ecx
call add_preprocessor_symbol
mov eax,[current_line]
mov [edx+12],eax
pop esi
mov [edx+8],esi
mov al,[macro_status]
and al,0F0h
or al,1
mov [macro_status],al
mov eax,[current_line]
mov [error_line],eax
lods byte [esi]
or al,al
jz line_preprocessed
cmp al,'{'
jne unexpected_characters
jmp found_macro_block
rept_directive: rept_directive:
mov [base_code],0 mov [base_code],0
jmp define_instant_macro jmp define_instant_macro
@ -1987,8 +2045,21 @@ process_macro:
stos dword [edi] stos dword [edi]
jmp macro_line_header_ok jmp macro_line_header_ok
instant_macro_line_header: instant_macro_line_header:
mov eax,[macro_line] mov eax,[esp]
add eax,16+1 add eax,16
find_defining_directive:
inc eax
cmp byte [eax-1],3Bh
je defining_directive_ok
cmp byte [eax-1],1Ah
jne find_defining_directive
push eax
movzx eax,byte [eax]
inc eax
add [esp],eax
pop eax
jmp find_defining_directive
defining_directive_ok:
stos dword [edi] stos dword [edi]
mov eax,ecx mov eax,ecx
stos dword [edi] stos dword [edi]

View File

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

File diff suppressed because it is too large Load Diff

View File

@ -33,7 +33,7 @@
; cannot simply be copied and put under another distribution licence ; cannot simply be copied and put under another distribution licence
; (including the GNU Public Licence). ; (including the GNU Public Licence).
VERSION_STRING equ "1.71.13" VERSION_STRING equ "1.71.16"
VERSION_MAJOR = 1 VERSION_MAJOR = 1
VERSION_MINOR = 71 VERSION_MINOR = 71

View File

@ -2,6 +2,128 @@
Visit http://flatassembler.net/ for more information. Visit http://flatassembler.net/ for more information.
version 1.71.16 (Oct 30, 2013)
[-] Fixed some bugs in the ELF executable formatter.
version 1.71.15 (Oct 26, 2013)
[-] Fixed some bugs inadvertently introduced in the previous release.
version 1.71.14 (Oct 25, 2013)
[+] Added "postpone" directive to preprocessor.
version 1.71.13 (Sep 09, 2013)
[-] Fixed a bug that caused the expressions containing external symbols
to overflow from time to time.
version 1.71.12 (Aug 04, 2013)
[-] Expressions in square brackets were incorrectly treated as valid numerical
values when used in some logical expressions.
[-] A previous fix to "store" directive did not apply to all the cases when it
was incorrectly leaving the data marked as uninitialized. The new fix
addresses this issue.
version 1.71.11 (Jul 09, 2013)
[-] Modifying a value in uninitialized data block with "store" directive will
now correctly mark this data as initialized when it is in a different
addressing space.
[-] Missing quote will no longer cause the symbols generator to hang or crash.
[-] Address range restrictions for addressing modes no longer apply to addresses
provided to assembler directives like "label", "virtual" or "load".
version 1.71.10 (Apr 03, 2013)
[-] Fixed a crashing "heap" directive in 64-bit PE format.
version 1.71.09 (Mar 30, 2013)
[-] "use16","use32" and "use64" no longer allow to put another instruction in
the same line.
[-] Fixed a bug in parser that caused it to hang while processing some
specific ill-structured preprocessed lines.
[-] Modified memory allocation algorithm on Windows machines with large RAM.
version 1.71.08 (Mar 08, 2013)
[-] Fixed a bug that caused "irp" to skip processing a list with one empty
element when default value for iterating variable was specified.
version 1.71.07 (Dec 23, 2012)
[-] Fixed a bug that was causing "used" operator to give incorrect results
in some very specific cases.
version 1.71.06 (Nov 22, 2012)
[-] Fixed a few bugs caused by unnecesarily strong restrictions on allowed
types of relocatable values in some places (like "label" directive).
version 1.71.05 (Oct 15, 2012)
[-] Fixed a bug which caused "load" and "store" directives to sometimes
fail when assembler had preallocated very large amount of memory.
version 1.71.04 (Oct 10, 2012)
[-] Fixed another bug in "org" directive, which was causing it to deal
incorrectly with negative addresses.
version 1.71.03 (Sep 27, 2012)
[-] Fixed a bug in "org" directive introduced by recent changes, which
was manifesting with bases larger than 31-bit.
version 1.71.02 (Sep 26, 2012)
[-] Expression calculator now allows to calculate the difference of
relocatable addresses in a reverse order (first substracting/negating
and then adding the other one).
version 1.71.01 (Sep 23, 2012)
[+] Added support for ADX, RDSEED and SMAP instruction sets.
[-] Fixed the bugs related to creating a new addressing space inside the
virtual block with "org" directive.
version 1.71.00 (Sep 21, 2012)
[+] Added ability to define a special kind of label identifying the
addressing space. This label can the be used with "load" or "store"
directives to allow operations on bytes in any addressing space,
not just the current one. This special label is defined by following
its name with double colon, and can only be used with "load" and
"store" directive, where address can now be specified in two parts,
first the adressing space label, then the colon and then the
address inside that addressing space.
version 1.70.03 (Jun 29, 2012) version 1.70.03 (Jun 29, 2012)
[-] Allowed to freely upgrade or downgrade the relocatable addresses in [-] Allowed to freely upgrade or downgrade the relocatable addresses in