468 lines
8.0 KiB
ArmAsm
468 lines
8.0 KiB
ArmAsm
.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
|