diff --git a/programs/develop/fasm/trunk/errors.inc b/programs/develop/fasm/trunk/errors.inc index 62d2ddba5d..4d2687b11a 100644 --- a/programs/develop/fasm/trunk/errors.inc +++ b/programs/develop/fasm/trunk/errors.inc @@ -4,128 +4,168 @@ ; All rights reserved. out_of_memory: - call fatal_error - db 'out of memory',0 + push _out_of_memory + jmp fatal_error stack_overflow: - call fatal_error - db 'out of stack space',0 + push _stack_overflow + jmp fatal_error main_file_not_found: - call fatal_error - db 'source file not found',0 + push _main_file_not_found + jmp fatal_error unexpected_end_of_file: - call fatal_error - db 'unexpected end of file',0 + push _unexpected_end_of_file + jmp fatal_error code_cannot_be_generated: - call fatal_error - db 'code cannot be generated',0 + push _code_cannot_be_generated + jmp fatal_error format_limitations_exceeded: - call fatal_error - db 'format limitations exceeded',0 + push _format_limitations_exceeded + jmp fatal_error +invalid_definition: + push _invalid_definition + jmp fatal_error write_failed: - call fatal_error - db 'write failed',0 + push _write_failed + jmp fatal_error + file_not_found: - call assembler_error - db 'file not found',0 + push _file_not_found + jmp assembler_error error_reading_file: - call assembler_error - db 'error reading file',0 + push _error_reading_file + jmp assembler_error invalid_file_format: - call assembler_error - db 'invalid file format',0 + push _invalid_file_format + jmp assembler_error invalid_macro_arguments: - call assembler_error - db 'invalid macro arguments',0 + push _invalid_macro_arguments + jmp assembler_error incomplete_macro: - call assembler_error - db 'incomplete macro',0 + push _incomplete_macro + jmp assembler_error unexpected_characters: - call assembler_error - db 'unexpected characters',0 + push _unexpected_characters + jmp assembler_error invalid_argument: - call assembler_error - db 'invalid argument',0 + push _invalid_argument + jmp assembler_error illegal_instruction: - call assembler_error - db 'illegal instruction',0 + push _illegal_instruction + jmp assembler_error invalid_operand: - call assembler_error - db 'invalid operand',0 + push _invalid_operand + jmp assembler_error invalid_operand_size: - call assembler_error - db 'invalid size of operand',0 + push _invalid_operand_size + jmp assembler_error operand_size_not_specified: - call assembler_error - db 'operand size not specified',0 + push _operand_size_not_specified + jmp assembler_error operand_sizes_do_not_match: - call assembler_error - db 'operand sizes do not match',0 + push _operand_sizes_do_not_match + jmp assembler_error invalid_address_size: - call assembler_error - db 'invalid size of address value',0 + push _invalid_address_size + jmp assembler_error address_sizes_do_not_agree: - call assembler_error - db 'address sizes do not agree',0 + push _address_sizes_do_not_agree + jmp assembler_error prefix_conflict: - call assembler_error - db 'disallowed combination of registers',0 + push _prefix_conflict + jmp assembler_error long_immediate_not_encodable: - call assembler_error - db 'not encodable with long immediate',0 + push _long_immediate_not_encodable + jmp assembler_error relative_jump_out_of_range: - call assembler_error - db 'relative jump out of range',0 + push _relative_jump_out_of_range + jmp assembler_error invalid_expression: - call assembler_error - db 'invalid expression',0 + push _invalid_expression + jmp assembler_error invalid_address: - call assembler_error - db 'invalid address',0 + push _invalid_address + jmp assembler_error invalid_value: - call assembler_error - db 'invalid value',0 + push _invalid_value + jmp assembler_error value_out_of_range: - call assembler_error - db 'value out of range',0 + push _value_out_of_range + jmp assembler_error undefined_symbol: - call assembler_error - db 'undefined symbol',0 + mov edi,message + mov esi,_undefined_symbol + call copy_asciiz + push message + cmp [error_info],0 + je assembler_error + mov byte [edi-1],20h + call write_quoted_symbol_name + jmp assembler_error + copy_asciiz: + lods byte [esi] + stos byte [edi] + test al,al + jnz copy_asciiz + ret + write_quoted_symbol_name: + mov al,27h + stosb + mov esi,[error_info] + movzx ecx,byte [esi-1] + rep movs byte [edi],[esi] + mov ax,27h + stosw + ret +symbol_out_of_scope: + mov edi,message + mov esi,_symbol_out_of_scope_1 + call copy_asciiz + cmp [error_info],0 + je finish_symbol_out_of_scope_message + mov byte [edi-1],20h + call write_quoted_symbol_name + finish_symbol_out_of_scope_message: + mov byte [edi-1],20h + mov esi,_symbol_out_of_scope_2 + call copy_asciiz + push message + jmp assembler_error invalid_use_of_symbol: - call assembler_error - db 'invalid use of symbol',0 + push _invalid_use_of_symbol + jmp assembler_error name_too_long: - call assembler_error - db 'name too long',0 + push _name_too_long + jmp assembler_error invalid_name: - call assembler_error - db 'invalid name',0 + push _invalid_name + jmp assembler_error reserved_word_used_as_symbol: - call assembler_error - db 'reserved word used as symbol',0 + push _reserved_word_used_as_symbol + jmp assembler_error symbol_already_defined: - call assembler_error - db 'symbol already defined',0 + push _symbol_already_defined + jmp assembler_error missing_end_quote: - call assembler_error - db 'missing end quote',0 + push _missing_end_quote + jmp assembler_error missing_end_directive: - call assembler_error - db 'missing end directive',0 + push _missing_end_directive + jmp assembler_error unexpected_instruction: - call assembler_error - db 'unexpected instruction',0 + push _unexpected_instruction + jmp assembler_error extra_characters_on_line: - call assembler_error - db 'extra characters on line',0 + push _extra_characters_on_line + jmp assembler_error section_not_aligned_enough: - call assembler_error - db 'section is not aligned enough',0 + push _section_not_aligned_enough + jmp assembler_error setting_already_specified: - call assembler_error - db 'setting already specified',0 + push _setting_already_specified + jmp assembler_error data_already_defined: - call assembler_error - db 'data already defined',0 + push _data_already_defined + jmp assembler_error too_many_repeats: - call assembler_error - db 'too many repeats',0 + push _too_many_repeats + jmp assembler_error diff --git a/programs/develop/fasm/trunk/expressi.inc b/programs/develop/fasm/trunk/expressi.inc index 76ab3e7f97..6f1774bbd4 100644 --- a/programs/develop/fasm/trunk/expressi.inc +++ b/programs/develop/fasm/trunk/expressi.inc @@ -956,7 +956,7 @@ calculate_expression: cmp ax,[ebx+16] je label_defined test byte [ebx+8],4 - jnz label_undefined + jnz label_out_of_scope test byte [ebx+9],1 jz label_defined mov eax,[ebx] @@ -1053,7 +1053,22 @@ calculate_expression: je timestamp_label cmp eax,3 je org_origin_label + mov edx,invalid_value + jmp error_undefined + label_out_of_scope: + mov edx,symbol_out_of_scope + mov eax,[ebx+24] + cmp [error_line],0 + jne error_undefined + mov [error_info],eax + jmp error_undefined label_undefined: + mov edx,undefined_symbol + cmp [error_line],0 + jne error_undefined + mov eax,[ebx+24] + mov [error_info],eax + error_undefined: cmp [current_pass],1 ja undefined_value force_next_pass: @@ -1069,7 +1084,7 @@ calculate_expression: jne calculation_loop mov eax,[current_line] mov [error_line],eax - mov [error],undefined_symbol + mov [error],edx jmp calculation_loop calculate_add: mov ecx,[ebx+16] diff --git a/programs/develop/fasm/trunk/fasm.asm b/programs/develop/fasm/trunk/fasm.asm index ae9137cd22..e3cb8ce77f 100644 --- a/programs/develop/fasm/trunk/fasm.asm +++ b/programs/develop/fasm/trunk/fasm.asm @@ -544,6 +544,7 @@ include 'formats.inc' include 'x86_64.inc' include 'tables.inc' include 'symbdump.inc' +include 'messages.inc' title db appname,VERSION_STRING,0 @@ -586,6 +587,8 @@ buffer_address dd ? memory_setting dd ? start_time dd ? +predefinitions rb 1000h + dbgfilename rb MAX_PATH+4 sc system_colors diff --git a/programs/develop/fasm/trunk/formats.inc b/programs/develop/fasm/trunk/formats.inc index 787f4b7a35..e995268967 100644 --- a/programs/develop/fasm/trunk/formats.inc +++ b/programs/develop/fasm/trunk/formats.inc @@ -2666,10 +2666,10 @@ coff_formatter: mov [current_line],eax mov eax,[esi+8] test byte [eax+8],1 - jz undefined_symbol + jz undefined_coff_public mov cx,[current_pass] cmp cx,[eax+16] - jne undefined_symbol + jne undefined_coff_public mov cl,[eax+11] or cl,cl jz public_constant @@ -2678,6 +2678,10 @@ coff_formatter: cmp cl,2 je public_symbol_type_ok jmp invalid_use_of_symbol + undefined_coff_public: + mov eax,[eax+24] + mov [error_info],eax + jmp undefined_symbol check_64bit_public_symbol: cmp cl,4 jne invalid_use_of_symbol @@ -3092,10 +3096,10 @@ elf_formatter: jne invalid_argument mov ebx,[esi+8] test byte [ebx+8],1 - jz undefined_symbol + jz undefined_public mov ax,[current_pass] cmp ax,[ebx+16] - jne undefined_symbol + jne undefined_public mov dl,[ebx+11] or dl,dl jz public_absolute @@ -3109,6 +3113,10 @@ elf_formatter: jne invalid_use_of_symbol mov dx,[eax+0Eh] jmp section_for_public_ok + undefined_public: + mov eax,[ebx+24] + mov [error_info],eax + jmp undefined_symbol elf64_public: cmp dl,4 jne invalid_use_of_symbol diff --git a/programs/develop/fasm/trunk/messages.inc b/programs/develop/fasm/trunk/messages.inc new file mode 100644 index 0000000000..4aa482b3ec --- /dev/null +++ b/programs/develop/fasm/trunk/messages.inc @@ -0,0 +1,51 @@ + +; flat assembler core +; Copyright (c) 1999-2007, Tomasz Grysztar. +; All rights reserved. + +_out_of_memory db 'out of memory',0 +_stack_overflow db 'out of stack space',0 +_main_file_not_found db 'source file not found',0 +_unexpected_end_of_file db 'unexpected end of file',0 +_code_cannot_be_generated db 'code cannot be generated',0 +_format_limitations_exceeded db 'format limitations exceeded',0 +_invalid_definition db 'invalid definition provided',0 +_write_failed db 'write failed',0 +_file_not_found db 'file not found',0 +_error_reading_file db 'error reading file',0 +_invalid_file_format db 'invalid file format',0 +_invalid_macro_arguments db 'invalid macro arguments',0 +_incomplete_macro db 'incomplete macro',0 +_unexpected_characters db 'unexpected characters',0 +_invalid_argument db 'invalid argument',0 +_illegal_instruction db 'illegal instruction',0 +_invalid_operand db 'invalid operand',0 +_invalid_operand_size db 'invalid size of operand',0 +_operand_size_not_specified db 'operand size not specified',0 +_operand_sizes_do_not_match db 'operand sizes do not match',0 +_invalid_address_size db 'invalid size of address value',0 +_address_sizes_do_not_agree db 'address sizes do not agree',0 +_prefix_conflict db 'disallowed combination of registers',0 +_long_immediate_not_encodable db 'not encodable with long immediate',0 +_relative_jump_out_of_range db 'relative jump out of range',0 +_invalid_expression db 'invalid expression',0 +_invalid_address db 'invalid address',0 +_invalid_value db 'invalid value',0 +_value_out_of_range db 'value out of range',0 +_undefined_symbol db 'undefined symbol',0 +_symbol_out_of_scope_1 db 'symbol',0 +_symbol_out_of_scope_2 db 'out of scope',0 +_invalid_use_of_symbol db 'invalid use of symbol',0 +_name_too_long db 'name too long',0 +_invalid_name db 'invalid name',0 +_reserved_word_used_as_symbol db 'reserved word used as symbol',0 +_symbol_already_defined db 'symbol already defined',0 +_missing_end_quote db 'missing end quote',0 +_missing_end_directive db 'missing end directive',0 +_unexpected_instruction db 'unexpected instruction',0 +_extra_characters_on_line db 'extra characters on line',0 +_section_not_aligned_enough db 'section is not aligned enough',0 +_setting_already_specified db 'setting already specified',0 +_data_already_defined db 'data already defined',0 +_too_many_repeats db 'too many repeats',0 + \ No newline at end of file diff --git a/programs/develop/fasm/trunk/preproce.inc b/programs/develop/fasm/trunk/preproce.inc index 33bcbef77b..e4e434856b 100644 --- a/programs/develop/fasm/trunk/preproce.inc +++ b/programs/develop/fasm/trunk/preproce.inc @@ -23,11 +23,8 @@ preprocessor: mov byte [edi+eax],0 loop mark_symbol_characters mov edi,locals_counter - mov al,7 - stos byte [edi] - movzx ecx,al - mov al,'0' - rep stos byte [edi] + mov ax,1 + '0' shl 8 + stos word [edi] mov edi,[memory_start] mov [include_paths],edi mov esi,include_variable @@ -43,6 +40,149 @@ preprocessor: mov [display_buffer],eax mov [hash_tree],eax mov [macro_status],al + + mov esi,predefinitions + process_predefinitions: + movzx ecx,byte [esi] + test ecx,ecx + jz predefinitions_ok + inc esi + lea eax,[esi+ecx] + push eax + mov ch,10b + call add_preprocessor_symbol + pop esi + mov edi,[memory_start] + mov [edx+8],edi + convert_predefinition: + cmp edi,[memory_end] + jae out_of_memory + lods byte [esi] + or al,al + jz predefinition_converted + cmp al,20h + je convert_predefinition + mov ah,al + mov ebx,characters + xlat byte [ebx] + or al,al + jz predefinition_separator + cmp ah,27h + je predefinition_string + cmp ah,22h + je predefinition_string + mov byte [edi],1Ah + scas word [edi] + xchg al,ah + stos byte [edi] + mov ebx,characters + xor ecx,ecx + predefinition_symbol: + lods byte [esi] + stos byte [edi] + xlat byte [ebx] + or al,al + loopnzd predefinition_symbol + neg ecx + cmp ecx,255 + ja invalid_definition + mov ebx,edi + sub ebx,ecx + mov byte [ebx-2],cl + found_predefinition_separator: + dec edi + mov ah,[esi-1] + predefinition_separator: + xchg al,ah + or al,al + jz predefinition_converted + cmp al,20h + je convert_line_data + cmp al,3Bh + je invalid_definition + cmp al,5Ch + je predefinition_backslash + stos byte [edi] + jmp convert_predefinition + predefinition_string: + mov al,22h + stos byte [edi] + scas dword [edi] + mov ebx,edi + copy_predefinition_string: + lods byte [esi] + stos byte [edi] + or al,al + jz invalid_definition + cmp al,ah + jne copy_predefinition_string + lods byte [esi] + cmp al,ah + je copy_predefinition_string + dec esi + dec edi + mov eax,edi + sub eax,ebx + mov [ebx-4],eax + jmp convert_predefinition + predefinition_backslash: + mov byte [edi],0 + lods byte [esi] + or al,al + jz invalid_definition + cmp al,20h + je invalid_definition + cmp al,3Bh + je invalid_definition + mov al,1Ah + stos byte [edi] + mov ecx,edi + mov ax,5C01h + stos word [edi] + dec esi + group_predefinition_backslashes: + lods byte [esi] + cmp al,5Ch + jne predefinition_backslashed_symbol + stos byte [edi] + inc byte [ecx] + jmp group_predefinition_backslashes + predefinition_backslashed_symbol: + cmp al,20h + je invalid_definition + cmp al,22h + je invalid_definition + cmp al,27h + je invalid_definition + cmp al,3Bh + je invalid_definition + mov ah,al + mov ebx,characters + xlat byte [ebx] + or al,al + jz predefinition_backslashed_symbol_character + mov al,ah + convert_predefinition_backslashed_symbol: + stos byte [edi] + xlat byte [ebx] + or al,al + jz found_predefinition_separator + inc byte [ecx] + jz invalid_definition + lods byte [esi] + jmp convert_predefinition_backslashed_symbol + predefinition_backslashed_symbol_character: + mov al,ah + stos byte [edi] + inc byte [ecx] + jmp convert_predefinition + predefinition_converted: + mov [memory_start],edi + sub edi,[edx+8] + mov [edx+12],edi + jmp process_predefinitions + predefinitions_ok: + mov esi,[input_file] mov edx,esi call open @@ -2220,16 +2360,25 @@ local_symbols: movzx ecx,byte [eax] counter_loop: inc byte [eax+ecx] - cmp byte [eax+ecx],':' + cmp byte [eax+ecx],'9'+1 jb counter_ok jne letter_digit mov byte [eax+ecx],'A' jmp counter_ok letter_digit: - cmp byte [eax+ecx],'F' - jbe counter_ok + cmp byte [eax+ecx],'Z'+1 + jb counter_ok + jne small_letter_digit + mov byte [eax+ecx],'a' + jmp counter_ok + small_letter_digit: + cmp byte [eax+ecx],'z'+1 + jb counter_ok mov byte [eax+ecx],'0' loop counter_loop + inc byte [eax] + movzx ecx,byte [eax] + mov byte [eax+ecx],'0' counter_ok: pop ecx lods byte [esi] diff --git a/programs/develop/fasm/trunk/SYMBDUMP.INC b/programs/develop/fasm/trunk/symbdump.inc similarity index 100% rename from programs/develop/fasm/trunk/SYMBDUMP.INC rename to programs/develop/fasm/trunk/symbdump.inc diff --git a/programs/develop/fasm/trunk/variable.inc b/programs/develop/fasm/trunk/variable.inc index f7333520b5..9d03f9c8ed 100644 --- a/programs/develop/fasm/trunk/variable.inc +++ b/programs/develop/fasm/trunk/variable.inc @@ -57,6 +57,7 @@ undefined_data_start dd ? undefined_data_end dd ? counter dd ? counter_limit dd ? +error_info dd ? error_line dd ? error dd ? display_buffer dd ? @@ -122,3 +123,4 @@ logical_value_wrapping db ? characters rb 100h converted rb 100h +message rb 200h diff --git a/programs/develop/fasm/trunk/version.inc b/programs/develop/fasm/trunk/version.inc index 643b289189..af9eb3e5b9 100644 --- a/programs/develop/fasm/trunk/version.inc +++ b/programs/develop/fasm/trunk/version.inc @@ -33,7 +33,7 @@ ; cannot simply be copied and put under another distribution licence ; (including the GNU Public Licence). -VERSION_STRING equ "1.67.23" +VERSION_STRING equ "1.67.25" VERSION_MAJOR = 1 VERSION_MINOR = 67