diff --git a/build.sh b/build.sh index 7556750..cbabec1 100755 --- a/build.sh +++ b/build.sh @@ -1,5 +1,7 @@ set -ex +mkdir -p tmp bin + echo "compiling true" nasm -f elf64 -o tmp/true.o src/true/true.asm ld -s --nmagic -o bin/true tmp/true.o @@ -10,7 +12,12 @@ nasm -f elf64 -o tmp/false.o src/false/false.asm ld -s --nmagic -o bin/false tmp/false.o ls -l bin/false -echo "compiling cat" -nasm -f elf64 -o tmp/cat.o src/cat/cat.asm -ld -s -o bin/cat tmp/cat.o -ls -l bin/cat +echo "compiling rd" +nasm -f elf64 -o tmp/rd.o src/rd/rd.asm +ld -s -o bin/rd tmp/rd.o +ls -l bin/rd + +echo "compiling txt" +nasm -f elf64 -o tmp/txt.o src/txt/txt.asm +ld -s -o bin/txt tmp/txt.o +ls -l bin/txt \ No newline at end of file diff --git a/src/cat/cat.asm b/src/rd/rd.asm similarity index 100% rename from src/cat/cat.asm rename to src/rd/rd.asm diff --git a/src/txt/txt.asm b/src/txt/txt.asm new file mode 100644 index 0000000..2e3a8b6 --- /dev/null +++ b/src/txt/txt.asm @@ -0,0 +1,87 @@ +%define STDIN 0 +%define STDOUT 1 +%define STDERR 2 + +%define SYS_READ 0 +%define SYS_WRITE 1 +%define SYS_IOCTL 16 +%define SYS_EXIT 60 + +%define TCGETS 0x5401 +%define TCSETS 0x5402 + +section .data + ioctl_err_m db "ioctl error", 10, 0 + +section .bss + orig_termios resb 60 + raw_termios resb 60 + cbuf resb 4 + +section .text + global _start + +_start: + mov rax, SYS_IOCTL + mov rdi, STDIN + mov rsi, TCGETS + mov rdx, orig_termios + syscall + + test rax, rax + js ioctl_err + + mov rcx, 15 + mov rsi, orig_termios + mov rdi, raw_termios + rep movsd + + mov eax, [raw_termios + 12] + and eax, ~(2 | 8 | 1) + mov [raw_termios + 12], eax + + mov rax, SYS_IOCTL + mov rdi, STDIN + mov rsi, TCSETS + mov rdx, raw_termios + syscall + + mov rax, SYS_READ + mov rdi, STDIN + mov rsi, cbuf + mov rdx, 4 + syscall + + mov rdx, rax + mov rax, SYS_WRITE + mov rdi, STDOUT + mov rsi, cbuf + syscall + + mov rax, SYS_IOCTL + mov rdi, STDIN + mov rsi, TCSETS + mov rdx, orig_termios + syscall + + jmp exit + +ioctl_err: + args_err: + mov rax, SYS_WRITE + mov rdi, STDERR + mov rsi, ioctl_err_m + mov edx, 12 + syscall + + jmp exit_err + +exit_err: + mov rax, SYS_EXIT + mov rdi, 1 + syscall + +exit: + mov rax, SYS_EXIT + mov rdi, 0 + syscall \ No newline at end of file