mirror of
https://github.com/tgrysztar/fasm
synced 2026-08-26 00:23:06 -04:00
241 lines
4 KiB
NASM
241 lines
4 KiB
NASM
|
|
; flat assembler source
|
|
; Copyright (c) 1999-2002, Tomasz Grysztar
|
|
; All rights reserved.
|
|
|
|
program_base = 0x8048000
|
|
|
|
org program_base
|
|
use32
|
|
|
|
macro align value { rb (value-1) - ($ + value-1) mod value }
|
|
|
|
file_header:
|
|
db 0x7F,'ELF',1,1,1
|
|
rb file_header+0x10-$
|
|
dw 2,3
|
|
dd 1,start
|
|
dd program_header-file_header,0,0
|
|
dw program_header-file_header,0x20,1,0,0,0
|
|
|
|
program_header:
|
|
dd 1,0,program_base,0
|
|
dd bss-program_base,program_end-program_base,7,0x1000
|
|
|
|
start:
|
|
|
|
mov esi,_logo
|
|
call display_string
|
|
|
|
pop eax
|
|
cmp eax,3
|
|
jne information
|
|
pop eax
|
|
pop [input_file]
|
|
pop [output_file]
|
|
pop eax
|
|
pop [environment]
|
|
|
|
call init_memory
|
|
|
|
mov edi,characters
|
|
mov ecx,100h
|
|
xor al,al
|
|
make_characters_table:
|
|
stosb
|
|
inc al
|
|
loop make_characters_table
|
|
mov esi,characters+'a'
|
|
mov edi,characters+'A'
|
|
mov ecx,26
|
|
rep movsb
|
|
mov edi,characters
|
|
mov esi,symbol_characters+1
|
|
movzx ecx,byte [esi-1]
|
|
xor ebx,ebx
|
|
convert_table:
|
|
lodsb
|
|
mov bl,al
|
|
mov byte [edi+ebx],0
|
|
loop convert_table
|
|
|
|
mov eax,78
|
|
mov ebx,buffer
|
|
xor ecx,ecx
|
|
int 0x80
|
|
mov eax,dword [buffer]
|
|
mov ecx,1000
|
|
mul ecx
|
|
mov ebx,eax
|
|
mov eax,dword [buffer+4]
|
|
div ecx
|
|
add eax,ebx
|
|
mov [start_time],eax
|
|
|
|
call preprocessor
|
|
call parser
|
|
call assembler
|
|
call formatter
|
|
|
|
movzx eax,[current_pass]
|
|
inc al
|
|
call display_number
|
|
mov esi,_passes_suffix
|
|
call display_string
|
|
mov eax,78
|
|
mov ebx,buffer
|
|
xor ecx,ecx
|
|
int 0x80
|
|
mov eax,dword [buffer]
|
|
mov ecx,1000
|
|
mul ecx
|
|
mov ebx,eax
|
|
mov eax,dword [buffer+4]
|
|
div ecx
|
|
add eax,ebx
|
|
sub eax,[start_time]
|
|
jnc time_ok
|
|
add eax,3600000
|
|
time_ok:
|
|
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
|
|
|
|
include 'system.inc'
|
|
|
|
include '..\version.inc'
|
|
include '..\errors.inc'
|
|
include '..\expressi.inc'
|
|
include '..\preproce.inc'
|
|
include '..\parser.inc'
|
|
include '..\assemble.inc'
|
|
include '..\formats.inc'
|
|
include '..\tables.inc'
|
|
|
|
_copyright db 'Copyright (c) 1999-2002, Tomasz Grysztar',0
|
|
|
|
_logo db 'flat assembler version ',VERSION_STRING,0xA,0
|
|
_usage db 'usage: fasm source output',0xA,0
|
|
|
|
_passes_suffix db ' passes, ',0
|
|
_seconds_suffix db ' seconds, ',0
|
|
_bytes_suffix db ' bytes.',0xA,0
|
|
|
|
_counter db 4,'0000'
|
|
|
|
bss:
|
|
|
|
align 4
|
|
|
|
memory_start dd ?
|
|
memory_end dd ?
|
|
additional_memory dd ?
|
|
additional_memory_end dd ?
|
|
input_file dd ?
|
|
output_file dd ?
|
|
environment dd ?
|
|
source_start dd ?
|
|
code_start dd ?
|
|
code_size dd ?
|
|
real_code_size dd ?
|
|
start_time dd ?
|
|
written_size dd ?
|
|
|
|
current_line dd ?
|
|
macros_list dd ?
|
|
macro_constants dd ?
|
|
macro_block dd ?
|
|
macro_block_line_number dd ?
|
|
struc_name dd ?
|
|
current_locals_prefix dd ?
|
|
anonymous_reverse dd ?
|
|
anonymous_forward dd ?
|
|
labels_list dd ?
|
|
label_hash dd ?
|
|
org_origin dd ?
|
|
org_sib dd ?
|
|
org_start dd ?
|
|
undefined_data_start dd ?
|
|
undefined_data_end dd ?
|
|
counter dd ?
|
|
counter_limit dd ?
|
|
error_line dd ?
|
|
error dd ?
|
|
display_buffer dd ?
|
|
structures_buffer dd ?
|
|
number_start dd ?
|
|
current_offset dd ?
|
|
value dq ?
|
|
fp_value rd 8
|
|
symbol_identifier dd ?
|
|
address_symbol dd ?
|
|
format_flags dd ?
|
|
number_of_relocations dd ?
|
|
number_of_sections dd ?
|
|
stub_size dd ?
|
|
header_data dd ?
|
|
sections_data dd ?
|
|
current_section dd ?
|
|
machine dw ?
|
|
subsystem dw ?
|
|
subsystem_version dd ?
|
|
image_base dd ?
|
|
|
|
macro_status db ?
|
|
parenthesis_stack db ?
|
|
output_format db ?
|
|
code_type db ?
|
|
current_pass db ?
|
|
next_pass_needed db ?
|
|
reloc_labels db ?
|
|
times_working db ?
|
|
virtual_data db ?
|
|
fp_sign db ?
|
|
fp_format db ?
|
|
value_size db ?
|
|
forced_size db ?
|
|
value_type db ?
|
|
address_size db ?
|
|
compare_type db ?
|
|
base_code db ?
|
|
extended_code db ?
|
|
postbyte_register db ?
|
|
segment_register db ?
|
|
operand_size db ?
|
|
imm_sized db ?
|
|
jump_type db ?
|
|
mmx_size db ?
|
|
mmx_prefix db ?
|
|
nextbyte db ?
|
|
|
|
characters rb 100h
|
|
converted rb 100h
|
|
buffer rb 4000h
|
|
|
|
program_end:
|