labs/03 #3

Merged
mrqiz merged 10 commits from labs/03 into main 2024-10-02 20:13:05 +03:00
3 changed files with 247 additions and 0 deletions
Showing only changes of commit ed21dfe07a - Show all commits

View File

@ -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