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