diff --git a/coursework/main.asm b/coursework/main.asm index eefdd2d..b4f35cc 100644 --- a/coursework/main.asm +++ b/coursework/main.asm @@ -15,33 +15,51 @@ section .data 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 + push rbp mov rbp, rsp - mov QWORD -8[rbp], rdi - mov QWORD -16[rbp], rsi + mov -8[rbp], rdi + mov -16[rbp], rsi jmp .L2 .L6: - mov rax, QWORD -8[rbp] + mov rax, -8[rbp] movzx edx, BYTE [rax] - mov rax, QWORD -16[rbp] + mov rax, -16[rbp] movzx eax, BYTE [rax] cmp dl, al - je .L3 + je .L3 mov eax, 0 jmp .L4 .L3: add QWORD -8[rbp], 1 add QWORD -16[rbp], 1 .L2: - mov rax, QWORD -8[rbp] + mov rax, -8[rbp] movzx eax, BYTE [rax] - test al, al - je .L5 - mov rax, QWORD -16[rbp] + test al, al + je .L5 + mov rax, -16[rbp] movzx eax, BYTE [rax] - test al, al + test al, al jne .L6 .L5: mov eax, 1 @@ -50,8 +68,7 @@ namecmp: ret openfile: -.LFB7: - push rbp + push rbp mov rbp, rsp sub rsp, 32 mov -24[rbp], rdi @@ -59,185 +76,165 @@ openfile: mov esi, 0 mov rdi, rax mov eax, 0 - call open@PLT - + call open 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 rdi, 1 + mov rsi, E_open_file + mov rdx, 40 + call write mov edi, 1 - call exit@PLT + mov rax, 60 + mov rdi, 1 + syscall .L8: - mov eax, DWORD -4[rbp] + mov eax, -4[rbp] leave ret fill_buffer: - push rbp + push rbp mov rbp, rsp sub rsp, 32 - mov DWORD -20[rbp], edi - mov rdx, QWORD buffer_tail[rip] + mov -20[rbp], edi + mov rdx, 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] + mov -8[rbp], rax + mov rdx, -8[rbp] + mov eax, -20[rbp] lea rcx, buffer[rip] mov rsi, rcx mov edi, eax - call read@PLT - mov QWORD -16[rbp], rax + call read + mov -16[rbp], rax cmp QWORD -16[rbp], 1023 - ja .L11 + ja .L11 mov BYTE iseof[rip], 1 .L11: lea rdx, buffer[rip] - mov rax, QWORD -16[rbp] + mov rax, -16[rbp] add rax, rdx - mov QWORD buffer_tail[rip], rax + mov buffer_tail[rip], rax nop leave ret find_second_word: - push rbp + push rbp mov rbp, rsp - mov QWORD -8[rbp], rdi + mov -8[rbp], rdi jmp .L13 .L14: add QWORD -8[rbp], 1 .L13: - mov rax, QWORD -8[rbp] + mov rax, -8[rbp] movzx eax, BYTE [rax] cmp al, 32 jne .L14 add QWORD -8[rbp], 1 - mov rax, QWORD -8[rbp] + mov rax, -8[rbp] pop rbp ret find_fullname_end: - push rbp + push rbp mov rbp, rsp lea rax, buffer[rip] - mov QWORD -8[rbp], rax + mov -8[rbp], rax jmp .L17 .L20: add QWORD -8[rbp], 1 .L17: - mov rax, QWORD -8[rbp] + mov rax, -8[rbp] movzx eax, BYTE [rax] cmp al, 10 jne .L18 - mov rax, QWORD -8[rbp] + mov rax, -8[rbp] movzx eax, BYTE [rax] - test al, al + test al, al jne .L19 .L18: lea rax, buffer[rip+1024] - cmp QWORD -8[rbp], rax - jb .L20 + cmp -8[rbp], rax + jb .L20 .L19: lea rax, buffer[rip+1024] - cmp QWORD -8[rbp], rax + cmp -8[rbp], rax jne .L21 mov eax, 0 jmp .L22 .L21: - mov rax, QWORD -8[rbp] + mov rax, -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 - - + push rbp mov rbp, rsp sub rsp, 32 mov eax, 0 - call find_fullname_end + call find_fullname_end add rax, 1 - mov QWORD -16[rbp], rax + mov -16[rbp], rax lea rdx, buffer[rip] - mov rax, QWORD -16[rbp] + mov rax, -16[rbp] sub rax, rdx - mov QWORD -24[rbp], rax + mov -24[rbp], rax mov QWORD -8[rbp], 0 jmp .L24 .L25: - mov rdx, QWORD -16[rbp] - mov rax, QWORD -8[rbp] + mov rdx, -16[rbp] + mov rax, -8[rbp] add rax, rdx movzx eax, BYTE [rax] lea rcx, buffer[rip] - mov rdx, QWORD -8[rbp] + mov rdx, -8[rbp] add rdx, rcx mov BYTE [rdx], al - mov rdx, QWORD -16[rbp] - mov rax, QWORD -8[rbp] + 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, QWORD -24[rbp] - cmp QWORD -8[rbp], rax - jb .L25 - mov rax, QWORD buffer_tail[rip] - mov rdx, QWORD -24[rbp] + 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 QWORD buffer_tail[rip], rax + mov 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 +preprint db `count: ` +postprint db `\n` + print_count: -.LFB12: - - push rbp - - + push rbp mov rbp, rsp - sub rsp, 32 - mov QWORD -24[rbp], rdi + mov -24[rbp], rdi mov edx, 8 - lea rax, .LC1[rip] + mov rax, preprint mov rsi, rax mov edi, 1 - call write@PLT + call write jmp .L27 .L28: - mov rcx, QWORD -24[rbp] - movabs rdx, -3689348814741910323 + mov rcx, -24[rbp] + movabs rdx, -3689348814741910323 mov rax, rcx mul rdx shr rdx, 3 @@ -250,55 +247,46 @@ print_count: mov eax, edx add eax, 48 mov BYTE -1[rbp], al - mov rax, QWORD -24[rbp] - movabs rdx, -3689348814741910323 + mov rax, -24[rbp] + movabs rdx, -3689348814741910323 mul rdx mov rax, rdx shr rax, 3 - mov QWORD -24[rbp], rax + mov -24[rbp], rax lea rax, -1[rbp] mov edx, 1 mov rsi, rax mov edi, 1 - call write@PLT + call write .L27: cmp QWORD -24[rbp], 0 jne .L28 mov edx, 1 - lea rax, .LC2[rip] + mov rax, postprint mov rsi, rax mov edi, 1 - call write@PLT + call write nop leave ret -.LFE12: - .size print_count, .-print_count - .globl get_name - .type get_name, @function get_name: -.LFB13: - - push rbp - - + push rbp mov rbp, rsp - sub rsp, 40 - mov QWORD -40[rbp], rdi + mov -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 + 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, QWORD -8[rbp] + mov rax, -8[rbp] movzx eax, BYTE [rax] cmp al, 32 jne .L31 @@ -310,49 +298,43 @@ get_name: mov QWORD -16[rbp], 0 jmp .L34 .L35: - mov rdx, QWORD -24[rbp] - mov rax, QWORD -16[rbp] + mov rdx, -24[rbp] + mov rax, -16[rbp] add rax, rdx - mov rcx, QWORD -40[rbp] - mov rdx, QWORD -16[rbp] + 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, QWORD -24[rbp] - mov rax, QWORD -16[rbp] + mov rdx, -24[rbp] + mov rax, -16[rbp] add rax, rdx - cmp rax, QWORD -8[rbp] - jb .L35 + cmp rax, -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 + push rbp mov rbp, rsp sub rsp, 96 - mov DWORD -84[rbp], edi - mov QWORD -96[rbp], rsi - mov rax, QWORD -96[rbp] + mov -84[rbp], edi + mov -96[rbp], rsi + mov rax, -96[rbp] add rax, 8 - mov rax, QWORD [rax] + mov rax, [rax] mov rdi, rax - call openfile - mov DWORD -12[rbp], eax + call openfile + mov -12[rbp], eax mov edx, 64 lea rax, name[rip] mov rsi, rax mov edi, 0 - call read@PLT + call read mov QWORD -8[rbp], 0 mov QWORD -80[rbp], 0 mov QWORD -72[rbp], 0 @@ -364,32 +346,32 @@ main: mov QWORD -24[rbp], 0 .L39: mov eax, 0 - call find_fullname_end - test rax, rax + call find_fullname_end + test rax, rax jne .L37 mov eax, DWORD -12[rbp] mov edi, eax - call fill_buffer + call fill_buffer .L37: lea rax, -80[rbp] mov rdi, rax - call get_name + call get_name lea rax, -80[rbp] lea rdx, name[rip] mov rsi, rdx mov rdi, rax - call namecmp - test eax, eax - je .L38 + 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] + mov rdx, buffer_tail[rip] lea rax, buffer[rip] cmp rdx, rax jne .L39 - mov rax, QWORD -8[rbp] + mov rax, -8[rbp] mov rdi, rax call print_count mov eax, 0