reading file
authorDaniel Liu <mr.picklepinosaur@gmail.com>
Fri, 18 Jun 2021 20:09:08 +0000 (16:09 -0400)
committerDaniel Liu <mr.picklepinosaur@gmail.com>
Fri, 18 Jun 2021 20:09:08 +0000 (16:09 -0400)
sped.asm

index eda67b3..a76e7de 100644 (file)
--- 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