fixed nasm

This commit is contained in:
Miheev Egor
2024-12-08 19:34:29 +03:00
parent 009f4d3bda
commit 08ae2e64c9

View File

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