asm_dip/toolchain/fasmw17332/TOOLS/SYMBOLS.INC
2024-11-24 23:13:28 -05:00

445 lines
7.5 KiB
Plaintext

symbols:
mov edx,[input_file]
call open
jc input_not_found
mov al,2
xor edx,edx
call lseek
cmp eax,30h
jb invalid_input
push eax
call alloc
jc not_enough_memory
push eax
xor al,al
xor edx,edx
call lseek
mov ecx,[esp+4]
mov edx,[esp]
call read
jc reading_error
pop eax ecx
cmp dword [eax],1A736166h
jne invalid_input
mov [input],eax
add [eax+16],eax
add [eax+24],eax
add [eax+32],eax
add [eax+48],eax
mov edx,[eax+16]
add [eax+8],edx
mov ebx,eax
mov eax,[ebx+20]
add eax,[ebx+36]
cmp eax,1000h
ja allocate_output_buffer
mov eax,1000h
allocate_output_buffer:
call alloc
jc not_enough_memory
mov [output_buffer],eax
mov edx,[output_file]
call create
jc writing_error
mov [output_handle],ebx
mov ebx,[input]
mov edx,[ebx+24]
mov ebp,[ebx+28]
add ebp,edx
dump_symbols:
cmp edx,ebp
je dump_done
test byte [edx+8],1
jz next_symbol
test byte [edx+9],4
jnz next_symbol
mov edi,[output_buffer]
mov esi,[edx+24]
test esi,esi
jz anonymous_symbol
mov ebx,[input]
btr esi,31
jc symbol_name_in_strings_table
add esi,[ebx+32]
lodsb
movzx ecx,al
rep movsb
jmp symbol_name_ok
symbol_name_in_strings_table:
add esi,[ebx+16]
call write_string
jmp symbol_name_ok
anonymous_symbol:
mov al,'@'
stosb
stosb
symbol_name_ok:
test byte [edx+9],2
jnz negative_value
mov eax,': 0x'
stosd
mov eax,[edx+4]
call write_hex_dword
mov eax,[edx]
call write_hex_dword
jmp write_address_registers
negative_value:
mov eax,': -0'
stosd
mov al,'x'
stosb
mov ecx,[edx]
mov eax,[edx+4]
not ecx
not eax
add ecx,1
adc eax,0
push ecx
or ecx,eax
jnz negative_value_ok
mov byte [edi],'1'
inc edi
negative_value_ok:
call write_hex_dword
pop eax
call write_hex_dword
write_address_registers:
mov bl,[edx+12]
mov bh,[edx+14]
call write_address_register
mov bl,[edx+13]
mov bh,[edx+15]
call write_address_register
mov bl,[edx+11]
cmp bl,0
je symbol_type_ok
jl negated_symbol
mov ax,', '
stosw
jmp write_symbol_type
negated_symbol:
mov ax,', '
stosw
mov esi,_negated
call write_string
neg bl
write_symbol_type:
cmp bl,1
je segment_type
cmp bl,5
je rva_type
cmp bl,6
je plt_type
test byte [edx+20+3],80h
jnz external
mov esi,_relocatable
call write_string
cmp dword [edx+20],0
je symbol_type_ok
mov esi,_in_section
call write_string
jmp write_symbol_base
simple_relocatable:
mov esi,_relocatable
call write_string
jmp symbol_type_ok
external:
mov esi,_relative_to_external
call write_string
jmp write_symbol_base
segment_type:
mov esi,_relocatable_segment
call write_string
jmp symbol_type_ok
rva_type:
mov esi,_rva
call write_string
jmp write_symbol_base
plt_type:
mov esi,_plt
call write_string
write_symbol_base:
mov esi,[edx+20]
btr esi,31
jc write_external_name
dec esi
shl esi,2
mov ebx,[input]
add esi,[ebx+48]
mov esi,[esi]
add esi,[ebx+16]
call write_string
mov al,'('
stosb
mov eax,[edx+20]
call write_dec_number
mov al,')'
stosb
jmp symbol_type_ok
write_external_name:
mov ebx,[input]
add esi,[ebx+16]
call write_string
jmp symbol_type_ok
symbol_type_ok:
mov esi,_defined
call write_string
mov ebx,[edx+28]
mov eax,[input]
add ebx,[eax+32]
call write_line_identifier
mov ax,0A0Dh
stosw
push edx
mov ebx,[output_handle]
mov ecx,edi
mov edx,[output_buffer]
sub ecx,edx
call write
pop edx
next_symbol:
add edx,32
jmp dump_symbols
dump_done:
mov ebx,[output_handle]
call close
ret
write_string:
lodsb
test al,al
jz string_ok
stosb
jmp write_string
string_ok:
ret
write_hex_dword:
mov ebx,eax
mov ecx,8
write_hex_digits:
xor al,al
shld eax,ebx,4
cmp al,10
sbb al,69h
das
stosb
shl ebx,4
loop write_hex_digits
ret
write_dec_number:
push ebx edx
mov ecx,1000000000
xor edx,edx
xor bl,bl
dec_number_loop:
div ecx
push edx
cmp ecx,1
je write_dec_digit
or bl,bl
jnz write_dec_digit
or al,al
jz dec_digit_ok
not bl
write_dec_digit:
add al,30h
stosb
dec_digit_ok:
mov eax,ecx
xor edx,edx
mov ecx,10
div ecx
mov ecx,eax
pop eax
or ecx,ecx
jnz dec_number_loop
pop edx ebx
ret
write_address_register:
cmp bh,0
je register_ok
jl negative_register
mov al,'+'
jmp register_sign_ok
negative_register:
mov al,'-'
register_sign_ok:
stosb
push esi
mov esi,address_registers
find_register:
lodsb
test al,al
jz register_not_found
cmp al,bl
je register_found
cmp bl,[esi]
je register_found
lodsb
movzx eax,al
add esi,eax
jmp find_register
register_not_found:
mov al,bl
shr al,5
cmp al,0Ch shr 1
je xmm_register
cmp al,0Eh shr 1
je ymm_register
cmp al,6 shr 1
je zmm_register
register_found:
lodsb
movzx ecx,al
rep movsb
write_register_scale:
pop esi
cmp bh,1
je register_ok
mov al,'*'
stosb
movzx eax,bh
call write_dec_number
register_ok:
ret
zmm_register:
mov al,'z'
jmp vector_address_register
ymm_register:
mov al,'y'
jmp vector_address_register
xmm_register:
mov al,'x'
vector_address_register:
stosb
mov ax,'mm'
stosw
mov al,bl
and eax,11111b
call write_dec_number
jmp write_register_scale
write_line_identifier:
test dword [ebx+4],80000000h
jnz identify_macro_generated_line
mov esi,[ebx]
mov eax,[input]
test esi,esi
jz main_file
add esi,[eax+32]
jmp file_name_ok
main_file:
mov esi,[eax+8]
file_name_ok:
call write_string
mov al,'['
stosb
mov eax,[ebx+4]
call write_dec_number
mov al,']'
stosb
ret
identify_macro_generated_line:
mov al,'{'
stosb
mov esi,_generated_by
call write_string
push ebx
mov ebx,[ebx+8]
mov eax,[input]
add ebx,[eax+32]
call write_line_identifier
pop ebx
mov eax,[ebx+8]
cmp eax,[ebx+12]
je macro_generated_line_identifier_ok
mov esi,_from
call write_string
push ebx
mov ebx,[ebx+12]
mov eax,[input]
add ebx,[eax+32]
call write_line_identifier
pop ebx
macro_generated_line_identifier_ok:
mov al,'}'
stosb
ret
not_enough_memory:
call error
db 'not enough memory to load the required data',0
input_not_found:
call error
db 'the input file was not found',0
code_not_found:
call error
db 'the assembled file was not found',0
source_not_found:
call error
db 'could not find some of the source files',0
reading_error:
call error
db 'some error occured while trying to read file',0
writing_error:
call error
db 'some error occured while trying to write file',0
invalid_input:
call error
db 'input file is not a recognized assembly information format',0
address_registers db 23h,2,'bx'
db 25h,2,'bp'
db 26h,2,'si'
db 27h,2,'di'
db 40h,3,'eax'
db 41h,3,'ecx'
db 42h,3,'edx'
db 43h,3,'ebx'
db 44h,3,'esp'
db 45h,3,'ebp'
db 46h,3,'esi'
db 47h,3,'edi'
db 48h,3,'r8d'
db 49h,3,'r9d'
db 4Ah,4,'r10d'
db 4Bh,4,'r11d'
db 4Ch,4,'r12d'
db 4Dh,4,'r13d'
db 4Eh,4,'r14d'
db 4Fh,4,'r15d'
db 80h,3,'rax'
db 81h,3,'rcx'
db 82h,3,'rdx'
db 83h,3,'rbx'
db 84h,3,'rsp'
db 85h,3,'rbp'
db 86h,3,'rsi'
db 87h,3,'rdi'
db 88h,2,'r8'
db 89h,2,'r9'
db 8Ah,3,'r10'
db 8Bh,3,'r11'
db 8Ch,3,'r12'
db 8Dh,3,'r13'
db 8Eh,3,'r14'
db 8Fh,3,'r15'
db 94h,3,'eip'
db 98h,3,'rip'
db 0,1,'?'
_negated db 'negated ',0
_relocatable_segment db 'relocatable segment',0
_relocatable db 'relocatable',0
_in_section db ' in section ',0
_relative_to_external db 'relative to external ',0
_rva db 'relative to RVA or GOT-based offset of ',0
_plt db 'relative to address of PLT entry for ',0
_defined db ', defined in ',0
_generated_by db 'line generated by ',0
_from db ' from ',0