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