diff --git a/03-asm-bios/task4.asm b/03-asm-bios/task4.asm index a644e7a..c703cb1 100644 --- a/03-asm-bios/task4.asm +++ b/03-asm-bios/task4.asm @@ -12,15 +12,14 @@ section .data ; также в отдельной переменной сохраняем размер этого буфера print_buf: times 1024 db 0 buf_size equ $-print_buf - input_buf: times 1024 db 0 ; буфер, в который будет читаться символ со стандартного ввода + input_buf: times 1024 db 0 ; буфер, в который будут читаться символы со стандартного ввода input_size equ $-src ; Для poll %define POLLIN 0x001 ; Есть ли что почитать с буфера ввода. Понадобится для продолжения ввода - input_pollfd: - dd STDIN - dw POLLIN - dw 0 + input_pollfd: dd STDIN + dw POLLIN + revents: dw 0 ; возвращаемые события section .text @@ -68,19 +67,16 @@ clean_print_buf: ; none -> void ret print_from_buf: ; word -> void - PUSH_M rax, rsi, rdx, rdi ; сохраним регистры, которые точно попортим mov rdx, rdi ; сколько выводить, в rdi содержится единственный аргумент mov rsi, print_buf ; откуда выводить. Адрес буфера mov rdi, STDOUT; куда выводить. Дескриптор файла. В нашем случае стандартного вывода mov rax, 1 - RPOP_M rax, rsi, rdx, rdi syscall - RPOP_M rax, rsi, rdx, rdi ; вернем значения регистров ret -read_buf: ; none -> void. Пытается заполнить буфер из стандартного ввода +read_to_buf: ; none -> void. Пытается заполнить буфер из стандартного ввода PUSH_M rax, rdi, rsi mov rdi, STDIN ; откуда читать (дескриптор файла) mov rsi, input_buf ; куда читать @@ -89,30 +85,24 @@ read_buf: ; none -> void. Пытается заполнить буфер из с RPOP_M rax, rdi, rsi ret -;poll_stdin: -; PUSH_M rdi, rsi, rdx -; mov rsi, 1 ; следим только за одним потоком -; -; RPOP_M rdi, rsi, rdx -; ret - +poll_stdin: + PUSH_M rdi, rsi, rdx + mov rsi, 1 ; следим только за одним потоком + mov rax, 7 ; poll syscall + mov rdi, input_pollfd + mov rsi, 1 ; одна структура данных + mov rdx, 0 ; не ждать + RPOP_M rdi, rsi, rdx + ret _start: - mov rcx, src_size - mov rsi, src - mov rdi, print_buf - - xor rax, rax ; обнуляем регистр - .transfer: ; в цикле передаем данные, попутно конвертируя их в ascii - lodsb - DIGIT_TO_ASCII rax - stosb - loop .transfer + .read_loop: + call read_to_buf + ; process - mov [rdi + 1], BYTE `\n` ; Чтобы система не ругалась на отсутствие переноса - - mov rdi, src_size - call print_from_buf + call poll_stdin + test BYTE [revents], POLLIN + jnz .read_loop exit: mov rax, 60