feat: mvp
This commit is contained in:
397
coursework/main.asm
Normal file
397
coursework/main.asm
Normal file
@ -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
|
||||
Reference in New Issue
Block a user