diff --git a/coursework/main.asm b/coursework/main.asm new file mode 100644 index 0000000..eefdd2d --- /dev/null +++ b/coursework/main.asm @@ -0,0 +1,397 @@ +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 diff --git a/coursework/main.c b/coursework/main.c new file mode 100644 index 0000000..9ff2d09 --- /dev/null +++ b/coursework/main.c @@ -0,0 +1,134 @@ +#include +#include +#include +#include + +#define BUFF_SIZE 1024 +#define NAME_SIZE 64 +#define STDIN 0 +#define STDOUT 1 + +typedef unsigned long long u64; + +char name[NAME_SIZE]; +char buffer[BUFF_SIZE]; +char* buffer_tail = buffer; // points on first free symbol + +char iseof = 0; + +int namecmp(char* name1, char* name2) +{ + for (; *name1 && *name2; name1++, name2++) + { + if (*name1 != *name2) + { + return 0; + } + } + return 1; +} + +int openfile(char* filename) +{ + int file = open(filename, O_RDONLY); + if (file < 0) + { + puts("Something went wrong while opening file\n"); + exit(1); + } + return file; +} + +void fill_buffer(int filedesc) +{ + const size_t tofill = BUFF_SIZE - (buffer_tail - buffer); + u64 bytes_read = read(filedesc, buffer, tofill); + if (bytes_read < BUFF_SIZE) + { + iseof = 1; + } + buffer_tail = buffer + bytes_read; +} + +char* find_second_word(char* start) +{ + for (; *start != ' '; start++); + return ++start; +} + +char* find_fullname_end() +{ + char* end = buffer; + for (; (*end != '\n' || *end == 0) + && end < buffer + BUFF_SIZE; end++); + if (end == buffer + BUFF_SIZE) + { + return NULL; + } + return end; +} + +void pop_fullname() // pops from buffer +{ + char* end = find_fullname_end() + 1; + u64 fullname_len = end - buffer; + size_t i = 0; + for (; i < BUFF_SIZE - fullname_len; i++) + { + buffer[i] = end[i]; + end[i] = 0; + } + buffer_tail -= fullname_len; +} + +void print_count(u64 count) +{ + write(STDOUT, "count: ", 8); + while (count) + { + char digit = (count % 10) + '0'; + count /= 10; + write(STDOUT, &digit, 1); + } + write(STDOUT, "\n", 1); +} + +int get_name(char* accumulator) +{ + char* start = find_second_word(buffer); + char* end = start; + for (; *end != ' '; end++); + if (!end) + { + return -1; + } + for (size_t i = 0; &start[i] < end; i++) + { + accumulator[i] = start[i]; + } + return 0; +} + +int main(int argc, char* argv[]) +{ + int filedesc = openfile(argv[1]); + read(STDIN, name, sizeof(name)/sizeof(name[0])); + // fgets(name, sizeof(name)/sizeof(name[0]), stdin); + size_t count = 0; + char namebuff[NAME_SIZE] = {0, }; + do + { + if (!find_fullname_end()) + { + fill_buffer(filedesc); + } + get_name(namebuff); + if (namecmp(namebuff, name)) + { + count++; + } + pop_fullname(); + } while (buffer_tail != buffer); + print_count(count); + return 0; +} diff --git a/coursework/main.s b/coursework/main.s new file mode 100644 index 0000000..2c9587d --- /dev/null +++ b/coursework/main.s @@ -0,0 +1,467 @@ + .file "main.c" + .intel_syntax noprefix + .text + .globl name + .bss + .align 32 + .type name, @object + .size name, 64 +name: + .zero 64 + .globl buffer + .align 32 + .type buffer, @object + .size buffer, 1024 +buffer: + .zero 1024 + .globl buffer_tail + .section .data.rel.local,"aw" + .align 8 + .type buffer_tail, @object + .size buffer_tail, 8 +buffer_tail: + .quad buffer + .globl iseof + .bss + .type iseof, @object + .size iseof, 1 +iseof: + .zero 1 + .text + .globl namecmp + .type namecmp, @function +namecmp: +.LFB6: + .cfi_startproc + push rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + mov rbp, rsp + .cfi_def_cfa_register 6 + mov QWORD PTR -8[rbp], rdi + mov QWORD PTR -16[rbp], rsi + jmp .L2 +.L6: + mov rax, QWORD PTR -8[rbp] + movzx edx, BYTE PTR [rax] + mov rax, QWORD PTR -16[rbp] + movzx eax, BYTE PTR [rax] + cmp dl, al + je .L3 + mov eax, 0 + jmp .L4 +.L3: + add QWORD PTR -8[rbp], 1 + add QWORD PTR -16[rbp], 1 +.L2: + mov rax, QWORD PTR -8[rbp] + movzx eax, BYTE PTR [rax] + test al, al + je .L5 + mov rax, QWORD PTR -16[rbp] + movzx eax, BYTE PTR [rax] + test al, al + jne .L6 +.L5: + mov eax, 1 +.L4: + pop rbp + .cfi_def_cfa 7, 8 + ret + .cfi_endproc +.LFE6: + .size namecmp, .-namecmp + .section .rodata + .align 8 +.LC0: + .string "Something went wrong while opening file\n" + .text + .globl openfile + .type openfile, @function +openfile: +.LFB7: + .cfi_startproc + push rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + mov rbp, rsp + .cfi_def_cfa_register 6 + sub rsp, 32 + mov QWORD PTR -24[rbp], rdi + mov rax, QWORD PTR -24[rbp] + mov esi, 0 + mov rdi, rax + mov eax, 0 + call open@PLT + mov DWORD PTR -4[rbp], eax + cmp DWORD PTR -4[rbp], 0 + jns .L8 + lea rax, .LC0[rip] + mov rdi, rax + call puts@PLT + mov edi, 1 + call exit@PLT +.L8: + mov eax, DWORD PTR -4[rbp] + leave + .cfi_def_cfa 7, 8 + ret + .cfi_endproc +.LFE7: + .size openfile, .-openfile + .globl fill_buffer + .type fill_buffer, @function +fill_buffer: +.LFB8: + .cfi_startproc + push rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + mov rbp, rsp + .cfi_def_cfa_register 6 + sub rsp, 32 + mov DWORD PTR -20[rbp], edi + mov rdx, QWORD PTR buffer_tail[rip] + lea rax, buffer[rip] + sub rdx, rax + mov eax, 1024 + sub rax, rdx + mov QWORD PTR -8[rbp], rax + mov rdx, QWORD PTR -8[rbp] + mov eax, DWORD PTR -20[rbp] + lea rcx, buffer[rip] + mov rsi, rcx + mov edi, eax + call read@PLT + mov QWORD PTR -16[rbp], rax + cmp QWORD PTR -16[rbp], 1023 + ja .L11 + mov BYTE PTR iseof[rip], 1 +.L11: + lea rdx, buffer[rip] + mov rax, QWORD PTR -16[rbp] + add rax, rdx + mov QWORD PTR buffer_tail[rip], rax + nop + leave + .cfi_def_cfa 7, 8 + ret + .cfi_endproc +.LFE8: + .size fill_buffer, .-fill_buffer + .globl find_second_word + .type find_second_word, @function +find_second_word: +.LFB9: + .cfi_startproc + push rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + mov rbp, rsp + .cfi_def_cfa_register 6 + mov QWORD PTR -8[rbp], rdi + jmp .L13 +.L14: + add QWORD PTR -8[rbp], 1 +.L13: + mov rax, QWORD PTR -8[rbp] + movzx eax, BYTE PTR [rax] + cmp al, 32 + jne .L14 + add QWORD PTR -8[rbp], 1 + mov rax, QWORD PTR -8[rbp] + pop rbp + .cfi_def_cfa 7, 8 + ret + .cfi_endproc +.LFE9: + .size find_second_word, .-find_second_word + .globl find_fullname_end + .type find_fullname_end, @function +find_fullname_end: +.LFB10: + .cfi_startproc + push rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + mov rbp, rsp + .cfi_def_cfa_register 6 + lea rax, buffer[rip] + mov QWORD PTR -8[rbp], rax + jmp .L17 +.L20: + add QWORD PTR -8[rbp], 1 +.L17: + mov rax, QWORD PTR -8[rbp] + movzx eax, BYTE PTR [rax] + cmp al, 10 + jne .L18 + mov rax, QWORD PTR -8[rbp] + movzx eax, BYTE PTR [rax] + test al, al + jne .L19 +.L18: + lea rax, buffer[rip+1024] + cmp QWORD PTR -8[rbp], rax + jb .L20 +.L19: + lea rax, buffer[rip+1024] + cmp QWORD PTR -8[rbp], rax + jne .L21 + mov eax, 0 + jmp .L22 +.L21: + mov rax, QWORD PTR -8[rbp] +.L22: + pop rbp + .cfi_def_cfa 7, 8 + ret + .cfi_endproc +.LFE10: + .size find_fullname_end, .-find_fullname_end + .globl pop_fullname + .type pop_fullname, @function +pop_fullname: +.LFB11: + .cfi_startproc + push rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + mov rbp, rsp + .cfi_def_cfa_register 6 + sub rsp, 32 + mov eax, 0 + call find_fullname_end + add rax, 1 + mov QWORD PTR -16[rbp], rax + lea rdx, buffer[rip] + mov rax, QWORD PTR -16[rbp] + sub rax, rdx + mov QWORD PTR -24[rbp], rax + mov QWORD PTR -8[rbp], 0 + jmp .L24 +.L25: + mov rdx, QWORD PTR -16[rbp] + mov rax, QWORD PTR -8[rbp] + add rax, rdx + movzx eax, BYTE PTR [rax] + lea rcx, buffer[rip] + mov rdx, QWORD PTR -8[rbp] + add rdx, rcx + mov BYTE PTR [rdx], al + mov rdx, QWORD PTR -16[rbp] + mov rax, QWORD PTR -8[rbp] + add rax, rdx + mov BYTE PTR [rax], 0 + add QWORD PTR -8[rbp], 1 +.L24: + mov eax, 1024 + sub rax, QWORD PTR -24[rbp] + cmp QWORD PTR -8[rbp], rax + jb .L25 + mov rax, QWORD PTR buffer_tail[rip] + mov rdx, QWORD PTR -24[rbp] + neg rdx + add rax, rdx + mov QWORD PTR buffer_tail[rip], rax + nop + leave + .cfi_def_cfa 7, 8 + ret + .cfi_endproc +.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: + .cfi_startproc + push rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + mov rbp, rsp + .cfi_def_cfa_register 6 + sub rsp, 32 + mov QWORD PTR -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 PTR -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 PTR -1[rbp], al + mov rax, QWORD PTR -24[rbp] + movabs rdx, -3689348814741910323 + mul rdx + mov rax, rdx + shr rax, 3 + mov QWORD PTR -24[rbp], rax + lea rax, -1[rbp] + mov edx, 1 + mov rsi, rax + mov edi, 1 + call write@PLT +.L27: + cmp QWORD PTR -24[rbp], 0 + jne .L28 + mov edx, 1 + lea rax, .LC2[rip] + mov rsi, rax + mov edi, 1 + call write@PLT + nop + leave + .cfi_def_cfa 7, 8 + ret + .cfi_endproc +.LFE12: + .size print_count, .-print_count + .globl get_name + .type get_name, @function +get_name: +.LFB13: + .cfi_startproc + push rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + mov rbp, rsp + .cfi_def_cfa_register 6 + sub rsp, 40 + mov QWORD PTR -40[rbp], rdi + lea rax, buffer[rip] + mov rdi, rax + call find_second_word + mov QWORD PTR -24[rbp], rax + mov rax, QWORD PTR -24[rbp] + mov QWORD PTR -8[rbp], rax + jmp .L30 +.L31: + add QWORD PTR -8[rbp], 1 +.L30: + mov rax, QWORD PTR -8[rbp] + movzx eax, BYTE PTR [rax] + cmp al, 32 + jne .L31 + cmp QWORD PTR -8[rbp], 0 + jne .L32 + mov eax, -1 + jmp .L33 +.L32: + mov QWORD PTR -16[rbp], 0 + jmp .L34 +.L35: + mov rdx, QWORD PTR -24[rbp] + mov rax, QWORD PTR -16[rbp] + add rax, rdx + mov rcx, QWORD PTR -40[rbp] + mov rdx, QWORD PTR -16[rbp] + add rdx, rcx + movzx eax, BYTE PTR [rax] + mov BYTE PTR [rdx], al + add QWORD PTR -16[rbp], 1 +.L34: + mov rdx, QWORD PTR -24[rbp] + mov rax, QWORD PTR -16[rbp] + add rax, rdx + cmp rax, QWORD PTR -8[rbp] + jb .L35 + mov eax, 0 +.L33: + leave + .cfi_def_cfa 7, 8 + ret + .cfi_endproc +.LFE13: + .size get_name, .-get_name + .globl main + .type main, @function +main: +.LFB14: + .cfi_startproc + push rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + mov rbp, rsp + .cfi_def_cfa_register 6 + sub rsp, 96 + mov DWORD PTR -84[rbp], edi + mov QWORD PTR -96[rbp], rsi + mov rax, QWORD PTR -96[rbp] + add rax, 8 + mov rax, QWORD PTR [rax] + mov rdi, rax + call openfile + mov DWORD PTR -12[rbp], eax + mov edx, 64 + lea rax, name[rip] + mov rsi, rax + mov edi, 0 + call read@PLT + mov QWORD PTR -8[rbp], 0 + mov QWORD PTR -80[rbp], 0 + mov QWORD PTR -72[rbp], 0 + mov QWORD PTR -64[rbp], 0 + mov QWORD PTR -56[rbp], 0 + mov QWORD PTR -48[rbp], 0 + mov QWORD PTR -40[rbp], 0 + mov QWORD PTR -32[rbp], 0 + mov QWORD PTR -24[rbp], 0 +.L39: + mov eax, 0 + call find_fullname_end + test rax, rax + jne .L37 + mov eax, DWORD PTR -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 PTR -8[rbp], 1 +.L38: + mov eax, 0 + call pop_fullname + mov rdx, QWORD PTR buffer_tail[rip] + lea rax, buffer[rip] + cmp rdx, rax + jne .L39 + mov rax, QWORD PTR -8[rbp] + mov rdi, rax + call print_count + mov eax, 0 + leave + .cfi_def_cfa 7, 8 + ret + .cfi_endproc +.LFE14: + .size main, .-main + .ident "GCC: (Debian 14.2.0-6) 14.2.0" + .section .note.GNU-stack,"",@progbits