abstracting
authorDaniel Liu <mr.picklepinosaur@gmail.com>
Sun, 20 Jun 2021 00:14:00 +0000 (20:14 -0400)
committerDaniel Liu <mr.picklepinosaur@gmail.com>
Sun, 20 Jun 2021 00:14:00 +0000 (20:14 -0400)
README.md
fileutils.asm
makefile
repl.S [new file with mode: 0644]
repl.asm [new file with mode: 0644]
sped.asm
utils.S [new file with mode: 0644]
utils.asm [new file with mode: 0644]

index 4ea05df..2436d48 100644 (file)
--- a/README.md
+++ b/README.md
@@ -29,6 +29,10 @@ to build the project
 
 **c** - change the contents of the current line
 
 
 **c** - change the contents of the current line
 
+**w** - saves file
+
+**q** - exists the program
+
 ### FAQ
 
 **are you insane**
 ### FAQ
 
 **are you insane**
index b9b41e7..1d78439 100644 (file)
@@ -1,5 +1,5 @@
 
 
-%include "utils.S"
+%include "utils.S"
 
 extern printf
 extern malloc
 
 extern printf
 extern malloc
index 82074cf..18c299f 100644 (file)
--- a/makefile
+++ b/makefile
@@ -10,7 +10,7 @@ make: sped
 %.o: %.asm
        $(ASM) $(ASMFLAGS) -o $@ $^
 
 %.o: %.asm
        $(ASM) $(ASMFLAGS) -o $@ $^
 
-sped: sped.o fileutils.o
+sped: sped.o fileutils.o repl.o
        $(CC) $(CFLAGS) -o $@ $^
 
 clean:
        $(CC) $(CFLAGS) -o $@ $^
 
 clean:
diff --git a/repl.S b/repl.S
new file mode 100644 (file)
index 0000000..18805a6
--- /dev/null
+++ b/repl.S
@@ -0,0 +1,7 @@
+
+%ifndef __REPL_S__
+%define __REPL_S__
+
+extern repl
+
+%endif
diff --git a/repl.asm b/repl.asm
new file mode 100644 (file)
index 0000000..3c7f429
--- /dev/null
+++ b/repl.asm
@@ -0,0 +1,240 @@
+
+%include "fileutils.S"
+
+extern printf
+extern fflush
+extern stdout
+extern free
+
+global repl
+
+section .data
+    prompt_str db `sped > `, 0x00
+    invalidcmd_str db `invalid command\n`, 0x00
+    invalidaddr_str db `invalid address\n`, 0x00
+    charcount_str db `read %i chars\n`, 0x00
+    currentline_str db `current line: %i\n`, 0x00
+    echo_str db `%s`, 0x00 ; print strings without format exploit
+
+section .bss
+    buffer resb 4
+    buffer_lines resb 4
+    buffer_filename resb 4
+    cur_line resb 4
+
+section .text
+
+; prompt for user
+; args: buffer, buffer_lines, buffer_filename
+repl:
+
+    %define _BUFFER          16
+    %define _BUFFER_LINES    12
+    %define _BUFFER_FILENAME 8
+    %define CMDSTR           4 ; the previous line read from user
+
+    push ebp
+    mov ebp, esp
+
+    sub esp, 4
+    
+    ; set bss vars
+    mov eax, [ebp+_BUFFER]
+    mov [buffer], eax
+    mov eax, [ebp+_BUFFER_LINES]
+    mov [buffer_lines], eax
+    mov eax, [ebp+_BUFFER_FILENAME]
+    mov [buffer_filename], eax
+    mov DWORD [cur_line], 0x00
+
+    _repl_loop:
+    
+    ; print the prompt
+    push prompt_str
+    call printf
+    push DWORD [stdout]
+    call fflush
+
+    ; read line from stdin
+    push 0
+    call readLine
+
+    mov DWORD [ebp-CMDSTR], eax
+
+    ; commands are single char for now
+    cmp ecx, 1 
+    jne _repl_invalid_cmd
+
+    ; parse commands
+    mov eax, DWORD [ebp-CMDSTR]
+    mov eax, [eax]
+
+    ; q exists program =-=-=-=-=-=-=-=-=-=-=-=-=
+    mov eax, DWORD [ebp-CMDSTR]
+    cmp BYTE [eax], 'q'
+    jne _repl_cmd_quit_end
+    jmp _repl_exit
+    _repl_cmd_quit_end:
+
+    ; p prints current line =-=-=-=-=-=-=-=-=-=-=
+    mov eax, DWORD [ebp-CMDSTR]
+    cmp BYTE [eax], 'p'
+    jne _repl_cmd_print_end
+
+    mov eax, DWORD [cur_line]
+    mov ecx, 4
+    mul ecx
+    add eax, [buffer]
+    push DWORD [eax]
+    push echo_str
+    call printf
+    jmp _repl_continue
+    _repl_cmd_print_end:
+
+    ; n prints the current line number =-=-=-=-=-=-=-=
+    mov eax, DWORD [ebp-CMDSTR]
+    cmp BYTE [eax], 'n'
+    jne _repl_cmd_number_end
+
+    push DWORD [cur_line]
+    push currentline_str
+    call printf
+
+    jmp _repl_continue
+    _repl_cmd_number_end:
+
+    ; - goes to prev line =-=-=-=-=-=-=-=-=-=-=-=-=
+    mov eax, DWORD [ebp-CMDSTR]
+    cmp BYTE [eax], '-'
+    jne _repl_cmd_decline_end
+
+    ; make sure we are within bounds
+    mov eax, DWORD [cur_line] 
+    sub eax, 1
+    cmp eax, 0
+    jl _repl_invalid_addr
+    
+    sub DWORD [cur_line], 1
+
+    jmp _repl_continue
+    _repl_cmd_decline_end:
+
+    ; + goes to next line =-=-=-=-=-=-=-=-=-=-=-=-=
+    mov eax, DWORD [ebp-CMDSTR]
+    cmp BYTE [eax], '+'
+    jne _repl_cmd_incline_end
+
+    ; make sure we are within bounds 
+    mov eax, DWORD [cur_line] 
+    add eax, 1
+    cmp eax, [buffer_lines]
+    jge _repl_invalid_addr
+    
+    add DWORD [cur_line], 1
+
+    jmp _repl_continue
+    _repl_cmd_incline_end:
+
+    ; g goes to first line =-=-=-=-=-=-=-=-=-=-=-=-=
+    mov eax, DWORD [ebp-CMDSTR]
+    cmp BYTE [eax], 'g'
+    jne _repl_cmd_jumptop_end
+
+    mov DWORD [cur_line], 0x00
+
+    jmp _repl_continue
+    _repl_cmd_jumptop_end:
+
+    ; G goes to last line =-=-=-=-=-=-=-=-=-=-=-=-=
+    mov eax, DWORD [ebp-CMDSTR]
+    cmp BYTE [eax], 'G'
+    jne _repl_cmd_jumpbot_end
+
+    mov eax, DWORD [buffer_lines]
+    sub eax, 1
+    mov DWORD [cur_line], eax
+
+    jmp _repl_continue
+    _repl_cmd_jumpbot_end:
+
+    ; c changes the current line =-=-=-=-=-=-=-=-=-=
+    mov eax, DWORD [ebp-CMDSTR]
+    cmp BYTE [eax], 'c'
+    jne _repl_cmd_change_end
+
+    ; read a new line to use
+    push 0
+    call readLine
+
+    mov esi, eax
+
+    ; free old string
+    mov eax, [cur_line]
+    mov ecx, 4
+    mul ecx
+    add eax, [buffer]
+    push DWORD [eax]
+    call free
+
+    ; insert new string
+    mov eax, [cur_line]
+    mov ecx, 4
+    mul ecx
+    add eax, DWORD [buffer]
+    mov [eax], esi
+
+    jmp _repl_continue
+    _repl_cmd_change_end:
+
+    ; d delete line =-=-=-=-=-=-=-=-=-=-=-=-=
+    mov eax, DWORD [ebp-CMDSTR]
+    cmp BYTE [eax], 'd'
+    jne _repl_cmd_delete_end
+
+    
+
+    jmp _repl_continue
+    _repl_cmd_delete_end:
+
+    ; w writes file =-=-=-=-=-=-=-=-=-=-=-=-=
+    mov eax, DWORD [ebp-CMDSTR]
+    cmp BYTE [eax], 'w'
+    jne _repl_cmd_write_end
+
+    push DWORD [buffer_filename]
+    push DWORD [buffer]
+    push DWORD [buffer_lines]
+    call writeFile
+
+    jmp _repl_continue
+    _repl_cmd_write_end:
+
+
+    ; if no commands were matched, it's an error
+    jmp _repl_invalid_cmd
+
+    ; some error messages
+    _repl_invalid_cmd:
+    push invalidcmd_str
+    call printf
+    jmp _repl_continue
+
+    _repl_invalid_addr:
+    push invalidaddr_str
+    call printf
+    jmp _repl_continue
+
+    _repl_continue:
+    jmp _repl_loop
+    
+    _repl_exit:
+
+    %undef _BUFFER
+    %undef _BUFFER_LINES
+    %undef _BUFFER_FILENAME
+    %undef CMDSTR
+
+    mov esp, ebp
+    pop ebp
+    ret
+    
index 213f3ea..a14dbd4 100644 (file)
--- a/sped.asm
+++ b/sped.asm
@@ -2,11 +2,9 @@
 ; written by pinosaur
 
 %include "fileutils.S"
 ; written by pinosaur
 
 %include "fileutils.S"
+%include "repl.S"
 
 extern printf
 
 extern printf
-extern fflush
-extern stdout
-extern free
 
 global main
 
 
 global main
 
@@ -23,27 +21,21 @@ section .data
     banner_str db `SPED - the stupidly pointless editor\n`, 0x00
     nofile_str db `no file provided\n`, 0x00
     readlines_str db `opened file with %i lines\n`, 0x00
     banner_str db `SPED - the stupidly pointless editor\n`, 0x00
     nofile_str db `no file provided\n`, 0x00
     readlines_str db `opened file with %i lines\n`, 0x00
-    prompt_str db `sped > `, 0x00
-    invalidcmd_str db `invalid command\n`, 0x00
-    invalidaddr_str db `invalid address\n`, 0x00
-    charcount_str db `read %i chars\n`, 0x00
-    currentline_str db `current line: %i\n`, 0x00
-    echo_str db `%s`, 0x00 ; print strings without format exploit
-
-section .bss
-    buffer resb 4
-    buffer_lines resb 4
-    buffer_filename resb 4
-    cur_line resb 4
 
 section .text
 main:
     %define _ARGC 8
     %define _ARGV 12
 
 
 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
 
     push ebp
     mov ebp, esp
 
+    sub esp, 12
+
     ; read command line args
     mov ecx, [ebp+_ARGC]
     cmp ecx, 1
     ; read command line args
     mov ecx, [ebp+_ARGC]
     cmp ecx, 1
@@ -59,19 +51,21 @@ main:
     mov ebx, DWORD [ebp+_ARGV]
     add ebx, 4 ; first user arg is filename
     mov ebx, [ebx]
     mov ebx, DWORD [ebp+_ARGV]
     add ebx, 4 ; first user arg is filename
     mov ebx, [ebx]
-    mov [buffer_filename], ebx
+    mov [ebp-BUFFER_FILENAME], ebx
 
 
-    push DWORD [buffer_filename]
+    push DWORD [ebp-BUFFER_FILENAME]
     call readFile
 
     call readFile
 
-    mov [buffer], eax
-    mov [buffer_lines], ecx
-    mov DWORD [cur_line], 0x00
+    mov [ebp-BUFFER], eax
+    mov [ebp-BUFFER_LINES], ecx
 
 
-    push DWORD [buffer_lines]
+    push DWORD [ebp-BUFFER_LINES]
     push readlines_str
     call printf
 
     push readlines_str
     call printf
 
+    push DWORD [ebp-BUFFER]
+    push DWORD [ebp-BUFFER_LINES]
+    push DWORD [ebp-BUFFER_FILENAME]
     call repl
 
     mov eax, 0
     call repl
 
     mov eax, 0
@@ -81,199 +75,13 @@ main:
 
     ; free string array
 
 
     ; free string array
 
-
     %undef _ARGC
     %undef _ARGV
     %undef _ARGC
     %undef _ARGV
+    %undef BUFFER
+    %undef BUFFER_LINES
+    %undef BUFFER_FILENAME
 
     mov esp, ebp
     pop ebp
     ret
 
 
     mov esp, ebp
     pop ebp
     ret
 
-; prompt for user
-; no args - reads from globals
-repl:
-
-    %define CMDSTR 4 ; the previous line read from user
-
-    push ebp
-    mov ebp, esp
-
-    sub esp, 4
-
-    _repl_loop:
-    
-    ; print the prompt
-    push prompt_str
-    call printf
-    push DWORD [stdout]
-    call fflush
-
-    ; read line from stdin
-    push 0
-    call readLine
-
-    mov DWORD [ebp-CMDSTR], eax
-
-    ; commands are single char for now
-    cmp ecx, 1 
-    jne _repl_invalid_cmd
-
-    ; parse commands
-    mov eax, DWORD [ebp-CMDSTR]
-    mov eax, [eax]
-
-    ; q exists program =-=-=-=-=-=-=-=-=-=-=-=-=
-    mov eax, DWORD [ebp-CMDSTR]
-    cmp BYTE [eax], 'q'
-    jne _repl_cmd_quit_end
-    jmp _repl_exit
-    _repl_cmd_quit_end:
-
-    ; p prints current line =-=-=-=-=-=-=-=-=-=-=
-    mov eax, DWORD [ebp-CMDSTR]
-    cmp BYTE [eax], 'p'
-    jne _repl_cmd_print_end
-
-    mov eax, DWORD [cur_line]
-    mov ecx, 4
-    mul ecx
-    add eax, [buffer]
-    push DWORD [eax]
-    push echo_str
-    call printf
-    jmp _repl_continue
-    _repl_cmd_print_end:
-
-    ; n prints the current line number =-=-=-=-=-=-=-=
-    mov eax, DWORD [ebp-CMDSTR]
-    cmp BYTE [eax], 'n'
-    jne _repl_cmd_number_end
-
-    push DWORD [cur_line]
-    push currentline_str
-    call printf
-
-    jmp _repl_continue
-    _repl_cmd_number_end:
-
-    ; - goes to prev line =-=-=-=-=-=-=-=-=-=-=-=-=
-    mov eax, DWORD [ebp-CMDSTR]
-    cmp BYTE [eax], '-'
-    jne _repl_cmd_decline_end
-
-    ; make sure we are within bounds
-    mov eax, DWORD [cur_line] 
-    sub eax, 1
-    cmp eax, 0
-    jl _repl_invalid_addr
-    
-    sub DWORD [cur_line], 1
-
-    jmp _repl_continue
-    _repl_cmd_decline_end:
-
-    ; + goes to next line =-=-=-=-=-=-=-=-=-=-=-=-=
-    mov eax, DWORD [ebp-CMDSTR]
-    cmp BYTE [eax], '+'
-    jne _repl_cmd_incline_end
-
-    ; make sure we are within bounds 
-    mov eax, DWORD [cur_line] 
-    add eax, 1
-    cmp eax, [buffer_lines]
-    jge _repl_invalid_addr
-    
-    add DWORD [cur_line], 1
-
-    jmp _repl_continue
-    _repl_cmd_incline_end:
-
-    ; g goes to first line =-=-=-=-=-=-=-=-=-=-=-=-=
-    mov eax, DWORD [ebp-CMDSTR]
-    cmp BYTE [eax], 'g'
-    jne _repl_cmd_jumptop_end
-
-    mov DWORD [cur_line], 0x00
-
-    jmp _repl_continue
-    _repl_cmd_jumptop_end:
-
-    ; G goes to last line =-=-=-=-=-=-=-=-=-=-=-=-=
-    mov eax, DWORD [ebp-CMDSTR]
-    cmp BYTE [eax], 'G'
-    jne _repl_cmd_jumpbot_end
-
-    mov eax, DWORD [buffer_lines]
-    sub eax, 1
-    mov DWORD [cur_line], eax
-
-    jmp _repl_continue
-    _repl_cmd_jumpbot_end:
-
-    ; c changes the current line =-=-=-=-=-=-=-=-=-=
-    mov eax, DWORD [ebp-CMDSTR]
-    cmp BYTE [eax], 'c'
-    jne _repl_cmd_change_end
-
-    ; read a new line to use
-    push 0
-    call readLine
-
-    mov esi, eax
-
-    ; free old string
-    mov eax, [cur_line]
-    mov ecx, 4
-    mul ecx
-    add eax, [buffer]
-    push DWORD [eax]
-    call free
-
-    ; insert new string
-    mov eax, [cur_line]
-    mov ecx, 4
-    mul ecx
-    add eax, DWORD [buffer]
-    mov [eax], esi
-
-    jmp _repl_continue
-    _repl_cmd_change_end:
-
-    ; w writes file =-=-=-=-=-=-=-=-=-=-=-=-=
-    mov eax, DWORD [ebp-CMDSTR]
-    cmp BYTE [eax], 'w'
-    jne _repl_cmd_write_end
-
-    push DWORD [buffer_filename]
-    push DWORD [buffer]
-    push DWORD [buffer_lines]
-    call writeFile
-
-    jmp _repl_continue
-    _repl_cmd_write_end:
-
-
-    jmp _repl_invalid_cmd
-
-    ; some error messages
-    _repl_invalid_cmd:
-    push invalidcmd_str
-    call printf
-    jmp _repl_continue
-
-    _repl_invalid_addr:
-    push invalidaddr_str
-    call printf
-    jmp _repl_continue
-
-    _repl_continue:
-    jmp _repl_loop
-    
-    _repl_exit:
-
-    %undef CMDSTR
-
-    mov esp, ebp
-    pop ebp
-    ret
-    
diff --git a/utils.S b/utils.S
new file mode 100644 (file)
index 0000000..5c09a23
--- /dev/null
+++ b/utils.S
@@ -0,0 +1,18 @@
+
+%ifndef __UTILS_S__
+%define __UTILS_S__
+
+; gets the nth string ptr in a str array
+; of the form: str_offset buffer, n
+; result is in eax
+%macro str_offset 2
+    mov eax, %2
+    mov ecx, 4
+    mul ecx
+    add eax, DWORD %1
+%endmacro
+
+extern shiftLeft
+extern shiftRight
+
+%endif
diff --git a/utils.asm b/utils.asm
new file mode 100644 (file)
index 0000000..fd8529d
--- /dev/null
+++ b/utils.asm
@@ -0,0 +1,27 @@
+
+extern memmove
+
+global shiftLeft
+global shiftRight
+
+section .text
+
+shiftLeft:
+    push ebp
+    mov ebp, esp
+    
+    
+    
+    mov esp, ebp
+    pop ebp
+    ret
+
+shiftRight:
+    push ebp
+    mov ebp, esp
+
+    
+    
+    mov esp, ebp
+    pop ebp
+    ret