~nch/onward

e9fad832a8bff87e300a7cfdef2ebdc3c212c8e8 — nc 4 years ago
added basic read/write prompt
3 files changed, 61 insertions(+), 0 deletions(-)

A .gitignore
A forth.s
A makefile
A  => .gitignore +2 -0
@@ 1,2 @@
*.o
forth

A  => forth.s +57 -0
@@ 1,57 @@
; vi: ft=nasm

; https://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/

;

global _start
section .text
%define SYS_READ 0
%define SYS_WRITE 1
%define SYS_EXIT 60

%define STDIN 0
%define STDOUT 1


%define putchar(x) mov

_start:

repl:
        mov rax, SYS_WRITE          ; write prompt
        mov rdi, STDOUT
        mov rsi, prompt
        mov rdx, prompt_len
        syscall

        mov rax, SYS_READ           ; read
        mov rdi, STDIN
        mov rsi, buf_in
        mov rdx, buf_len
        syscall

        mov rdx, rax ; length in rax
        cmp rdx, 0
        jz exit

        ;; write
        mov rax, SYS_WRITE          ; echo
        mov rdi, STDOUT
        mov rsi, buf_in
        syscall

        jmp repl                    ; loop

exit:
        mov rax, SYS_EXIT
        mov rdi, 0
        syscall

section .bss
        buf_in: resb 128
        buf_len: equ $ - buf_in

section .rodata
        prompt: db "> "
        prompt_len: equ $ - prompt

A  => makefile +2 -0
@@ 1,2 @@
all:
	nasm -f elf64 -o forth.o forth.s && ld -o forth forth.o