diff --git a/03-asm-bios/task4.asm b/03-asm-bios/task4.asm index 2b03793..0270f84 100644 --- a/03-asm-bios/task4.asm +++ b/03-asm-bios/task4.asm @@ -79,12 +79,13 @@ print_from_buf: ; word -> void ret read_to_buf: ; none -> void. Пытается заполнить буфер из стандартного ввода - PUSH_M rax, rdi, rsi + PUSH_M rdi, rsi, rdx mov rdi, STDIN ; откуда читать (дескриптор файла) mov rsi, input_buf ; куда читать mov rdx, input_size ; Сколько пытаемся читать mov rax, 0 ; системный вызов чтения - RPOP_M rax, rdi, rsi + syscall + RPOP_M rdi, rsi, rdx ; rax содержит количество прочитанных байт, а это важно ret poll_stdin: @@ -94,6 +95,7 @@ poll_stdin: mov rdi, input_pollfd mov rsi, 1 ; одна структура данных (изначально просто вызов принимает кучу таких) mov rdx, 0 ; не ждать + syscall RPOP_M rdi, rsi, rdx ret @@ -104,19 +106,21 @@ _start: sub rsp, 16 mov rsi, input_buf - mov rdi, print_buf + mov rdi, array .read_loop: call read_to_buf ; системный вызов read вернет количество прочитаных байтов mov rcx, rax ; сколько байтов прочиталось, столько и обработаем ; обработаем информацию xor rax, rax ; обнулим на всякий пожарный jmp .read_byte + .separator_occured: - push rcx - - pop rcx - stosb + dec rcx + mov rax, [rbp - 8] + stosq mov QWORD [rbp - 8], 0 + test rcx, rcx + jz .check_buf .read_byte: ; цикл чтения lodsb @@ -127,7 +131,7 @@ _start: jg .separator_occured ASCII_TO_DIGIT al ; Если цифра, то конвертируем ее из ascii - ; Поскольку деление можно сделать только через регистр, придется извратиться + ; Поскольку умножение и деление можно сделать только через регистр, придется извратиться PUSH_M ax, rdx mov rax, [rbp - 8] mov qword [rbp - 16], 10 @@ -135,8 +139,9 @@ _start: mov [rbp - 8], rax RPOP_M ax, rdx add [rbp - 8], rax ; результат деления запишем в локальную переменную - loop .read_byte + loop .read_byte ; читаем буфер ввода до конца + .check_buf: call poll_stdin test BYTE [revents], POLLIN jnz .read_loop