%define STDIN 0 %define STDOUT 1 %define STDERR 2 %define SYS_READ 0 %define SYS_WRITE 1 %define SYS_OPEN 2 %define SYS_LSEEK 8 %define SYS_MMAP 9 %define SYS_IOCTL 16 %define SYS_MREMAP 25 %define SYS_EXIT 60 %define TCGETS 0x5401 %define TCSETS 0x5402 %define CTRL_S 0x13 %define CTRL_X 0x18 %define O_RDWR 2 %define O_CREAT 0x40 %define SEEK_END 2 %DEFINE FREAD_BUF 4096 section .data ioctl_err_m db "ioctl error", 10, 0 args_err_m db "args error", 10, 0 fopen_err_m db "file open error", 10, 0 section .bss orig_termios resb 60 raw_termios resb 60 cbuf resb 4 rbuf resb FREAD_BUF fd resd 1 ; файловый дескриптор size resq 1 ; размер исходного файла cur_size resq 1 ; текущий размер файла bsize resq 1 ; размер выделяемой области pos resq 1 ; позиция в файле buf resq 1 ; указатель на выделяемую память 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 + 0] and eax, ~0x400 ; IXON mov [raw_termios + 0], eax mov eax, [raw_termios + 12] and eax, ~(2 | 8 | 1) ; ICANON | ECHO | ISIG mov [raw_termios + 12], eax ; переходим в raw mode mov rax, SYS_IOCTL mov rdi, STDIN mov rsi, TCSETS mov rdx, raw_termios syscall ; ищем название файла в аргументах mov rbx, [rsp] cmp rbx, 2 jne args_err mov rax, SYS_OPEN mov rdi, [rsp + 16] mov rsi, O_RDWR | O_CREAT mov rdx, 0q0700 syscall test rax, rax js fopen_err mov qword [rel fd], rax ; в идеале кншн файловый дескриптор сделать 32 битным но эээ лень mov rax, SYS_LSEEK mov rdi, qword [rel fd] mov rsi, 0 mov rdx, SEEK_END ; меня так прикалывает тот факт, что этот код будут читать ток под пивом (и то если будут) syscall ; а еще просто прекрасно кодить это под pastel ghost mov qword [rel bsize], rax shl qword [rel bsize], 1 mov qword [rel size], rax mov qword [rel pos], rax cmp rax, 0 je .read_loop mov rax, SYS_LSEEK mov rdi, qword [rel fd] mov rsi, 0 mov rdx, 0 syscall mov rax, SYS_MMAP xor rdi, rdi mov rsi, qword [rel bsize] mov rdx, 0x3 ; PROT_READ|PROT_WRITE mov r10, 0x22 ; MAP_PRIVATE | MAP_ANONYMOUS mov r8, -1 mov r9, 0 syscall mov [buf], rax .fread_loop: ; спиздил с rd но кому не похуй mov rax, SYS_READ mov rdi, qword [fd] mov rsi, rbuf mov rdx, FREAD_BUF syscall test rax, rax jz .read_loop mov r8, rax mov rdx, r8 mov rax, SYS_WRITE mov rsi, rbuf mov rdi, [buf] syscall jmp .fread_loop .read_loop: 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 cmp byte [rel cbuf], CTRL_X je .done cmp byte [rel cbuf], CTRL_S je .save jmp .read_loop .save: .done: jmp exit args_err: mov rax, SYS_WRITE mov rdi, STDERR mov rsi, args_err_m mov edx, 12 syscall jmp exit_err fopen_err: mov rax, SYS_WRITE mov rdi, STDERR mov rsi, fopen_err_m mov edx, 17 syscall jmp exit_err ioctl_err: mov rax, SYS_WRITE mov rdi, STDERR mov rsi, ioctl_err_m mov edx, 13 syscall jmp exit_err exit_err: mov rax, SYS_IOCTL mov rdi, STDIN mov rsi, TCSETS mov rdx, orig_termios syscall mov rax, SYS_EXIT mov rdi, 1 syscall exit: mov rax, SYS_IOCTL mov rdi, STDIN mov rsi, TCSETS mov rdx, orig_termios syscall mov rax, SYS_EXIT mov rdi, 0 syscall