445 lines
7.5 KiB
Plaintext
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
|