extern io_get_dec, io_print_dec, io_print_char, io_newline
section .bss
arr resd 500000
section .text
global main
main:
; read n
call io_get_dec
mov esi, eax ; esi = n
; read array
mov ebx, 0 ; ebx = index
read_loop:
cmp ebx, esi
jge read_done
push ebx
push esi
call io_get_dec
pop esi
pop ebx
mov [arr + ebx*4], eax
inc ebx
jmp read_loop
read_done:
; === MINIMA ===
mov edi, 0 ; edi = count of minima
mov ebx, 1 ; ebx = index (start from 1)
count_min:
mov eax, esi
dec eax ; eax = n-1
cmp ebx, eax
jge min_done ; reached n-1, stop
; check arr[ebx] < arr[ebx-1]
mov eax, [arr + ebx*4]
cmp eax, [arr + ebx*4 - 4]
jge not_min
; check arr[ebx] < arr[ebx+1]
cmp eax, [arr + ebx*4 + 4]
jge not_min
; found minimum!
inc edi
push ebx ; save index on stack
not_min:
inc ebx
jmp count_min
min_done:
; print count
mov eax, edi
call io_print_dec
call io_newline
; print indices (they're on stack in reverse order)
mov ecx, edi ; ecx = how many to print
print_min_loop:
cmp ecx, 0
je min_print_done
pop eax ; get index
dec ecx
push ecx ; save counter
call io_print_dec
cmp ecx, 0
je no_space_after_min
mov eax, ' '
call io_print_char
no_space_after_min:
pop ecx
jmp print_min_loop
min_print_done:
call io_newline
; === MAXIMA ===
mov edi, 0 ; edi = count of maxima
mov ebx, 1 ; ebx = index
count_max:
mov eax, esi
dec eax
cmp ebx, eax
jge max_done
; check arr[ebx] > arr[ebx-1]
mov eax, [arr + ebx*4]
cmp eax, [arr + ebx*4 - 4]
jle not_max
; check arr[ebx] > arr[ebx+1]
cmp eax, [arr + ebx*4 + 4]
jle not_max
; found maximum!
inc edi
push ebx
not_max:
inc ebx
jmp count_max
max_done:
mov eax, edi
call io_print_dec
call io_newline
mov ecx, edi
print_max_loop:
cmp ecx, 0
je max_print_done
pop eax
dec ecx
push ecx
call io_print_dec
cmp ecx, 0
je no_space_after_max
mov eax, ' '
call io_print_char
no_space_after_max:
pop ecx
jmp print_max_loop
max_print_done:
call io_newline
mov eax, 0
ret