labs/03 #3
@ -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
|
||||
.separator_occured:
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user