mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Added examples for Assembly
From FASM source under BSD
This commit is contained in:
		
							
								
								
									
										2048
									
								
								samples/Assembly/ASSEMBLE.INC
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2048
									
								
								samples/Assembly/ASSEMBLE.INC
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										350
									
								
								samples/Assembly/FASM.ASM
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										350
									
								
								samples/Assembly/FASM.ASM
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,350 @@ | |||||||
|  |  | ||||||
|  | ; 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 | ||||||
							
								
								
									
										503
									
								
								samples/Assembly/SYSTEM.INC
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										503
									
								
								samples/Assembly/SYSTEM.INC
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,503 @@ | |||||||
|  |  | ||||||
|  | ; flat assembler interface for Win32 | ||||||
|  | ; Copyright (c) 1999-2014, Tomasz Grysztar. | ||||||
|  | ; All rights reserved. | ||||||
|  |  | ||||||
|  | CREATE_NEW	       = 1 | ||||||
|  | CREATE_ALWAYS	       = 2 | ||||||
|  | OPEN_EXISTING	       = 3 | ||||||
|  | OPEN_ALWAYS	       = 4 | ||||||
|  | TRUNCATE_EXISTING      = 5 | ||||||
|  |  | ||||||
|  | FILE_SHARE_READ        = 1 | ||||||
|  | FILE_SHARE_WRITE       = 2 | ||||||
|  | FILE_SHARE_DELETE      = 4 | ||||||
|  |  | ||||||
|  | GENERIC_READ	       = 80000000h | ||||||
|  | GENERIC_WRITE	       = 40000000h | ||||||
|  |  | ||||||
|  | STD_INPUT_HANDLE       = 0FFFFFFF6h | ||||||
|  | STD_OUTPUT_HANDLE      = 0FFFFFFF5h | ||||||
|  | STD_ERROR_HANDLE       = 0FFFFFFF4h | ||||||
|  |  | ||||||
|  | MEM_COMMIT	       = 1000h | ||||||
|  | MEM_RESERVE	       = 2000h | ||||||
|  | MEM_DECOMMIT	       = 4000h | ||||||
|  | MEM_RELEASE	       = 8000h | ||||||
|  | MEM_FREE	       = 10000h | ||||||
|  | MEM_PRIVATE	       = 20000h | ||||||
|  | MEM_MAPPED	       = 40000h | ||||||
|  | MEM_RESET	       = 80000h | ||||||
|  | MEM_TOP_DOWN	       = 100000h | ||||||
|  |  | ||||||
|  | PAGE_NOACCESS	       = 1 | ||||||
|  | PAGE_READONLY	       = 2 | ||||||
|  | PAGE_READWRITE	       = 4 | ||||||
|  | PAGE_WRITECOPY	       = 8 | ||||||
|  | PAGE_EXECUTE	       = 10h | ||||||
|  | PAGE_EXECUTE_READ      = 20h | ||||||
|  | PAGE_EXECUTE_READWRITE = 40h | ||||||
|  | PAGE_EXECUTE_WRITECOPY = 80h | ||||||
|  | PAGE_GUARD	       = 100h | ||||||
|  | PAGE_NOCACHE	       = 200h | ||||||
|  |  | ||||||
|  | init_memory: | ||||||
|  | 	xor	eax,eax | ||||||
|  | 	mov	[memory_start],eax | ||||||
|  | 	mov	eax,esp | ||||||
|  | 	and	eax,not 0FFFh | ||||||
|  | 	add	eax,1000h-10000h | ||||||
|  | 	mov	[stack_limit],eax | ||||||
|  | 	mov	eax,[memory_setting] | ||||||
|  | 	shl	eax,10 | ||||||
|  | 	jnz	allocate_memory | ||||||
|  | 	push	buffer | ||||||
|  | 	call	[GlobalMemoryStatus] | ||||||
|  | 	mov	eax,dword [buffer+20] | ||||||
|  | 	mov	edx,dword [buffer+12] | ||||||
|  | 	cmp	eax,0 | ||||||
|  | 	jl	large_memory | ||||||
|  | 	cmp	edx,0 | ||||||
|  | 	jl	large_memory | ||||||
|  | 	shr	eax,2 | ||||||
|  | 	add	eax,edx | ||||||
|  | 	jmp	allocate_memory | ||||||
|  |     large_memory: | ||||||
|  | 	mov	eax,80000000h | ||||||
|  |     allocate_memory: | ||||||
|  | 	mov	edx,eax | ||||||
|  | 	shr	edx,2 | ||||||
|  | 	mov	ecx,eax | ||||||
|  | 	sub	ecx,edx | ||||||
|  | 	mov	[memory_end],ecx | ||||||
|  | 	mov	[additional_memory_end],edx | ||||||
|  | 	push	PAGE_READWRITE | ||||||
|  | 	push	MEM_COMMIT | ||||||
|  | 	push	eax | ||||||
|  | 	push	0 | ||||||
|  | 	call	[VirtualAlloc] | ||||||
|  | 	or	eax,eax | ||||||
|  | 	jz	not_enough_memory | ||||||
|  | 	mov	[memory_start],eax | ||||||
|  | 	add	eax,[memory_end] | ||||||
|  | 	mov	[memory_end],eax | ||||||
|  | 	mov	[additional_memory],eax | ||||||
|  | 	add	[additional_memory_end],eax | ||||||
|  | 	ret | ||||||
|  |     not_enough_memory: | ||||||
|  | 	mov	eax,[additional_memory_end] | ||||||
|  | 	shl	eax,1 | ||||||
|  | 	cmp	eax,4000h | ||||||
|  | 	jb	out_of_memory | ||||||
|  | 	jmp	allocate_memory | ||||||
|  |  | ||||||
|  | exit_program: | ||||||
|  | 	movzx	eax,al | ||||||
|  | 	push	eax | ||||||
|  | 	mov	eax,[memory_start] | ||||||
|  | 	test	eax,eax | ||||||
|  | 	jz	do_exit | ||||||
|  | 	push	MEM_RELEASE | ||||||
|  | 	push	0 | ||||||
|  | 	push	eax | ||||||
|  | 	call	[VirtualFree] | ||||||
|  |     do_exit: | ||||||
|  | 	call	[ExitProcess] | ||||||
|  |  | ||||||
|  | get_environment_variable: | ||||||
|  | 	mov	ecx,[memory_end] | ||||||
|  | 	sub	ecx,edi | ||||||
|  | 	cmp	ecx,4000h | ||||||
|  | 	jbe	buffer_for_variable_ok | ||||||
|  | 	mov	ecx,4000h | ||||||
|  |     buffer_for_variable_ok: | ||||||
|  | 	push	ecx | ||||||
|  | 	push	edi | ||||||
|  | 	push	esi | ||||||
|  | 	call	[GetEnvironmentVariable] | ||||||
|  | 	add	edi,eax | ||||||
|  | 	cmp	edi,[memory_end] | ||||||
|  | 	jae	out_of_memory | ||||||
|  | 	ret | ||||||
|  |  | ||||||
|  | open: | ||||||
|  | 	push	0 | ||||||
|  | 	push	0 | ||||||
|  | 	push	OPEN_EXISTING | ||||||
|  | 	push	0 | ||||||
|  | 	push	FILE_SHARE_READ | ||||||
|  | 	push	GENERIC_READ | ||||||
|  | 	push	edx | ||||||
|  | 	call	[CreateFile] | ||||||
|  | 	cmp	eax,-1 | ||||||
|  | 	je	file_error | ||||||
|  | 	mov	ebx,eax | ||||||
|  | 	clc | ||||||
|  | 	ret | ||||||
|  |     file_error: | ||||||
|  | 	stc | ||||||
|  | 	ret | ||||||
|  | create: | ||||||
|  | 	push	0 | ||||||
|  | 	push	0 | ||||||
|  | 	push	CREATE_ALWAYS | ||||||
|  | 	push	0 | ||||||
|  | 	push	FILE_SHARE_READ | ||||||
|  | 	push	GENERIC_WRITE | ||||||
|  | 	push	edx | ||||||
|  | 	call	[CreateFile] | ||||||
|  | 	cmp	eax,-1 | ||||||
|  | 	je	file_error | ||||||
|  | 	mov	ebx,eax | ||||||
|  | 	clc | ||||||
|  | 	ret | ||||||
|  | write: | ||||||
|  | 	push	0 | ||||||
|  | 	push	bytes_count | ||||||
|  | 	push	ecx | ||||||
|  | 	push	edx | ||||||
|  | 	push	ebx | ||||||
|  | 	call	[WriteFile] | ||||||
|  | 	or	eax,eax | ||||||
|  | 	jz	file_error | ||||||
|  | 	clc | ||||||
|  | 	ret | ||||||
|  | read: | ||||||
|  | 	mov	ebp,ecx | ||||||
|  | 	push	0 | ||||||
|  | 	push	bytes_count | ||||||
|  | 	push	ecx | ||||||
|  | 	push	edx | ||||||
|  | 	push	ebx | ||||||
|  | 	call	[ReadFile] | ||||||
|  | 	or	eax,eax | ||||||
|  | 	jz	file_error | ||||||
|  | 	cmp	ebp,[bytes_count] | ||||||
|  | 	jne	file_error | ||||||
|  | 	clc | ||||||
|  | 	ret | ||||||
|  | close: | ||||||
|  | 	push	ebx | ||||||
|  | 	call	[CloseHandle] | ||||||
|  | 	ret | ||||||
|  | lseek: | ||||||
|  | 	movzx	eax,al | ||||||
|  | 	push	eax | ||||||
|  | 	push	0 | ||||||
|  | 	push	edx | ||||||
|  | 	push	ebx | ||||||
|  | 	call	[SetFilePointer] | ||||||
|  | 	ret | ||||||
|  |  | ||||||
|  | display_string: | ||||||
|  | 	push	[con_handle] | ||||||
|  | 	call	[GetStdHandle] | ||||||
|  | 	mov	ebp,eax | ||||||
|  | 	mov	edi,esi | ||||||
|  | 	or	ecx,-1 | ||||||
|  | 	xor	al,al | ||||||
|  | 	repne	scasb | ||||||
|  | 	neg	ecx | ||||||
|  | 	sub	ecx,2 | ||||||
|  | 	push	0 | ||||||
|  | 	push	bytes_count | ||||||
|  | 	push	ecx | ||||||
|  | 	push	esi | ||||||
|  | 	push	ebp | ||||||
|  | 	call	[WriteFile] | ||||||
|  | 	ret | ||||||
|  | display_character: | ||||||
|  | 	push	ebx | ||||||
|  | 	mov	[character],dl | ||||||
|  | 	push	[con_handle] | ||||||
|  | 	call	[GetStdHandle] | ||||||
|  | 	mov	ebx,eax | ||||||
|  | 	push	0 | ||||||
|  | 	push	bytes_count | ||||||
|  | 	push	1 | ||||||
|  | 	push	character | ||||||
|  | 	push	ebx | ||||||
|  | 	call	[WriteFile] | ||||||
|  | 	pop	ebx | ||||||
|  | 	ret | ||||||
|  | display_number: | ||||||
|  | 	push	ebx | ||||||
|  | 	mov	ecx,1000000000 | ||||||
|  | 	xor	edx,edx | ||||||
|  | 	xor	bl,bl | ||||||
|  |       display_loop: | ||||||
|  | 	div	ecx | ||||||
|  | 	push	edx | ||||||
|  | 	cmp	ecx,1 | ||||||
|  | 	je	display_digit | ||||||
|  | 	or	bl,bl | ||||||
|  | 	jnz	display_digit | ||||||
|  | 	or	al,al | ||||||
|  | 	jz	digit_ok | ||||||
|  | 	not	bl | ||||||
|  |       display_digit: | ||||||
|  | 	mov	dl,al | ||||||
|  | 	add	dl,30h | ||||||
|  | 	push	ecx | ||||||
|  | 	call	display_character | ||||||
|  | 	pop	ecx | ||||||
|  |       digit_ok: | ||||||
|  | 	mov	eax,ecx | ||||||
|  | 	xor	edx,edx | ||||||
|  | 	mov	ecx,10 | ||||||
|  | 	div	ecx | ||||||
|  | 	mov	ecx,eax | ||||||
|  | 	pop	eax | ||||||
|  | 	or	ecx,ecx | ||||||
|  | 	jnz	display_loop | ||||||
|  | 	pop	ebx | ||||||
|  | 	ret | ||||||
|  |  | ||||||
|  | display_user_messages: | ||||||
|  | 	mov	[displayed_count],0 | ||||||
|  | 	call	show_display_buffer | ||||||
|  | 	cmp	[displayed_count],1 | ||||||
|  | 	jb	line_break_ok | ||||||
|  | 	je	make_line_break | ||||||
|  | 	mov	ax,word [last_displayed] | ||||||
|  | 	cmp	ax,0A0Dh | ||||||
|  | 	je	line_break_ok | ||||||
|  | 	cmp	ax,0D0Ah | ||||||
|  | 	je	line_break_ok | ||||||
|  |       make_line_break: | ||||||
|  | 	mov	word [buffer],0A0Dh | ||||||
|  | 	push	[con_handle] | ||||||
|  | 	call	[GetStdHandle] | ||||||
|  | 	push	0 | ||||||
|  | 	push	bytes_count | ||||||
|  | 	push	2 | ||||||
|  | 	push	buffer | ||||||
|  | 	push	eax | ||||||
|  | 	call	[WriteFile] | ||||||
|  |       line_break_ok: | ||||||
|  | 	ret | ||||||
|  | display_block: | ||||||
|  | 	add	[displayed_count],ecx | ||||||
|  | 	cmp	ecx,1 | ||||||
|  | 	ja	take_last_two_characters | ||||||
|  | 	jb	block_displayed | ||||||
|  | 	mov	al,[last_displayed+1] | ||||||
|  | 	mov	ah,[esi] | ||||||
|  | 	mov	word [last_displayed],ax | ||||||
|  | 	jmp	block_ok | ||||||
|  |       take_last_two_characters: | ||||||
|  | 	mov	ax,[esi+ecx-2] | ||||||
|  | 	mov	word [last_displayed],ax | ||||||
|  |       block_ok: | ||||||
|  | 	push	ecx | ||||||
|  | 	push	[con_handle] | ||||||
|  | 	call	[GetStdHandle] | ||||||
|  | 	pop	ecx | ||||||
|  | 	push	0 | ||||||
|  | 	push	bytes_count | ||||||
|  | 	push	ecx | ||||||
|  | 	push	esi | ||||||
|  | 	push	eax | ||||||
|  | 	call	[WriteFile] | ||||||
|  |       block_displayed: | ||||||
|  | 	ret | ||||||
|  |  | ||||||
|  | fatal_error: | ||||||
|  | 	mov	[con_handle],STD_ERROR_HANDLE | ||||||
|  | 	mov	esi,error_prefix | ||||||
|  | 	call	display_string | ||||||
|  | 	pop	esi | ||||||
|  | 	call	display_string | ||||||
|  | 	mov	esi,error_suffix | ||||||
|  | 	call	display_string | ||||||
|  | 	mov	al,0FFh | ||||||
|  | 	jmp	exit_program | ||||||
|  | assembler_error: | ||||||
|  | 	mov	[con_handle],STD_ERROR_HANDLE | ||||||
|  | 	call	display_user_messages | ||||||
|  | 	push	dword 0 | ||||||
|  | 	mov	ebx,[current_line] | ||||||
|  |       get_error_lines: | ||||||
|  | 	mov	eax,[ebx] | ||||||
|  | 	cmp	byte [eax],0 | ||||||
|  | 	je	get_next_error_line | ||||||
|  | 	push	ebx | ||||||
|  | 	test	byte [ebx+7],80h | ||||||
|  | 	jz	display_error_line | ||||||
|  | 	mov	edx,ebx | ||||||
|  |       find_definition_origin: | ||||||
|  | 	mov	edx,[edx+12] | ||||||
|  | 	test	byte [edx+7],80h | ||||||
|  | 	jnz	find_definition_origin | ||||||
|  | 	push	edx | ||||||
|  |       get_next_error_line: | ||||||
|  | 	mov	ebx,[ebx+8] | ||||||
|  | 	jmp	get_error_lines | ||||||
|  |       display_error_line: | ||||||
|  | 	mov	esi,[ebx] | ||||||
|  | 	call	display_string | ||||||
|  | 	mov	esi,line_number_start | ||||||
|  | 	call	display_string | ||||||
|  | 	mov	eax,[ebx+4] | ||||||
|  | 	and	eax,7FFFFFFFh | ||||||
|  | 	call	display_number | ||||||
|  | 	mov	dl,']' | ||||||
|  | 	call	display_character | ||||||
|  | 	pop	esi | ||||||
|  | 	cmp	ebx,esi | ||||||
|  | 	je	line_number_ok | ||||||
|  | 	mov	dl,20h | ||||||
|  | 	call	display_character | ||||||
|  | 	push	esi | ||||||
|  | 	mov	esi,[esi] | ||||||
|  | 	movzx	ecx,byte [esi] | ||||||
|  | 	inc	esi | ||||||
|  | 	call	display_block | ||||||
|  | 	mov	esi,line_number_start | ||||||
|  | 	call	display_string | ||||||
|  | 	pop	esi | ||||||
|  | 	mov	eax,[esi+4] | ||||||
|  | 	and	eax,7FFFFFFFh | ||||||
|  | 	call	display_number | ||||||
|  | 	mov	dl,']' | ||||||
|  | 	call	display_character | ||||||
|  |       line_number_ok: | ||||||
|  | 	mov	esi,line_data_start | ||||||
|  | 	call	display_string | ||||||
|  | 	mov	esi,ebx | ||||||
|  | 	mov	edx,[esi] | ||||||
|  | 	call	open | ||||||
|  | 	mov	al,2 | ||||||
|  | 	xor	edx,edx | ||||||
|  | 	call	lseek | ||||||
|  | 	mov	edx,[esi+8] | ||||||
|  | 	sub	eax,edx | ||||||
|  | 	jz	line_data_displayed | ||||||
|  | 	push	eax | ||||||
|  | 	xor	al,al | ||||||
|  | 	call	lseek | ||||||
|  | 	mov	ecx,[esp] | ||||||
|  | 	mov	edx,[additional_memory] | ||||||
|  | 	lea	eax,[edx+ecx] | ||||||
|  | 	cmp	eax,[additional_memory_end] | ||||||
|  | 	ja	out_of_memory | ||||||
|  | 	call	read | ||||||
|  | 	call	close | ||||||
|  | 	pop	ecx | ||||||
|  | 	mov	esi,[additional_memory] | ||||||
|  |       get_line_data: | ||||||
|  | 	mov	al,[esi] | ||||||
|  | 	cmp	al,0Ah | ||||||
|  | 	je	display_line_data | ||||||
|  | 	cmp	al,0Dh | ||||||
|  | 	je	display_line_data | ||||||
|  | 	cmp	al,1Ah | ||||||
|  | 	je	display_line_data | ||||||
|  | 	or	al,al | ||||||
|  | 	jz	display_line_data | ||||||
|  | 	inc	esi | ||||||
|  | 	loop	get_line_data | ||||||
|  |       display_line_data: | ||||||
|  | 	mov	ecx,esi | ||||||
|  | 	mov	esi,[additional_memory] | ||||||
|  | 	sub	ecx,esi | ||||||
|  | 	call	display_block | ||||||
|  |       line_data_displayed: | ||||||
|  | 	mov	esi,cr_lf | ||||||
|  | 	call	display_string | ||||||
|  | 	pop	ebx | ||||||
|  | 	or	ebx,ebx | ||||||
|  | 	jnz	display_error_line | ||||||
|  | 	mov	esi,error_prefix | ||||||
|  | 	call	display_string | ||||||
|  | 	pop	esi | ||||||
|  | 	call	display_string | ||||||
|  | 	mov	esi,error_suffix | ||||||
|  | 	call	display_string | ||||||
|  | 	mov	al,2 | ||||||
|  | 	jmp	exit_program | ||||||
|  |  | ||||||
|  | make_timestamp: | ||||||
|  | 	push	buffer | ||||||
|  | 	call	[GetSystemTime] | ||||||
|  | 	movzx	ecx,word [buffer] | ||||||
|  | 	mov	eax,ecx | ||||||
|  | 	sub	eax,1970 | ||||||
|  | 	mov	ebx,365 | ||||||
|  | 	mul	ebx | ||||||
|  | 	mov	ebp,eax | ||||||
|  | 	mov	eax,ecx | ||||||
|  | 	sub	eax,1969 | ||||||
|  | 	shr	eax,2 | ||||||
|  | 	add	ebp,eax | ||||||
|  | 	mov	eax,ecx | ||||||
|  | 	sub	eax,1901 | ||||||
|  | 	mov	ebx,100 | ||||||
|  | 	div	ebx | ||||||
|  | 	sub	ebp,eax | ||||||
|  | 	mov	eax,ecx | ||||||
|  | 	xor	edx,edx | ||||||
|  | 	sub	eax,1601 | ||||||
|  | 	mov	ebx,400 | ||||||
|  | 	div	ebx | ||||||
|  | 	add	ebp,eax | ||||||
|  | 	movzx	ecx,word [buffer+2] | ||||||
|  | 	mov	eax,ecx | ||||||
|  | 	dec	eax | ||||||
|  | 	mov	ebx,30 | ||||||
|  | 	mul	ebx | ||||||
|  | 	add	ebp,eax | ||||||
|  | 	cmp	ecx,8 | ||||||
|  | 	jbe	months_correction | ||||||
|  | 	mov	eax,ecx | ||||||
|  | 	sub	eax,7 | ||||||
|  | 	shr	eax,1 | ||||||
|  | 	add	ebp,eax | ||||||
|  | 	mov	ecx,8 | ||||||
|  |       months_correction: | ||||||
|  | 	mov	eax,ecx | ||||||
|  | 	shr	eax,1 | ||||||
|  | 	add	ebp,eax | ||||||
|  | 	cmp	ecx,2 | ||||||
|  | 	jbe	day_correction_ok | ||||||
|  | 	sub	ebp,2 | ||||||
|  | 	movzx	ecx,word [buffer] | ||||||
|  | 	test	ecx,11b | ||||||
|  | 	jnz	day_correction_ok | ||||||
|  | 	xor	edx,edx | ||||||
|  | 	mov	eax,ecx | ||||||
|  | 	mov	ebx,100 | ||||||
|  | 	div	ebx | ||||||
|  | 	or	edx,edx | ||||||
|  | 	jnz	day_correction | ||||||
|  | 	mov	eax,ecx | ||||||
|  | 	mov	ebx,400 | ||||||
|  | 	div	ebx | ||||||
|  | 	or	edx,edx | ||||||
|  | 	jnz	day_correction_ok | ||||||
|  |       day_correction: | ||||||
|  | 	inc	ebp | ||||||
|  |       day_correction_ok: | ||||||
|  | 	movzx	eax,word [buffer+6] | ||||||
|  | 	dec	eax | ||||||
|  | 	add	eax,ebp | ||||||
|  | 	mov	ebx,24 | ||||||
|  | 	mul	ebx | ||||||
|  | 	movzx	ecx,word [buffer+8] | ||||||
|  | 	add	eax,ecx | ||||||
|  | 	mov	ebx,60 | ||||||
|  | 	mul	ebx | ||||||
|  | 	movzx	ecx,word [buffer+10] | ||||||
|  | 	add	eax,ecx | ||||||
|  | 	mov	ebx,60 | ||||||
|  | 	mul	ebx | ||||||
|  | 	movzx	ecx,word [buffer+12] | ||||||
|  | 	add	eax,ecx | ||||||
|  | 	adc	edx,0 | ||||||
|  | 	ret | ||||||
|  |  | ||||||
|  | error_prefix db 'error: ',0 | ||||||
|  | error_suffix db '.' | ||||||
|  | cr_lf db 0Dh,0Ah,0 | ||||||
|  | line_number_start db ' [',0 | ||||||
|  | line_data_start db ':',0Dh,0Ah,0 | ||||||
							
								
								
									
										7060
									
								
								samples/Assembly/X86_64.INC
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7060
									
								
								samples/Assembly/X86_64.INC
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user