X-Git-Url: https://git.danieliu.xyz/?p=sped.git;a=blobdiff_plain;f=sped.asm;h=a14dbd4867bbad6ea69eedc36680cd8a7bb01e19;hp=a76e7de3e1477462a30d83093a8f33d011c6923a;hb=89732d399de9007aaf2894b0c637e8cfb9ed47ac;hpb=a7e38d5436df06ef83114adbcd3ee8c89d609b16 diff --git a/sped.asm b/sped.asm index a76e7de..a14dbd4 100644 --- a/sped.asm +++ b/sped.asm @@ -1,7 +1,13 @@ +; sped - the stupidly pointless editor +; written by pinosaur + +%include "fileutils.S" +%include "repl.S" -global main extern printf +global main + ; macros %macro write_str 2 mov eax, 4 @@ -13,117 +19,67 @@ extern printf section .data banner_str db `SPED - the stupidly pointless editor\n`, 0x00 - 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 + readlines_str db `opened file with %i lines\n`, 0x00 section .text main: + %define _ARGC 8 + %define _ARGV 12 + + %define BUFFER 4 + %define BUFFER_LINES 8 + %define BUFFER_FILENAME 12 + push ebp mov ebp, esp + sub esp, 12 + ; 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] - add ebx, 4 - push DWORD [ebx] - ; push readfile_str - ; call printf + _main_existing: + mov ebx, DWORD [ebp+_ARGV] + add ebx, 4 ; first user arg is filename + mov ebx, [ebx] + mov [ebp-BUFFER_FILENAME], ebx + push DWORD [ebp-BUFFER_FILENAME] call readFile - mov eax, 0 - 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 + mov [ebp-BUFFER], eax + mov [ebp-BUFFER_LINES], ecx - ; check if file was open successfully - cmp eax, 0 - jge .readFile_noerror - push eax - push wrongfile_str + push DWORD [ebp-BUFFER_LINES] + push readlines_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 + push DWORD [ebp-BUFFER] + push DWORD [ebp-BUFFER_LINES] + push DWORD [ebp-BUFFER_FILENAME] + call repl -; 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 + mov eax, 0 + jmp _main_exit -.readLine_loop: + _main_exit: - ; read a single character - mov eax, 3 - mov ebx, [ebp+_FILE_HANDLE] - ; mov ecx, - mov edx, 1 - int 0x80 + ; free string array - jmp .readLine_loop + %undef _ARGC + %undef _ARGV + %undef BUFFER + %undef BUFFER_LINES + %undef BUFFER_FILENAME mov esp, ebp pop ebp