116 lines
1.8 KiB
Plaintext
116 lines
1.8 KiB
Plaintext
|
|
||
|
preprocessed_source:
|
||
|
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 esi,[eax+32]
|
||
|
add esi,eax
|
||
|
mov ebp,[eax+36]
|
||
|
add ebp,esi
|
||
|
mov edi,eax
|
||
|
push eax
|
||
|
preprocessed_to_text:
|
||
|
cmp esi,ebp
|
||
|
jae conversion_done
|
||
|
add esi,16
|
||
|
xor dl,dl
|
||
|
convert_preprocessed_line:
|
||
|
lodsb
|
||
|
cmp al,1Ah
|
||
|
je copy_symbol
|
||
|
cmp al,22h
|
||
|
je copy_symbol
|
||
|
cmp al,3Bh
|
||
|
je preprocessor_symbols
|
||
|
or al,al
|
||
|
jz line_converted
|
||
|
stosb
|
||
|
xor dl,dl
|
||
|
jmp convert_preprocessed_line
|
||
|
copy_symbol:
|
||
|
or dl,dl
|
||
|
jz space_ok
|
||
|
mov byte [edi],20h
|
||
|
inc edi
|
||
|
space_ok:
|
||
|
cmp al,22h
|
||
|
je quoted
|
||
|
lodsb
|
||
|
movzx ecx,al
|
||
|
rep movsb
|
||
|
or dl,-1
|
||
|
jmp convert_preprocessed_line
|
||
|
quoted:
|
||
|
mov al,27h
|
||
|
stosb
|
||
|
lodsd
|
||
|
mov ecx,eax
|
||
|
jecxz quoted_copied
|
||
|
copy_quoted:
|
||
|
lodsb
|
||
|
stosb
|
||
|
cmp al,27h
|
||
|
jne quote_ok
|
||
|
stosb
|
||
|
quote_ok:
|
||
|
loop copy_quoted
|
||
|
quoted_copied:
|
||
|
mov al,27h
|
||
|
stosb
|
||
|
or dl,-1
|
||
|
jmp convert_preprocessed_line
|
||
|
preprocessor_symbols:
|
||
|
mov al,3Bh
|
||
|
stosb
|
||
|
jmp copy_symbol
|
||
|
line_converted:
|
||
|
mov ax,0A0Dh
|
||
|
stosw
|
||
|
jmp preprocessed_to_text
|
||
|
conversion_done:
|
||
|
mov edx,[output_file]
|
||
|
call create
|
||
|
jc writing_error
|
||
|
pop edx
|
||
|
mov ecx,edi
|
||
|
sub ecx,edx
|
||
|
call write
|
||
|
jc writing_error
|
||
|
call close
|
||
|
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
|
||
|
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
|