%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