mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
Merge pull request #1268 from metopa/patch-1
Support of the .inc extension in Assembly group.
This commit is contained in:
@@ -157,6 +157,7 @@ Assembly:
|
|||||||
- nasm
|
- nasm
|
||||||
extensions:
|
extensions:
|
||||||
- .asm
|
- .asm
|
||||||
|
- .inc
|
||||||
|
|
||||||
Augeas:
|
Augeas:
|
||||||
type: programming
|
type: programming
|
||||||
|
|||||||
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