Ver 1.0
This commit is contained in:
458
FasmDll/SOURCE/DLL/FASM.ASM
Normal file
458
FasmDll/SOURCE/DLL/FASM.ASM
Normal file
@@ -0,0 +1,458 @@
|
||||
|
||||
; flat assembler DLL interface for Win32
|
||||
; Copyright (c) 1999-2017, Tomasz Grysztar.
|
||||
; All rights reserved.
|
||||
|
||||
format PE DLL GUI 4.0
|
||||
entry DLLEntryPoint
|
||||
|
||||
include 'win32a.inc'
|
||||
include 'fasm.ash'
|
||||
|
||||
section '.data' data readable writeable
|
||||
|
||||
include '..\variable.inc'
|
||||
|
||||
state dd ?
|
||||
esp_save dd ?
|
||||
source dd ?
|
||||
source_position dd ?
|
||||
first_write dd ?
|
||||
first_write_length dd ?
|
||||
second_write dd ?
|
||||
second_write_length dd ?
|
||||
display_pipe dd ?
|
||||
|
||||
systime SYSTEMTIME
|
||||
|
||||
tmp dd ?
|
||||
buffer rb 1000h
|
||||
|
||||
section '.text' code readable executable
|
||||
|
||||
DLLEntryPoint:
|
||||
mov eax,TRUE
|
||||
ret 12
|
||||
|
||||
fasm_GetVersion:
|
||||
mov eax,VERSION_MAJOR + VERSION_MINOR shl 16
|
||||
ret
|
||||
|
||||
fasm_AssembleFile:
|
||||
|
||||
mov eax,[lpSource]
|
||||
mov [input_file],eax
|
||||
mov [output_file],null_byte
|
||||
|
||||
jmp setup_assembler
|
||||
|
||||
fasm_Assemble:
|
||||
|
||||
virtual at esp+4
|
||||
lpSource dd ?
|
||||
lpMemory dd ?
|
||||
cbMemorySize dd ?
|
||||
nPassesLimit dd ?
|
||||
hDisplayPipe dd ?
|
||||
end virtual
|
||||
|
||||
mov eax,[lpSource]
|
||||
mov [source],eax
|
||||
mov [source_position],0
|
||||
|
||||
mov [input_file],null_byte
|
||||
mov [output_file],null_byte
|
||||
|
||||
setup_assembler:
|
||||
|
||||
mov eax,[nPassesLimit]
|
||||
cmp eax,10000h
|
||||
ja invalid_parameter
|
||||
or eax,eax
|
||||
jz invalid_parameter
|
||||
mov [passes_limit],ax
|
||||
|
||||
mov eax,[lpMemory]
|
||||
mov ecx,[cbMemorySize]
|
||||
mov [state],eax
|
||||
mov [eax+FASM_STATE.condition],FASM_WORKING
|
||||
sub ecx,sizeof.FASM_STATE
|
||||
jbe out_of_memory
|
||||
add eax,sizeof.FASM_STATE
|
||||
mov [memory_start],eax
|
||||
mov edx,ecx
|
||||
shr edx,2
|
||||
sub ecx,edx
|
||||
add eax,ecx
|
||||
mov [memory_end],eax
|
||||
mov [additional_memory],eax
|
||||
add eax,edx
|
||||
mov [additional_memory_end],eax
|
||||
|
||||
xor eax,eax
|
||||
mov [initial_definitions],eax
|
||||
|
||||
mov [first_write],eax
|
||||
mov [second_write],eax
|
||||
|
||||
mov eax,[hDisplayPipe]
|
||||
mov [display_pipe],eax
|
||||
|
||||
push ebp ebx esi edi
|
||||
mov eax,esp
|
||||
mov [esp_save],eax
|
||||
and eax,not 0FFFh
|
||||
add eax,1000h-10000h
|
||||
mov [stack_limit],eax
|
||||
|
||||
call preprocessor
|
||||
call parser
|
||||
call assembler
|
||||
call formatter
|
||||
|
||||
mov ebx,[state]
|
||||
mov [ebx+FASM_STATE.condition],FASM_OK
|
||||
|
||||
done:
|
||||
mov eax,[ebx+FASM_STATE.condition]
|
||||
pop edi esi ebx ebp
|
||||
ret 20
|
||||
|
||||
general_error:
|
||||
mov esp,[esp_save]
|
||||
mov ebx,[state]
|
||||
mov [ebx+FASM_STATE.condition],eax
|
||||
jmp done
|
||||
|
||||
assembler_error:
|
||||
mov esp,[esp_save]
|
||||
mov ebx,[state]
|
||||
mov [ebx+FASM_STATE.error_code],eax
|
||||
mov eax,[current_line]
|
||||
mov [ebx+FASM_STATE.error_line],eax
|
||||
mov eax,FASM_ERROR
|
||||
jmp general_error
|
||||
|
||||
get_environment_variable:
|
||||
invoke GetEnvironmentVariable,esi,buffer,1000h
|
||||
retn
|
||||
|
||||
open:
|
||||
cmp byte [edx],0
|
||||
je open_memory
|
||||
invoke CreateFile,edx,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0
|
||||
cmp eax,-1
|
||||
je file_error
|
||||
mov ebx,eax
|
||||
clc
|
||||
retn
|
||||
file_error:
|
||||
stc
|
||||
retn
|
||||
open_memory:
|
||||
xor ebx,ebx
|
||||
retn
|
||||
read:
|
||||
or ebx,ebx
|
||||
jz read_memory
|
||||
mov ebp,ecx
|
||||
invoke ReadFile,ebx,edx,ecx,tmp,0
|
||||
or eax,eax
|
||||
jz file_error
|
||||
cmp ebp,[tmp]
|
||||
jne file_error
|
||||
clc
|
||||
retn
|
||||
read_memory:
|
||||
push esi edi
|
||||
mov esi,[source]
|
||||
add esi,[source_position]
|
||||
mov edi,edx
|
||||
call move_block
|
||||
pop edi esi
|
||||
clc
|
||||
retn
|
||||
move_block:
|
||||
mov al,cl
|
||||
shr ecx,2
|
||||
rep movsd
|
||||
mov cl,al
|
||||
and cl,11b
|
||||
rep movsb
|
||||
retn
|
||||
lseek:
|
||||
or ebx,ebx
|
||||
jz seek_memory
|
||||
movzx eax,al
|
||||
invoke SetFilePointer,ebx,edx,0,eax
|
||||
cmp eax,-1
|
||||
je file_error
|
||||
retn
|
||||
seek_memory:
|
||||
push esi
|
||||
mov esi,[source]
|
||||
mov ecx,edx
|
||||
or al,al
|
||||
jz seek_forward
|
||||
add esi,[source_position]
|
||||
cmp al,2
|
||||
je seek_source_end
|
||||
seek_forward:
|
||||
sub ecx,1
|
||||
jc seek_complete
|
||||
seek_in_source:
|
||||
lodsb
|
||||
or al,al
|
||||
loopnz seek_in_source
|
||||
jnz seek_complete
|
||||
dec esi
|
||||
seek_complete:
|
||||
mov eax,esi
|
||||
sub eax,[source]
|
||||
mov [source_position],eax
|
||||
pop esi
|
||||
retn
|
||||
seek_source_end:
|
||||
lodsb
|
||||
or al,al
|
||||
jnz seek_source_end
|
||||
dec esi
|
||||
sub esi,edx
|
||||
cmp esi,[source]
|
||||
jae seek_complete
|
||||
mov esi,[source]
|
||||
jmp seek_complete
|
||||
create:
|
||||
or ebx,-1
|
||||
clc
|
||||
retn
|
||||
write:
|
||||
cmp [first_write],0
|
||||
jne make_second_write
|
||||
mov [first_write],edx
|
||||
mov [first_write_length],ecx
|
||||
clc
|
||||
retn
|
||||
make_second_write:
|
||||
cmp [second_write],0
|
||||
jne cannot_write
|
||||
mov [second_write],edx
|
||||
mov [second_write_length],ecx
|
||||
clc
|
||||
retn
|
||||
cannot_write:
|
||||
stc
|
||||
retn
|
||||
close:
|
||||
or ebx,ebx
|
||||
jz file_closed
|
||||
cmp ebx,-1
|
||||
je output_ready
|
||||
invoke CloseHandle,ebx
|
||||
file_closed:
|
||||
retn
|
||||
output_ready:
|
||||
mov ebx,[state]
|
||||
cmp [second_write],0
|
||||
jne two_part_output
|
||||
mov eax,[first_write]
|
||||
mov [ebx+FASM_STATE.output_data],eax
|
||||
mov eax,[first_write_length]
|
||||
mov [ebx+FASM_STATE.output_length],eax
|
||||
retn
|
||||
two_part_output:
|
||||
mov eax,[second_write]
|
||||
mov [ebx+FASM_STATE.output_data],eax
|
||||
shuffle_output:
|
||||
mov ecx,[first_write_length]
|
||||
cmp ecx,[second_write_length]
|
||||
ja small_second_part
|
||||
sub [second_write_length],ecx
|
||||
mov esi,[first_write]
|
||||
mov edi,[second_write]
|
||||
call xchg_block
|
||||
mov [second_write],edi
|
||||
jmp shuffle_output
|
||||
xchg_block:
|
||||
shr ecx,1
|
||||
jnc xchgb_ok
|
||||
mov al,[edi]
|
||||
xchg al,[esi]
|
||||
stosb
|
||||
inc esi
|
||||
xchgb_ok:
|
||||
shr ecx,1
|
||||
jnc xchgw_ok
|
||||
mov ax,[edi]
|
||||
xchg ax,[esi]
|
||||
stosw
|
||||
add esi,2
|
||||
xchgw_ok:
|
||||
jz xchgd_ok
|
||||
xchgd:
|
||||
mov eax,[edi]
|
||||
xchg eax,[esi]
|
||||
stosd
|
||||
add esi,4
|
||||
loop xchgd
|
||||
xchgd_ok:
|
||||
retn
|
||||
small_second_part:
|
||||
mov edi,[second_write]
|
||||
mov esi,edi
|
||||
add edi,[first_write_length]
|
||||
cmp edi,[first_write]
|
||||
jbe move_second_part
|
||||
mov edi,[first_write]
|
||||
add edi,[first_write_length]
|
||||
move_second_part:
|
||||
push edi
|
||||
mov ecx,[second_write_length]
|
||||
lea eax,[edi+ecx]
|
||||
cmp eax,[tagged_blocks]
|
||||
ja out_of_memory
|
||||
call move_block
|
||||
mov edi,[second_write]
|
||||
mov esi,[first_write]
|
||||
mov ecx,[first_write_length]
|
||||
call move_block
|
||||
pop esi
|
||||
mov ecx,[second_write_length]
|
||||
call move_block
|
||||
mov ecx,edi
|
||||
sub ecx,[ebx+FASM_STATE.output_data]
|
||||
mov [ebx+FASM_STATE.output_length],ecx
|
||||
retn
|
||||
|
||||
display_block:
|
||||
mov eax,[display_pipe]
|
||||
or eax,eax
|
||||
jz display_ok
|
||||
invoke WriteFile,eax,esi,ecx,tmp,NULL
|
||||
display_ok:
|
||||
retn
|
||||
|
||||
make_timestamp:
|
||||
invoke GetSystemTime,systime
|
||||
movzx ecx,[systime.wYear]
|
||||
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,[systime.wMonth]
|
||||
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 [systime.wYear]
|
||||
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,[systime.wDay]
|
||||
dec eax
|
||||
add eax,ebp
|
||||
mov ebx,24
|
||||
mul ebx
|
||||
movzx ecx,[systime.wHour]
|
||||
add eax,ecx
|
||||
mov ebx,60
|
||||
mul ebx
|
||||
movzx ecx,[systime.wMinute]
|
||||
add eax,ecx
|
||||
mov ebx,60
|
||||
mul ebx
|
||||
movzx ecx,[systime.wSecond]
|
||||
add eax,ecx
|
||||
retn
|
||||
|
||||
dump_symbols:
|
||||
retn
|
||||
|
||||
include 'errors.inc'
|
||||
|
||||
include '..\preproce.inc'
|
||||
include '..\parser.inc'
|
||||
include '..\exprpars.inc'
|
||||
include '..\exprcalc.inc'
|
||||
include '..\assemble.inc'
|
||||
include '..\formats.inc'
|
||||
include '..\x86_64.inc'
|
||||
include '..\avx.inc'
|
||||
include '..\tables.inc'
|
||||
|
||||
include '..\version.inc'
|
||||
|
||||
null_byte db 0
|
||||
|
||||
section '.idata' import data readable writeable
|
||||
|
||||
library kernel32,'KERNEL32.DLL'
|
||||
|
||||
include 'api\kernel32.inc'
|
||||
|
||||
section '.edata' export data readable
|
||||
|
||||
export 'FASM.DLL',\
|
||||
fasm_GetVersion,'fasm_GetVersion',\
|
||||
fasm_Assemble,'fasm_Assemble',\
|
||||
fasm_AssembleFile,'fasm_AssembleFile'
|
||||
|
||||
section '.reloc' fixups data readable discardable
|
||||
|
||||
section '.rsrc' resource data readable
|
||||
|
||||
directory RT_VERSION,versions
|
||||
|
||||
resource versions,\
|
||||
1,LANG_NEUTRAL,version
|
||||
|
||||
versioninfo version,VOS__WINDOWS32,VFT_APP,VFT2_UNKNOWN,LANG_ENGLISH+SUBLANG_DEFAULT,0,\
|
||||
'FileDescription','flat assembler',\
|
||||
'LegalCopyright',<'Copyright ',0A9h,' 2001-2017 Tomasz Grysztar.'>,\
|
||||
'FileVersion',VERSION_STRING,\
|
||||
'ProductVersion',VERSION_STRING,\
|
||||
'OriginalFilename','FASM.DLL'
|
||||
Reference in New Issue
Block a user