Files
solutions/coursework/main.asm
Miheev Egor 08ae2e64c9 fixed nasm
2024-12-08 19:34:29 +03:00

380 lines
5.5 KiB
NASM

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