global _start %define NAME_SIZE 64 %define BUFF_SIZE 1024 section .bss name resb NAME_SIZE buffer resb BUFF_SIZE section .data buffer_tail dq buffer iseof db 0 ;strings E_open_file db `Something went wrong while opening file\n` section .text read: push rcx push r11 mov rax, 0 syscall pop r11 pop rcx ret write: push rcx push r11 mov rax, 1 syscall pop r11 pop rcx ret namecmp: .LFB6: push rbp mov rbp, rsp mov -8[rbp], rdi mov -16[rbp], rsi jmp .L2 .L6: mov rax, -8[rbp] movzx edx, BYTE [rax] mov rax, -16[rbp] movzx eax, BYTE [rax] cmp dl, al je .L3 mov eax, 0 jmp .L4 .L3: add QWORD -8[rbp], 1 add QWORD -16[rbp], 1 .L2: mov rax, -8[rbp] movzx eax, BYTE [rax] test al, al je .L5 mov rax, -16[rbp] movzx eax, BYTE [rax] test al, al jne .L6 .L5: mov eax, 1 .L4: pop rbp ret openfile: push rbp mov rbp, rsp sub rsp, 32 mov -24[rbp], rdi mov rax, -24[rbp] mov esi, 0 mov rdi, rax mov eax, 0 call open mov -4[rbp], eax cmp -4[rbp], 0 jns .L8 mov rdi, 1 mov rsi, E_open_file mov rdx, 40 call write mov edi, 1 mov rax, 60 mov rdi, 1 syscall .L8: mov eax, -4[rbp] leave ret fill_buffer: push rbp mov rbp, rsp sub rsp, 32 mov -20[rbp], edi mov rdx, buffer_tail[rip] lea rax, buffer[rip] sub rdx, rax mov eax, 1024 sub rax, rdx mov -8[rbp], rax mov rdx, -8[rbp] mov eax, -20[rbp] lea rcx, buffer[rip] mov rsi, rcx mov edi, eax call read mov -16[rbp], rax cmp QWORD -16[rbp], 1023 ja .L11 mov BYTE iseof[rip], 1 .L11: lea rdx, buffer[rip] mov rax, -16[rbp] add rax, rdx mov buffer_tail[rip], rax nop leave ret find_second_word: push rbp mov rbp, rsp mov -8[rbp], rdi jmp .L13 .L14: add QWORD -8[rbp], 1 .L13: mov rax, -8[rbp] movzx eax, BYTE [rax] cmp al, 32 jne .L14 add QWORD -8[rbp], 1 mov rax, -8[rbp] pop rbp ret find_fullname_end: push rbp mov rbp, rsp lea rax, buffer[rip] mov -8[rbp], rax jmp .L17 .L20: add QWORD -8[rbp], 1 .L17: mov rax, -8[rbp] movzx eax, BYTE [rax] cmp al, 10 jne .L18 mov rax, -8[rbp] movzx eax, BYTE [rax] test al, al jne .L19 .L18: lea rax, buffer[rip+1024] cmp -8[rbp], rax jb .L20 .L19: lea rax, buffer[rip+1024] cmp -8[rbp], rax jne .L21 mov eax, 0 jmp .L22 .L21: mov rax, -8[rbp] .L22: pop rbp ret pop_fullname: push rbp mov rbp, rsp sub rsp, 32 mov eax, 0 call find_fullname_end add rax, 1 mov -16[rbp], rax lea rdx, buffer[rip] mov rax, -16[rbp] sub rax, rdx mov -24[rbp], rax mov QWORD -8[rbp], 0 jmp .L24 .L25: mov rdx, -16[rbp] mov rax, -8[rbp] add rax, rdx movzx eax, BYTE [rax] lea rcx, buffer[rip] mov rdx, -8[rbp] add rdx, rcx mov BYTE [rdx], al mov rdx, -16[rbp] mov rax, -8[rbp] add rax, rdx mov BYTE [rax], 0 add QWORD -8[rbp], 1 .L24: mov eax, 1024 sub rax, -24[rbp] cmp -8[rbp], rax jb .L25 mov rax, buffer_tail[rip] mov rdx, -24[rbp] neg rdx add rax, rdx mov buffer_tail[rip], rax nop leave ret preprint db `count: ` postprint db `\n` print_count: push rbp mov rbp, rsp sub rsp, 32 mov -24[rbp], rdi mov edx, 8 mov rax, preprint mov rsi, rax mov edi, 1 call write jmp .L27 .L28: mov rcx, -24[rbp] movabs rdx, -3689348814741910323 mov rax, rcx mul rdx shr rdx, 3 mov rax, rdx sal rax, 2 add rax, rdx add rax, rax sub rcx, rax mov rdx, rcx mov eax, edx add eax, 48 mov BYTE -1[rbp], al mov rax, -24[rbp] movabs rdx, -3689348814741910323 mul rdx mov rax, rdx shr rax, 3 mov -24[rbp], rax lea rax, -1[rbp] mov edx, 1 mov rsi, rax mov edi, 1 call write .L27: cmp QWORD -24[rbp], 0 jne .L28 mov edx, 1 mov rax, postprint mov rsi, rax mov edi, 1 call write nop leave ret get_name: push rbp mov rbp, rsp sub rsp, 40 mov -40[rbp], rdi lea rax, buffer[rip] mov rdi, rax call find_second_word mov -24[rbp], rax mov rax, -24[rbp] mov -8[rbp], rax jmp .L30 .L31: add QWORD -8[rbp], 1 .L30: mov rax, -8[rbp] movzx eax, BYTE [rax] cmp al, 32 jne .L31 cmp QWORD -8[rbp], 0 jne .L32 mov eax, -1 jmp .L33 .L32: mov QWORD -16[rbp], 0 jmp .L34 .L35: mov rdx, -24[rbp] mov rax, -16[rbp] add rax, rdx mov rcx, -40[rbp] mov rdx, -16[rbp] add rdx, rcx movzx eax, BYTE [rax] mov BYTE [rdx], al add QWORD -16[rbp], 1 .L34: mov rdx, -24[rbp] mov rax, -16[rbp] add rax, rdx cmp rax, -8[rbp] jb .L35 mov eax, 0 .L33: leave ret main: push rbp mov rbp, rsp sub rsp, 96 mov -84[rbp], edi mov -96[rbp], rsi mov rax, -96[rbp] add rax, 8 mov rax, [rax] mov rdi, rax call openfile mov -12[rbp], eax mov edx, 64 lea rax, name[rip] mov rsi, rax mov edi, 0 call read mov QWORD -8[rbp], 0 mov QWORD -80[rbp], 0 mov QWORD -72[rbp], 0 mov QWORD -64[rbp], 0 mov QWORD -56[rbp], 0 mov QWORD -48[rbp], 0 mov QWORD -40[rbp], 0 mov QWORD -32[rbp], 0 mov QWORD -24[rbp], 0 .L39: mov eax, 0 call find_fullname_end test rax, rax jne .L37 mov eax, DWORD -12[rbp] mov edi, eax call fill_buffer .L37: lea rax, -80[rbp] mov rdi, rax call get_name lea rax, -80[rbp] lea rdx, name[rip] mov rsi, rdx mov rdi, rax call namecmp test eax, eax je .L38 add QWORD -8[rbp], 1 .L38: mov eax, 0 call pop_fullname mov rdx, buffer_tail[rip] lea rax, buffer[rip] cmp rdx, rax jne .L39 mov rax, -8[rbp] mov rdi, rax call print_count mov eax, 0 leave ret