Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; Читает один символ из stdin и возвращает его. Возвращает 0 если достигнут конец потока
- read_char:
- xor rax, rax
- xor rdi, rdi
- push 0
- mov rsi, rsp
- mov rdx, 1
- syscall
- pop rax
- cmp rax, 0x0 ; код перевода строки
- jz .return_0
- ret
- .return_0:
- mov rax, 0
- ret
- ; Принимает: адрес начала буфера, размер буфера
- ; Читает в буфер слово из stdin, пропуская пробельные символы в начале, .
- ; Пробельные символы это пробел 0x20, табуляция 0x9 и перевод строки 0xA.
- ; Останавливается и возвращает 0 если слово слишком большое для буфера
- ; При успехе возвращает адрес буфера в rax, длину слова в rdx.
- ; При неудаче возвращает 0 в rax
- ; Эта функция должна дописывать к слову нуль-терминатор
- read_word:
- push r12 ; callee-saved register
- mov r9,rdi ; pointer where is the next character written to
- xor r11,r11 ; index (at the end is the length)
- mov r12,rdi
- .skip_tabs:
- push r11
- push rsi
- call read_char
- pop rsi
- pop r11
- cmp rax, 0x0 ; null
- je .end
- cmp rax, 0x20 ; пробел
- je .skip_tabs
- cmp rax, 0x9 ; табуляция
- je .skip_tabs
- cmp rax, 0xA ; перевод строки
- je .skip_tabs
- mov [r9], rax
- inc r9b ; next symbol
- inc r11 ; index (length)++
- .read_symbol:
- cmp rsi, r11 ; if (size == 0) return 0
- je .return_0
- push r11 ; caller-saved, syscall changes the value
- push rsi
- call read_char
- pop rsi
- pop r11
- cmp rax, 0x0 ; null
- je .end
- cmp rax, 0x20 ; пробел
- je .end
- cmp rax, 0x9 ; табуляция
- je .end
- cmp rax, 0xA ; перевод строки
- je .end
- mov [r9], rax
- inc r9b ; next symbol
- inc r11 ; index (length)++
- jmp .read_symbol
- .return_0:
- mov rdx, 0
- pop r12
- mov rax, 0
- ret
- .end:
- ; mov byte[r9], 0
- mov rdx, r11
- mov rax, r12
- pop r12
- ret
Add Comment
Please, Sign In to add comment