mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			351 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
			
		
		
	
	
			351 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
 | 
						|
; flat assembler interface for Win32
 | 
						|
; Copyright (c) 1999-2014, 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
 | 
						|
 | 
						|
	call	preprocessor
 | 
						|
	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	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:
 | 
						|
	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
 | 
						|
	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,'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
 | 
						|
    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:
 | 
						|
	xor	al,al
 | 
						|
	stosb
 | 
						|
	jmp	find_param
 | 
						|
    all_params:
 | 
						|
	cmp	[input_file],0
 | 
						|
	je	bad_params
 | 
						|
	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-2014, 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 ' -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 ?
 | 
						|
bytes_count dd ?
 | 
						|
displayed_count dd ?
 | 
						|
character db ?
 | 
						|
last_displayed rb 2
 | 
						|
 | 
						|
params rb 1000h
 | 
						|
options 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
 |