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 namecmp: .LFB6: push rbp mov rbp, rsp mov QWORD -8[rbp], rdi mov QWORD -16[rbp], rsi jmp .L2 .L6: mov rax, QWORD -8[rbp] movzx edx, BYTE [rax] mov rax, QWORD -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, QWORD -8[rbp] movzx eax, BYTE [rax] test al, al je .L5 mov rax, QWORD -16[rbp] movzx eax, BYTE [rax] test al, al jne .L6 .L5: mov eax, 1 .L4: pop rbp ret openfile: .LFB7: 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@PLT mov -4[rbp], eax cmp -4[rbp], 0 jns .L8 ;lea rax, .LC0[rip] mov rax, E_open_file mov rdi, rax call puts@PLT mov edi, 1 call exit@PLT .L8: mov eax, DWORD -4[rbp] leave ret fill_buffer: push rbp mov rbp, rsp sub rsp, 32 mov DWORD -20[rbp], edi mov rdx, QWORD buffer_tail[rip] lea rax, buffer[rip] sub rdx, rax mov eax, 1024 sub rax, rdx mov QWORD -8[rbp], rax mov rdx, QWORD -8[rbp] mov eax, DWORD -20[rbp] lea rcx, buffer[rip] mov rsi, rcx mov edi, eax call read@PLT mov QWORD -16[rbp], rax cmp QWORD -16[rbp], 1023 ja .L11 mov BYTE iseof[rip], 1 .L11: lea rdx, buffer[rip] mov rax, QWORD -16[rbp] add rax, rdx mov QWORD buffer_tail[rip], rax nop leave ret find_second_word: push rbp mov rbp, rsp mov QWORD -8[rbp], rdi jmp .L13 .L14: add QWORD -8[rbp], 1 .L13: mov rax, QWORD -8[rbp] movzx eax, BYTE [rax] cmp al, 32 jne .L14 add QWORD -8[rbp], 1 mov rax, QWORD -8[rbp] pop rbp ret find_fullname_end: push rbp mov rbp, rsp lea rax, buffer[rip] mov QWORD -8[rbp], rax jmp .L17 .L20: add QWORD -8[rbp], 1 .L17: mov rax, QWORD -8[rbp] movzx eax, BYTE [rax] cmp al, 10 jne .L18 mov rax, QWORD -8[rbp] movzx eax, BYTE [rax] test al, al jne .L19 .L18: lea rax, buffer[rip+1024] cmp QWORD -8[rbp], rax jb .L20 .L19: lea rax, buffer[rip+1024] cmp QWORD -8[rbp], rax jne .L21 mov eax, 0 jmp .L22 .L21: mov rax, QWORD -8[rbp] .L22: pop rbp ret .LFE10: .size find_fullname_end, .-find_fullname_end .globl pop_fullname .type pop_fullname, @function pop_fullname: .LFB11: push rbp mov rbp, rsp sub rsp, 32 mov eax, 0 call find_fullname_end add rax, 1 mov QWORD -16[rbp], rax lea rdx, buffer[rip] mov rax, QWORD -16[rbp] sub rax, rdx mov QWORD -24[rbp], rax mov QWORD -8[rbp], 0 jmp .L24 .L25: mov rdx, QWORD -16[rbp] mov rax, QWORD -8[rbp] add rax, rdx movzx eax, BYTE [rax] lea rcx, buffer[rip] mov rdx, QWORD -8[rbp] add rdx, rcx mov BYTE [rdx], al mov rdx, QWORD -16[rbp] mov rax, QWORD -8[rbp] add rax, rdx mov BYTE [rax], 0 add QWORD -8[rbp], 1 .L24: mov eax, 1024 sub rax, QWORD -24[rbp] cmp QWORD -8[rbp], rax jb .L25 mov rax, QWORD buffer_tail[rip] mov rdx, QWORD -24[rbp] neg rdx add rax, rdx mov QWORD buffer_tail[rip], rax nop leave ret .LFE11: .size pop_fullname, .-pop_fullname .section .rodata .LC1: .string "count: " .LC2: .string "\n" .text .globl print_count .type print_count, @function print_count: .LFB12: push rbp mov rbp, rsp sub rsp, 32 mov QWORD -24[rbp], rdi mov edx, 8 lea rax, .LC1[rip] mov rsi, rax mov edi, 1 call write@PLT jmp .L27 .L28: mov rcx, QWORD -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, QWORD -24[rbp] movabs rdx, -3689348814741910323 mul rdx mov rax, rdx shr rax, 3 mov QWORD -24[rbp], rax lea rax, -1[rbp] mov edx, 1 mov rsi, rax mov edi, 1 call write@PLT .L27: cmp QWORD -24[rbp], 0 jne .L28 mov edx, 1 lea rax, .LC2[rip] mov rsi, rax mov edi, 1 call write@PLT nop leave ret .LFE12: .size print_count, .-print_count .globl get_name .type get_name, @function get_name: .LFB13: push rbp mov rbp, rsp sub rsp, 40 mov QWORD -40[rbp], rdi lea rax, buffer[rip] mov rdi, rax call find_second_word mov QWORD -24[rbp], rax mov rax, QWORD -24[rbp] mov QWORD -8[rbp], rax jmp .L30 .L31: add QWORD -8[rbp], 1 .L30: mov rax, QWORD -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, QWORD -24[rbp] mov rax, QWORD -16[rbp] add rax, rdx mov rcx, QWORD -40[rbp] mov rdx, QWORD -16[rbp] add rdx, rcx movzx eax, BYTE [rax] mov BYTE [rdx], al add QWORD -16[rbp], 1 .L34: mov rdx, QWORD -24[rbp] mov rax, QWORD -16[rbp] add rax, rdx cmp rax, QWORD -8[rbp] jb .L35 mov eax, 0 .L33: leave ret .LFE13: .size get_name, .-get_name .globl main .type main, @function main: .LFB14: push rbp mov rbp, rsp sub rsp, 96 mov DWORD -84[rbp], edi mov QWORD -96[rbp], rsi mov rax, QWORD -96[rbp] add rax, 8 mov rax, QWORD [rax] mov rdi, rax call openfile mov DWORD -12[rbp], eax mov edx, 64 lea rax, name[rip] mov rsi, rax mov edi, 0 call read@PLT 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, QWORD buffer_tail[rip] lea rax, buffer[rip] cmp rdx, rax jne .L39 mov rax, QWORD -8[rbp] mov rdi, rax call print_count mov eax, 0 leave ret