Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; David Boarman
- SECTION .data ; initialized data
- SEEK_SET dd 0;
- SEEK_CUR dd 1;
- SEEK_END dd 2;
- endl: db 10, 0
- char: db "%d: %s", 10, 0
- mfnf: db "file not found", 0
- mske: db "seek could not be completed", 0
- fname: db "d:\asmplus\tsources\s1.txt", 0
- fread: db "r", 0
- mclf: db "close", 0
- mopf: db "open", 0
- mrdf: db "read", 0
- mskf: db "seek", 0
- mszf: db "size", 0
- mcld: db "[FILE] call [%s]: %d", 10, 0
- mcls: db "[FILE] call [%s]: %s", 10, 0
- merr: db "[FILE] error [%s]: %s", 10, 0
- mret: db "[FILE] ret [%s]: %d", 10, 0
- mrts: db "[FILE] ret [%s]:", 10, "%s", 10, 0
- SECTION .text ; code
- extern _fclose
- extern _fopen
- extern _fread
- extern _free
- extern _fseek
- extern _ftell
- extern _malloc
- extern _printf
- extern _puts
- global _main
- _main:
- ; stash base stack pointer
- push ebp
- mov ebp, esp
- push DWORD fname
- push DWORD mopf
- push DWORD mcls
- call _printf
- add esp, 12 ; clean up stack use
- ; open file
- push DWORD fread
- push DWORD fname
- call _fopen
- add esp, 8
- cmp eax, 0
- jnz .valid
- push DWORD mfnf
- push DWORD mopf
- jmp .error
- .valid:
- mov [fh], eax
- ; output result
- push DWORD [fh]
- push DWORD mopf
- push DWORD mret
- call _printf
- add esp, 12
- push DWORD [fh]
- push DWORD mskf
- push DWORD mcld
- call _printf
- add esp, 12
- ; C:
- ; fseek(fp, 0L, SEEK_END); ; set up constants: SEEK_END, SEEK_SET, etc.
- push DWORD [SEEK_END]
- push DWORD 0 ; 0L
- push DWORD [fh] ; f_hndl
- call _fseek ; ret [eax]: 0 okay; otherwise 1
- add esp, 12 ; reset stack pointer
- cmp eax, 0
- je .success
- push DWORD mske
- push DWORD mskf
- jmp .error
- .success:
- ; output result
- push DWORD eax
- push DWORD mskf
- push DWORD mret
- call _printf
- add esp, 12
- ; C:
- ; sz = ftell(fp); ; result to eax
- push DWORD [fh]
- call _ftell
- add esp, 4
- mov [fsz], eax
- ; output result
- push DWORD [fsz]
- push DWORD mszf
- push DWORD mcld
- call _printf
- add esp, 12
- ; seek back to the beginning of the file
- push DWORD [SEEK_SET]
- push DWORD 0 ; 0L
- push DWORD [fh] ; f_hndl
- call _fseek ; ret [eax]: 0 okay; otherwise 1
- add esp, 12 ; reset stack pointer
- ; allocate buffer
- ; C:
- ; p* = malloc(size)
- push DWORD [fsz]
- call _malloc
- add esp, 4
- mov [buffer], eax
- ; read file
- ; size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
- push DWORD [fh]
- push DWORD [fsz]
- push DWORD 1
- push DWORD [buffer]
- call _fread
- add esp, 16
- push DWORD [fsz]
- push DWORD mrdf
- push DWORD mcld
- call _printf
- add esp, 12
- push DWORD [buffer]
- push DWORD fname
- push DWORD mrts
- call _printf
- push DWORD endl
- call _printf
- add esp, 16
- ; loop contents and separate on spaces
- mov ecx, 0
- mov ebx, buffer
- .readByte:
- push DWORD [ebx + 1 * ecx]
- push DWORD ecx
- push DWORD char
- call _printf
- add esp, 12
- incr ecx
- cmp ecx, [fsz]
- jge .endRead
- jmp .readByte
- .endRead:
- push DWORD endl
- call _printf
- add esp, 4
- jmp .done
- .error:
- push DWORD merr
- call _printf
- add esp, 12
- .done:
- push DWORD [fh]
- call _fclose
- push DWORD [buffer]
- call _free
- push DWORD eax
- push DWORD mclf
- push DWORD mcld
- call _printf
- add esp, 16
- ; restore base stack pointer
- mov esp, ebp
- pop ebp
- ret
- SECTION .bss ; uninitialized data
- fh: resd 1
- fsz: resd 1
- buffer: resd 1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement