Подсчёт слов
This commit is contained in:
129
stepik_base/word_count/word_count.asm
Normal file
129
stepik_base/word_count/word_count.asm
Normal file
@@ -0,0 +1,129 @@
|
||||
global _start
|
||||
|
||||
section .data
|
||||
buff times 350 db 0
|
||||
buffend:
|
||||
count dq 0
|
||||
|
||||
section .text
|
||||
default rel
|
||||
|
||||
_start:
|
||||
call read_text
|
||||
|
||||
xor rax, rax
|
||||
mov rcx, [count]
|
||||
dec rcx
|
||||
|
||||
lea rsi, [buff]
|
||||
|
||||
mov r10, 1 ; просто единица
|
||||
mov r8, 0 ; прошлый символ - не пробел
|
||||
.loop:
|
||||
mov dl, [rsi]
|
||||
|
||||
cmp dl, ' '
|
||||
jne .continue ; если сейчас не пробел - выйти
|
||||
test r8, r8
|
||||
jz .continue ; если прошлое пробел - выйти
|
||||
|
||||
.space_after_word:
|
||||
inc rax
|
||||
.continue:
|
||||
mov r8, 0
|
||||
cmp dl, ' '
|
||||
cmovne r8, r10
|
||||
inc rsi
|
||||
loop .loop
|
||||
|
||||
test r8, r8
|
||||
jz .print ; если прошлое пробел - выйти
|
||||
inc rax
|
||||
.print:
|
||||
call print_num_to_buf
|
||||
mov rdx, [count]
|
||||
call write_text
|
||||
|
||||
mov rax, 60
|
||||
mov rdi, 0
|
||||
syscall
|
||||
|
||||
; Функция читает текст в буффер
|
||||
; Регистры не изменяет
|
||||
read_text:
|
||||
push rax
|
||||
push rdi
|
||||
push rsi
|
||||
push rdx
|
||||
|
||||
mov rax, 0 ; sys_read
|
||||
mov rdi, 0 ; stdin
|
||||
lea rsi, [rel buff] ; адрес буфера
|
||||
mov rdx, 256 ; количество байт
|
||||
syscall
|
||||
mov [count], rax
|
||||
|
||||
pop rdx
|
||||
pop rsi
|
||||
pop rdi
|
||||
pop rax
|
||||
ret
|
||||
|
||||
; Функция выводит buff
|
||||
; In:
|
||||
; - RSI - начало буфера
|
||||
; - RDX - размер буфера
|
||||
; Регистры не изменяет
|
||||
write_text:
|
||||
push rax
|
||||
push rdi
|
||||
push rsi
|
||||
push rdx
|
||||
|
||||
mov rax, 1 ; sys_write
|
||||
mov rdi, 1 ; stdout
|
||||
syscall
|
||||
mov [count], rax
|
||||
|
||||
pop rdx
|
||||
pop rsi
|
||||
pop rdi
|
||||
pop rax
|
||||
ret
|
||||
|
||||
|
||||
; Функция выводит число в buff
|
||||
; In: RAX
|
||||
; Out: RSI - указатель на начало строки
|
||||
print_num_to_buf:
|
||||
lea rsi, [buffend]
|
||||
dec rsi
|
||||
|
||||
mov rdi, rsi ; сохранить последний адрес
|
||||
mov byte [rsi], 0 ; вписать нуль
|
||||
dec rsi
|
||||
mov byte [rsi], 0xA ; вписать перенос строки
|
||||
dec rsi
|
||||
mov byte [rsi], '0'
|
||||
|
||||
test rax, rax
|
||||
jz .return
|
||||
|
||||
mov rcx, 10 ; десятичный делитель
|
||||
|
||||
.while:
|
||||
xor rdx, rdx
|
||||
test rax, rax
|
||||
jz .break
|
||||
div rcx
|
||||
or dl, 0x30
|
||||
mov [rsi], dl
|
||||
dec rsi
|
||||
jmp .while
|
||||
.break:
|
||||
inc rsi
|
||||
.return:
|
||||
sub rdi, rsi
|
||||
inc rdi
|
||||
mov [count], rdi
|
||||
ret
|
||||
Reference in New Issue
Block a user