From: Daniel Liu Date: Fri, 18 Jun 2021 20:09:08 +0000 (-0400) Subject: reading file X-Git-Url: https://git.danieliu.xyz/?a=commitdiff_plain;h=a7e38d5436df06ef83114adbcd3ee8c89d609b16;p=sped.git reading file --- diff --git a/sped.asm b/sped.asm index eda67b3..a76e7de 100644 --- a/sped.asm +++ b/sped.asm @@ -16,6 +16,9 @@ section .data readfile_str db `reading file %s\n`, 0x00 nofile_str db `no file provided\n`, 0x00 argcount_str db `there are %d args\n`, 0x00 + wrongfile_str db `unable to open file, error code: %i\n`, 0x00 + +; section .bss section .text main: @@ -24,28 +27,104 @@ main: ; read command line args mov ecx, [ebp+8] - cmp ecx, 1 - jg .readFile + jg .main_existing ; display error msg if no file push nofile_str call printf mov eax, 1 - jmp .exit - -.readFile: + jmp .main_exit +.main_existing: mov ebx, DWORD [ebp+12] add ebx, 4 push DWORD [ebx] - push readfile_str - call printf + ; push readfile_str + ; call printf + + call readFile mov eax, 0 - jmp .exit + jmp .main_exit + +.main_exit: + mov esp, ebp + pop ebp + ret + +; reads file line by line +; args: filename +; return: +; eax - pointer to mem +; ecx - lines read +readFile: + %define _FILE_NAME 8 + %define FILE_HANDLE 4 + + push ebp + mov ebp, esp + + ; allocate vars + sub esp, 4 + mov DWORD [ebp-FILE_HANDLE], 0x00 + + ; open existing file + mov eax, 5 + mov ebx, [ebp+_FILE_NAME] + mov ecx, 0 + mov edx, 0700 + int 0x80 + mov [ebp-FILE_HANDLE], eax + + ; check if file was open successfully + cmp eax, 0 + jge .readFile_noerror + push eax + push wrongfile_str + call printf + jmp .readFile_exit + +.readFile_noerror: + + jmp .readFile_exit + +.readFile_exit: + + ; close file + mov eax, 6 + mov ebx, [ebp-FILE_HANDLE] + int 0x80 + + %undef _FILE_NAME + %undef FILE_HANDLE + + mov esp, ebp + pop ebp + ret + + +; reads a line until newline character is reached +; args: file_handle +; return: location to buffer +readLine: + + %define _FILE_HANDLE 8 + + push ebp + mov ebp, esp + +.readLine_loop: + + ; read a single character + mov eax, 3 + mov ebx, [ebp+_FILE_HANDLE] + ; mov ecx, + mov edx, 1 + int 0x80 + + jmp .readLine_loop -.exit: mov esp, ebp pop ebp ret