Files
coproutils/src/cat/cat.asm
T
2026-05-05 16:18:10 +03:00

91 lines
1.3 KiB
NASM

%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