X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=sped.asm;h=21d191018af8a204f27f6b950975d8c43f563373;hb=f4e4f6cbfee907de343ab7a08a90d38b18def0a1;hp=a76e7de3e1477462a30d83093a8f33d011c6923a;hpb=a7e38d5436df06ef83114adbcd3ee8c89d609b16;p=sped.git diff --git a/sped.asm b/sped.asm index a76e7de..21d1910 100644 --- a/sped.asm +++ b/sped.asm @@ -1,6 +1,12 @@ +; sped - the stupidly pointless editor +; written by pinosaur global main extern printf +extern malloc +extern realloc +extern free +extern memset ; macros %macro write_str 2 @@ -17,27 +23,30 @@ 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 - -; section .bss + char_str db `read this char: %i\n`, 0x00 + printfint_str db `int: %i\n`, 0x00 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,51 +55,94 @@ 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: ; eax - pointer to mem ; ecx - lines read readFile: - %define _FILE_NAME 8 + %define _FILE_NAME 8 %define FILE_HANDLE 4 + %define IS_EOF 8 + %define LINES_READ 12 + %define BUF_PTR 16 ; malloced array of strings push ebp mov ebp, esp ; allocate vars - sub esp, 4 + sub esp, 16 mov DWORD [ebp-FILE_HANDLE], 0x00 - + mov DWORD [ebp-IS_EOF], 0x00 + mov DWORD [ebp-LINES_READ], 0x00 + + push 0 + call malloc + mov [ebp-BUF_PTR], eax + ; 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_loop push eax push wrongfile_str call printf - jmp .readFile_exit + jmp _readFile_exit + + _readFile_loop: + + ; check if eof was reached + cmp DWORD [ebp-IS_EOF], 1 + je _readFile_exit + + push DWORD [ebp-FILE_HANDLE] + call readLine + + mov esi, eax + mov [ebp-IS_EOF], ebx + + push esi + call printf + + ; make string buffer bigger + mov eax, DWORD [ebp-LINES_READ] + add eax, 1 + mov ecx, 4 + mul ecx + push eax + push DWORD [ebp-BUF_PTR] + call realloc + mov DWORD [ebp-BUF_PTR], eax -.readFile_noerror: + ; write string to buffer + mov eax, DWORD [ebp-BUF_PTR] + mov ecx, 4 + mul ecx + mov eax, esi - jmp .readFile_exit + add DWORD [ebp-LINES_READ], 1 -.readFile_exit: + jmp _readFile_loop + _readFile_exit: ; close file mov eax, 6 mov ebx, [ebp-FILE_HANDLE] @@ -98,6 +150,9 @@ readFile: %undef _FILE_NAME %undef FILE_HANDLE + %undef IS_EOF + %undef LINES_READ + %undef BUF_PTR mov esp, ebp pop ebp @@ -106,24 +161,80 @@ readFile: ; reads a line until newline character is reached ; args: file_handle -; return: location to buffer +; return: +; eax: location to buffer +; ebx: contains eof readLine: - %define _FILE_HANDLE 8 + %define CHAR_COUNT 4 ; count number of characters read + %define BLOCK_COUNT 8 ; number of 64 blocks we've read + %define STR_PTR 12 ; malloced buffer to store read string push ebp mov ebp, esp + + ; allocate vars + sub esp, 12 + mov DWORD [ebp-CHAR_COUNT], 0x00 + mov DWORD [ebp-BLOCK_COUNT], 0x00 + + push 64 + call malloc + mov [ebp-STR_PTR], eax + + push DWORD [ebp-STR_PTR] + push 0x00 + push 64 -.readLine_loop: + _readLine_loop: + ; if buffer is full + cmp BYTE [ebp-CHAR_COUNT], 63 ; leave one byte for null byte + jne _readLine_notfull + jmp _readLine_exit + _readLine_notfull: ; read a single character mov eax, 3 mov ebx, [ebp+_FILE_HANDLE] - ; mov ecx, + mov ecx, [ebp-STR_PTR] + add ecx, [ebp-CHAR_COUNT] mov edx, 1 int 0x80 - jmp .readLine_loop + ; mov eax, 4 + ; mov ebx, 1 + ; mov ecx, [ebp-STR_PTR] + ; add ecx, [ebp-CHAR_COUNT] + ; mov edx, 1 + ; int 0x80 + + ; check for eof + cmp eax, 0 ; eax has zero on eof + jne _readLine_not_eof + mov ebx, 1 + jmp _readLine_exit + _readLine_not_eof: + + ; check for newline + mov eax, [ebp-STR_PTR] + add eax, [ebp-CHAR_COUNT] + cmp DWORD [eax], 0x0a + jne _readLine_not_newline + mov ebx, 0 + jmp _readLine_exit + _readLine_not_newline: + + add DWORD [ebp-CHAR_COUNT], 1 + jmp _readLine_loop + + _readLine_exit: + + mov eax, DWORD [ebp-STR_PTR] + + %undef _FILE_HANDLE + %undef CHAR_COUNT + %undef BLOCK_COUNT + %undef STR_PTR mov esp, ebp pop ebp