From: Daniel Liu Date: Sat, 19 Jun 2021 02:56:05 +0000 (-0400) Subject: more work on reading file X-Git-Url: https://git.danieliu.xyz/?a=commitdiff_plain;h=f0c5604be9e918713786e0fdecd7efe1e3cea0ee;p=sped.git more work on reading file --- diff --git a/makefile b/makefile index 64a6613..d031d20 100644 --- a/makefile +++ b/makefile @@ -1,12 +1,14 @@ CC=gcc -CFLAGS=-m32 -no-pie -g +CFLAGS=-m32 -no-pie +ASM=nasm +ASMFLAGS=-f elf32 -g -F dwarf .PHONY: clean make: sped sped.o: sped.asm - nasm -f elf32 $^ -o $@ + $(ASM) $(ASMFLAGS) -g $^ -o $@ sped: sped.o $(CC) $(CFLAGS) $^ -o $@ diff --git a/sped.asm b/sped.asm index a76e7de..859d386 100644 --- a/sped.asm +++ b/sped.asm @@ -1,3 +1,5 @@ +; sped - the stupidly pointless editor +; written by pinosaur global main extern printf @@ -17,27 +19,33 @@ section .data 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 + char_str db `read this char: %i\n`, 0x00 + printfint_str db `int: %i\n`, 0x00 -; section .bss +section .bss + read_buf resb 64 section .text main: + %define _ARGC 8 + %define _ARGV 12 + push ebp mov ebp, esp ; read command line args - mov ecx, [ebp+8] + mov ecx, [ebp+_ARGC] cmp ecx, 1 - jg .main_existing + jg _main_existing ; display error msg if no file push nofile_str call printf mov eax, 1 - jmp .main_exit + jmp _main_exit -.main_existing: - mov ebx, DWORD [ebp+12] + _main_existing: + mov ebx, DWORD [ebp+_ARGV] add ebx, 4 push DWORD [ebx] ; push readfile_str @@ -46,13 +54,17 @@ main: call readFile mov eax, 0 - jmp .main_exit + jmp _main_exit + + _main_exit: + %undef _ARGC + %undef _ARGV -.main_exit: mov esp, ebp pop ebp ret + ; reads file line by line ; args: filename ; return: @@ -68,29 +80,30 @@ readFile: ; 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 + mov edx, 0777 int 0x80 mov [ebp-FILE_HANDLE], eax ; check if file was open successfully cmp eax, 0 - jge .readFile_noerror + jge _readFile_noerror push eax push wrongfile_str call printf - jmp .readFile_exit + jmp _readFile_exit -.readFile_noerror: + _readFile_noerror: + push DWORD [ebp-FILE_HANDLE] + call readLine - jmp .readFile_exit - -.readFile_exit: + jmp _readFile_exit + _readFile_exit: ; close file mov eax, 6 mov ebx, [ebp-FILE_HANDLE] @@ -106,24 +119,61 @@ readFile: ; reads a line until newline character is reached ; args: file_handle -; return: location to buffer +; return: +; location to buffer +; contains eof readLine: - %define _FILE_HANDLE 8 + %define CHAR_PTR 4 push ebp mov ebp, esp -.readLine_loop: + sub esp, 4 + mov DWORD [ebp-CHAR_PTR], 0x00 + + _readLine_loop: + ; if buffer is full + cmp BYTE [ebp-CHAR_PTR], 64 + jne _readLine_notfull + jmp _readLine_exit + _readLine_notfull: ; read a single character mov eax, 3 mov ebx, [ebp+_FILE_HANDLE] - ; mov ecx, + mov ecx, read_buf + add ecx, [ebp-CHAR_PTR] mov edx, 1 int 0x80 - jmp .readLine_loop + mov eax, 4 + mov ebx, 1 + mov ecx, read_buf + add ecx, [ebp-CHAR_PTR] + mov edx, 1 + int 0x80 + + ; check for newline + mov eax, read_buf + add eax, [ebp-CHAR_PTR] + cmp DWORD [eax], 0x0a + je _readLine_exit + + ; check for eof + mov eax, read_buf + add eax, [ebp-CHAR_PTR] + cmp DWORD [eax], 0x05 + je _readLine_exit + + add DWORD [ebp-CHAR_PTR], 1 + + jmp _readLine_loop + + _readLine_exit: + + %undef _FILE_HANDLE + %undef CHAR_PTR mov esp, ebp pop ebp