@@ 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