437 lines
8.0 KiB
NASM
437 lines
8.0 KiB
NASM
|
|
||
|
; flat assembler interface for Win32
|
||
|
; Copyright (c) 1999-2022, Tomasz Grysztar.
|
||
|
; All rights reserved.
|
||
|
|
||
|
format PE console
|
||
|
|
||
|
section '.text' code readable executable
|
||
|
|
||
|
start:
|
||
|
|
||
|
mov [con_handle],STD_OUTPUT_HANDLE
|
||
|
mov esi,_logo
|
||
|
call display_string
|
||
|
|
||
|
call get_params
|
||
|
jc information
|
||
|
|
||
|
call init_memory
|
||
|
|
||
|
mov esi,_memory_prefix
|
||
|
call display_string
|
||
|
mov eax,[memory_end]
|
||
|
sub eax,[memory_start]
|
||
|
add eax,[additional_memory_end]
|
||
|
sub eax,[additional_memory]
|
||
|
shr eax,10
|
||
|
call display_number
|
||
|
mov esi,_memory_suffix
|
||
|
call display_string
|
||
|
|
||
|
call [GetTickCount]
|
||
|
mov [start_time],eax
|
||
|
|
||
|
and [preprocessing_done],0
|
||
|
call preprocessor
|
||
|
or [preprocessing_done],-1
|
||
|
call parser
|
||
|
call assembler
|
||
|
call formatter
|
||
|
|
||
|
call display_user_messages
|
||
|
movzx eax,[current_pass]
|
||
|
inc eax
|
||
|
call display_number
|
||
|
mov esi,_passes_suffix
|
||
|
call display_string
|
||
|
call [GetTickCount]
|
||
|
sub eax,[start_time]
|
||
|
xor edx,edx
|
||
|
mov ebx,100
|
||
|
div ebx
|
||
|
or eax,eax
|
||
|
jz display_bytes_count
|
||
|
xor edx,edx
|
||
|
mov ebx,10
|
||
|
div ebx
|
||
|
push edx
|
||
|
call display_number
|
||
|
mov dl,'.'
|
||
|
call display_character
|
||
|
pop eax
|
||
|
call display_number
|
||
|
mov esi,_seconds_suffix
|
||
|
call display_string
|
||
|
display_bytes_count:
|
||
|
mov eax,[written_size]
|
||
|
call display_number
|
||
|
mov esi,_bytes_suffix
|
||
|
call display_string
|
||
|
xor al,al
|
||
|
jmp exit_program
|
||
|
|
||
|
information:
|
||
|
mov esi,_usage
|
||
|
call display_string
|
||
|
mov al,1
|
||
|
jmp exit_program
|
||
|
|
||
|
get_params:
|
||
|
mov [input_file],0
|
||
|
mov [output_file],0
|
||
|
mov [symbols_file],0
|
||
|
mov [memory_setting],0
|
||
|
mov [passes_limit],100
|
||
|
call [GetCommandLine]
|
||
|
mov [definitions_pointer],predefinitions
|
||
|
mov esi,eax
|
||
|
mov edi,params
|
||
|
find_command_start:
|
||
|
lodsb
|
||
|
cmp al,20h
|
||
|
je find_command_start
|
||
|
cmp al,22h
|
||
|
je skip_quoted_name
|
||
|
skip_name:
|
||
|
lodsb
|
||
|
cmp al,20h
|
||
|
je find_param
|
||
|
or al,al
|
||
|
jz all_params
|
||
|
jmp skip_name
|
||
|
skip_quoted_name:
|
||
|
lodsb
|
||
|
cmp al,22h
|
||
|
je find_param
|
||
|
or al,al
|
||
|
jz all_params
|
||
|
jmp skip_quoted_name
|
||
|
find_param:
|
||
|
lodsb
|
||
|
cmp al,20h
|
||
|
je find_param
|
||
|
cmp al,'-'
|
||
|
je option_param
|
||
|
cmp al,0Dh
|
||
|
je all_params
|
||
|
or al,al
|
||
|
jz all_params
|
||
|
cmp [input_file],0
|
||
|
jne get_output_file
|
||
|
mov [input_file],edi
|
||
|
jmp process_param
|
||
|
get_output_file:
|
||
|
cmp [output_file],0
|
||
|
jne bad_params
|
||
|
mov [output_file],edi
|
||
|
process_param:
|
||
|
cmp al,22h
|
||
|
je string_param
|
||
|
copy_param:
|
||
|
cmp edi,params+1000h
|
||
|
jae bad_params
|
||
|
stosb
|
||
|
lodsb
|
||
|
cmp al,20h
|
||
|
je param_end
|
||
|
cmp al,0Dh
|
||
|
je param_end
|
||
|
or al,al
|
||
|
jz param_end
|
||
|
jmp copy_param
|
||
|
string_param:
|
||
|
lodsb
|
||
|
cmp al,22h
|
||
|
je string_param_end
|
||
|
cmp al,0Dh
|
||
|
je param_end
|
||
|
or al,al
|
||
|
jz param_end
|
||
|
cmp edi,params+1000h
|
||
|
jae bad_params
|
||
|
stosb
|
||
|
jmp string_param
|
||
|
option_param:
|
||
|
lodsb
|
||
|
cmp al,'m'
|
||
|
je memory_option
|
||
|
cmp al,'M'
|
||
|
je memory_option
|
||
|
cmp al,'p'
|
||
|
je passes_option
|
||
|
cmp al,'P'
|
||
|
je passes_option
|
||
|
cmp al,'d'
|
||
|
je definition_option
|
||
|
cmp al,'D'
|
||
|
je definition_option
|
||
|
cmp al,'s'
|
||
|
je symbols_option
|
||
|
cmp al,'S'
|
||
|
je symbols_option
|
||
|
bad_params:
|
||
|
stc
|
||
|
ret
|
||
|
get_option_value:
|
||
|
xor eax,eax
|
||
|
mov edx,eax
|
||
|
get_option_digit:
|
||
|
lodsb
|
||
|
cmp al,20h
|
||
|
je option_value_ok
|
||
|
cmp al,0Dh
|
||
|
je option_value_ok
|
||
|
or al,al
|
||
|
jz option_value_ok
|
||
|
sub al,30h
|
||
|
jc invalid_option_value
|
||
|
cmp al,9
|
||
|
ja invalid_option_value
|
||
|
imul edx,10
|
||
|
jo invalid_option_value
|
||
|
add edx,eax
|
||
|
jc invalid_option_value
|
||
|
jmp get_option_digit
|
||
|
option_value_ok:
|
||
|
dec esi
|
||
|
clc
|
||
|
ret
|
||
|
invalid_option_value:
|
||
|
stc
|
||
|
ret
|
||
|
memory_option:
|
||
|
lodsb
|
||
|
cmp al,20h
|
||
|
je memory_option
|
||
|
cmp al,0Dh
|
||
|
je bad_params
|
||
|
or al,al
|
||
|
jz bad_params
|
||
|
dec esi
|
||
|
call get_option_value
|
||
|
or edx,edx
|
||
|
jz bad_params
|
||
|
cmp edx,1 shl (32-10)
|
||
|
jae bad_params
|
||
|
mov [memory_setting],edx
|
||
|
jmp find_param
|
||
|
passes_option:
|
||
|
lodsb
|
||
|
cmp al,20h
|
||
|
je passes_option
|
||
|
cmp al,0Dh
|
||
|
je bad_params
|
||
|
or al,al
|
||
|
jz bad_params
|
||
|
dec esi
|
||
|
call get_option_value
|
||
|
or edx,edx
|
||
|
jz bad_params
|
||
|
cmp edx,10000h
|
||
|
ja bad_params
|
||
|
mov [passes_limit],dx
|
||
|
jmp find_param
|
||
|
definition_option:
|
||
|
lodsb
|
||
|
cmp al,20h
|
||
|
je definition_option
|
||
|
cmp al,0Dh
|
||
|
je bad_params
|
||
|
or al,al
|
||
|
jz bad_params
|
||
|
dec esi
|
||
|
push edi
|
||
|
mov edi,[definitions_pointer]
|
||
|
call convert_definition_option
|
||
|
mov [definitions_pointer],edi
|
||
|
pop edi
|
||
|
jc bad_params
|
||
|
jmp find_param
|
||
|
symbols_option:
|
||
|
mov [symbols_file],edi
|
||
|
find_symbols_file_name:
|
||
|
lodsb
|
||
|
cmp al,20h
|
||
|
jne process_param
|
||
|
jmp find_symbols_file_name
|
||
|
param_end:
|
||
|
dec esi
|
||
|
string_param_end:
|
||
|
cmp edi,params+1000h
|
||
|
jae bad_params
|
||
|
xor al,al
|
||
|
stosb
|
||
|
jmp find_param
|
||
|
all_params:
|
||
|
cmp [input_file],0
|
||
|
je bad_params
|
||
|
mov eax,[definitions_pointer]
|
||
|
mov byte [eax],0
|
||
|
mov [initial_definitions],predefinitions
|
||
|
clc
|
||
|
ret
|
||
|
convert_definition_option:
|
||
|
mov ecx,edi
|
||
|
cmp edi,predefinitions+1000h
|
||
|
jae bad_definition_option
|
||
|
xor al,al
|
||
|
stosb
|
||
|
copy_definition_name:
|
||
|
lodsb
|
||
|
cmp al,'='
|
||
|
je copy_definition_value
|
||
|
cmp al,20h
|
||
|
je bad_definition_option
|
||
|
cmp al,0Dh
|
||
|
je bad_definition_option
|
||
|
or al,al
|
||
|
jz bad_definition_option
|
||
|
cmp edi,predefinitions+1000h
|
||
|
jae bad_definition_option
|
||
|
stosb
|
||
|
inc byte [ecx]
|
||
|
jnz copy_definition_name
|
||
|
bad_definition_option:
|
||
|
stc
|
||
|
ret
|
||
|
copy_definition_value:
|
||
|
lodsb
|
||
|
cmp al,20h
|
||
|
je definition_value_end
|
||
|
cmp al,0Dh
|
||
|
je definition_value_end
|
||
|
or al,al
|
||
|
jz definition_value_end
|
||
|
cmp al,'\'
|
||
|
jne definition_value_character
|
||
|
cmp byte [esi],20h
|
||
|
jne definition_value_character
|
||
|
lodsb
|
||
|
definition_value_character:
|
||
|
cmp edi,predefinitions+1000h
|
||
|
jae bad_definition_option
|
||
|
stosb
|
||
|
jmp copy_definition_value
|
||
|
definition_value_end:
|
||
|
dec esi
|
||
|
cmp edi,predefinitions+1000h
|
||
|
jae bad_definition_option
|
||
|
xor al,al
|
||
|
stosb
|
||
|
clc
|
||
|
ret
|
||
|
|
||
|
include 'system.inc'
|
||
|
|
||
|
include '..\errors.inc'
|
||
|
include '..\symbdump.inc'
|
||
|
include '..\preproce.inc'
|
||
|
include '..\parser.inc'
|
||
|
include '..\exprpars.inc'
|
||
|
include '..\assemble.inc'
|
||
|
include '..\exprcalc.inc'
|
||
|
include '..\formats.inc'
|
||
|
include '..\x86_64.inc'
|
||
|
include '..\avx.inc'
|
||
|
|
||
|
include '..\tables.inc'
|
||
|
include '..\messages.inc'
|
||
|
|
||
|
section '.data' data readable writeable
|
||
|
|
||
|
include '..\version.inc'
|
||
|
|
||
|
_copyright db 'Copyright (c) 1999-2022, Tomasz Grysztar',0Dh,0Ah,0
|
||
|
|
||
|
_logo db 'flat assembler version ',VERSION_STRING,0
|
||
|
_usage db 0Dh,0Ah
|
||
|
db 'usage: fasm <source> [output]',0Dh,0Ah
|
||
|
db 'optional settings:',0Dh,0Ah
|
||
|
db ' -m <limit> set the limit in kilobytes for the available memory',0Dh,0Ah
|
||
|
db ' -p <limit> set the maximum allowed number of passes',0Dh,0Ah
|
||
|
db ' -d <name>=<value> define symbolic variable',0Dh,0Ah
|
||
|
db ' -s <file> dump symbolic information for debugging',0Dh,0Ah
|
||
|
db 0
|
||
|
_memory_prefix db ' (',0
|
||
|
_memory_suffix db ' kilobytes memory)',0Dh,0Ah,0
|
||
|
_passes_suffix db ' passes, ',0
|
||
|
_seconds_suffix db ' seconds, ',0
|
||
|
_bytes_suffix db ' bytes.',0Dh,0Ah,0
|
||
|
|
||
|
align 4
|
||
|
|
||
|
include '..\variable.inc'
|
||
|
|
||
|
con_handle dd ?
|
||
|
memory_setting dd ?
|
||
|
start_time dd ?
|
||
|
definitions_pointer dd ?
|
||
|
bytes_count dd ?
|
||
|
displayed_count dd ?
|
||
|
character db ?
|
||
|
last_displayed rb 2
|
||
|
preprocessing_done db ?
|
||
|
|
||
|
params rb 1000h
|
||
|
options rb 1000h
|
||
|
predefinitions rb 1000h
|
||
|
buffer rb 4000h
|
||
|
|
||
|
stack 10000h
|
||
|
|
||
|
section '.idata' import data readable writeable
|
||
|
|
||
|
dd 0,0,0,rva kernel_name,rva kernel_table
|
||
|
dd 0,0,0,0,0
|
||
|
|
||
|
kernel_table:
|
||
|
ExitProcess dd rva _ExitProcess
|
||
|
CreateFile dd rva _CreateFileA
|
||
|
ReadFile dd rva _ReadFile
|
||
|
WriteFile dd rva _WriteFile
|
||
|
CloseHandle dd rva _CloseHandle
|
||
|
SetFilePointer dd rva _SetFilePointer
|
||
|
GetCommandLine dd rva _GetCommandLineA
|
||
|
GetEnvironmentVariable dd rva _GetEnvironmentVariable
|
||
|
GetStdHandle dd rva _GetStdHandle
|
||
|
VirtualAlloc dd rva _VirtualAlloc
|
||
|
VirtualFree dd rva _VirtualFree
|
||
|
GetTickCount dd rva _GetTickCount
|
||
|
GetSystemTime dd rva _GetSystemTime
|
||
|
GlobalMemoryStatus dd rva _GlobalMemoryStatus
|
||
|
dd 0
|
||
|
|
||
|
kernel_name db 'KERNEL32.DLL',0
|
||
|
|
||
|
_ExitProcess dw 0
|
||
|
db 'ExitProcess',0
|
||
|
_CreateFileA dw 0
|
||
|
db 'CreateFileA',0
|
||
|
_ReadFile dw 0
|
||
|
db 'ReadFile',0
|
||
|
_WriteFile dw 0
|
||
|
db 'WriteFile',0
|
||
|
_CloseHandle dw 0
|
||
|
db 'CloseHandle',0
|
||
|
_SetFilePointer dw 0
|
||
|
db 'SetFilePointer',0
|
||
|
_GetCommandLineA dw 0
|
||
|
db 'GetCommandLineA',0
|
||
|
_GetEnvironmentVariable dw 0
|
||
|
db 'GetEnvironmentVariableA',0
|
||
|
_GetStdHandle dw 0
|
||
|
db 'GetStdHandle',0
|
||
|
_VirtualAlloc dw 0
|
||
|
db 'VirtualAlloc',0
|
||
|
_VirtualFree dw 0
|
||
|
db 'VirtualFree',0
|
||
|
_GetTickCount dw 0
|
||
|
db 'GetTickCount',0
|
||
|
_GetSystemTime dw 0
|
||
|
db 'GetSystemTime',0
|
||
|
_GlobalMemoryStatus dw 0
|
||
|
db 'GlobalMemoryStatus',0
|
||
|
|
||
|
section '.reloc' fixups data readable discardable
|