diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..36f971e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +bin/* diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..7556750 --- /dev/null +++ b/build.sh @@ -0,0 +1,16 @@ +set -ex + +echo "compiling true" +nasm -f elf64 -o tmp/true.o src/true/true.asm +ld -s --nmagic -o bin/true tmp/true.o +ls -l bin/true + +echo "compiling false" +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 diff --git a/src/cat/cat.asm b/src/cat/cat.asm new file mode 100644 index 0000000..71b9d30 --- /dev/null +++ b/src/cat/cat.asm @@ -0,0 +1,90 @@ +%define STDOUT 1 +%define STDERR 2 + +%define SYS_READ 0 +%define SYS_WRITE 1 +%define SYS_OPEN 2 +%define SYS_CLOSE 3 +%define SYS_EXIT 60 + +%define O_RDONLY 0 + +section .bss + buf resb 4096 + +section .data + file_err_m db "file error", 10, 0 + args_err_m db "args error", 10, 0 + +section .text +global _start + +_start: + ; так ну для начала надо бы понять сколько у нас аргументов + mov rbx, [rsp] + cmp rbx, 1 + je .prep_narg + cmp rbx, 2 + jne args_err + jmp .prep +.prep_narg: + xor r12, r12 + jmp .loop +.prep: + mov rax, SYS_OPEN + mov rdi, [rsp + 16]; argv[1] + mov rsi, O_RDONLY + xor rdx, rdx + syscall + js file_err + + mov r12, rax +.loop: + mov rax, SYS_READ + mov rdi, r12 + mov rsi, buf + mov rdx, 4096 + syscall + + test rax, rax + jz .done + + mov rdx, rax + mov rax, SYS_WRITE + mov rdi, STDOUT + mov rsi, buf + syscall + jmp .loop +.done: + mov rax, SYS_CLOSE + mov rdi, r12 + syscall + jmp exit + +file_err: + mov rax, SYS_WRITE + mov rdi, STDERR + mov rsi, file_err_m + mov rdx, 12 + syscall + + jmp exit_err + +args_err: + mov rax, SYS_WRITE + mov rdi, STDERR + mov rsi, args_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 diff --git a/src/false/false.asm b/src/false/false.asm new file mode 100644 index 0000000..9a63501 --- /dev/null +++ b/src/false/false.asm @@ -0,0 +1,7 @@ +section .text +global _start + +_start: + mov rax, 60 + mov rdi, 1 + syscall diff --git a/src/true/true.asm b/src/true/true.asm new file mode 100644 index 0000000..a6bfb62 --- /dev/null +++ b/src/true/true.asm @@ -0,0 +1,7 @@ +section .text +global _start + +_start: + mov rax, 60 + xor rdi, rsi + syscall diff --git a/tmp/cat.o b/tmp/cat.o new file mode 100644 index 0000000..b68b9a7 Binary files /dev/null and b/tmp/cat.o differ diff --git a/tmp/false.o b/tmp/false.o new file mode 100644 index 0000000..d4ae94f Binary files /dev/null and b/tmp/false.o differ diff --git a/tmp/true.o b/tmp/true.o new file mode 100644 index 0000000..945e55d Binary files /dev/null and b/tmp/true.o differ