extern io_get_dec, io_get_udec, io_print_dec, io_print_char, io_newline
section .bss
array resd 500000 ; Исходная последовательность
mins resd 500000 ; Индексы локальных минимумов
maxs resd 500000 ; Индексы локальных максимумов
section .text
global main
main:
push ebp
mov ebp, esp
; Сохраняем callee-saved регистры
push ebx
push edi
push esi
; 1. Читаем N
call io_get_udec
mov ebx, eax ; ebx = N
; Если элементов меньше 3, локальных экстремумов быть не может
cmp ebx, 3
jl skip_logic
; 2. Заполняем массив
xor ecx, ecx
read_loop:
cmp ecx, ebx
je find_extrema
push ecx ; Защищаем ecx от изменений внутри функций ввода
call io_get_dec
pop ecx
mov [array + ecx * 4], eax
inc ecx
jmp read_loop
find_extrema:
xor edi, edi ; edi = m (счетчик минимумов)
xor esi, esi ; esi = M (счетчик максимумов)
mov ecx, 1 ; Начинаем с индекса 1
mov edx, ebx
dec edx ; Граница цикла N-1
process_loop:
cmp ecx, edx
jge print_results
mov eax, [array + ecx * 4] ; Текущий элемент A[i]
; Проверка на минимум: A[i-1] > A[i] < A[i+1]
mov ebp, [array + ecx * 4 - 4] ; A[i-1]
cmp ebp, eax
jle check_max ; Если A[i-1] <= A[i], не минимум
mov ebp, [array + ecx * 4 + 4] ; A[i+1]
cmp ebp, eax
jle check_max ; Если A[i+1] <= A[i], не минимум
mov [mins + edi * 4], ecx
inc edi
jmp next_iter
check_max:
; Проверка на максимум: A[i-1] < A[i] > A[i+1]
mov ebp, [array + ecx * 4 - 4] ; A[i-1]
cmp ebp, eax
jge next_iter ; Если A[i-1] >= A[i], не максимум
mov ebp, [array + ecx * 4 + 4] ; A[i+1]
cmp ebp, eax
jge next_iter ; Если A[i+1] >= A[i], не максимум
mov [maxs + esi * 4], ecx
inc esi
next_iter:
inc ecx
jmp process_loop
print_results:
; --- Вывод МИНИМУМОВ ---
mov eax, edi
call io_print_dec ; Выводим количество m
call io_newline
xor ecx, ecx
print_mins_idx:
cmp ecx, edi
je print_maxima_start
push ecx ; Защищаем индекс от io_print_...
mov eax, [mins + ecx * 4]
call io_print_dec
mov eax, ' '
call io_print_char
pop ecx
inc ecx
jmp print_mins_idx
print_maxima_start:
call io_newline
; --- Вывод МАКСИМУМОВ ---
mov eax, esi
call io_print_dec ; Выводим количество M
call io_newline
xor ecx, ecx
print_maxs_idx:
cmp ecx, esi
je end_prog
push ecx
mov eax, [maxs + ecx * 4]
call io_print_dec
mov eax, ' '
call io_print_char
pop ecx
inc ecx
jmp print_maxs_idx
jmp end_prog
skip_logic:
mov eax, 0
call io_print_dec
call io_newline
mov eax, 0
call io_print_dec
end_prog:
call io_newline
; Восстанавливаем состояние стека и регистров
pop esi
pop edi
pop ebx
pop ebp
xor eax, eax
ret