91 lines
1.3 KiB
NASM
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
|