Online Compiler Nasm

extern fopen extern fread extern fwrite extern fclose section .bss array resd 1000000 ; реально прочитано чисел n_elements resd 1 ; итоговый ответ ans_val resd 1 file_ptr resd 1 min_flag resd 1 max_flag resd 1 section .data ; строки для открытия входного файла file_in db "input.bin", 0 mode_r db "rb", 0 ; строки для открытия выходного файла file_out db "output.bin", 0 mode_w db "wb", 0 section .text global main main: ; выравнивание стека push ebp mov ebp, esp and esp, -16 ; fopen("input.bin", "rb") sub esp, 8 push mode_r push file_in call fopen mov [file_ptr], eax ; fread(array, 4, 1000000, file_ptr) ; стек уже выровнен, кладем 4 аргумента = 16 байт push dword [file_ptr] ; аргумент 4 файл push 1000000 ; аргумент 3 макс колво push 4 ; аргумент 2 размер 1 элемента push array ; аргумент 1 куда писать call fread add esp, 16 mov [n_elements], eax ; сколько реально прочитано чисел ; fclose(file_ptr) sub esp, 12 push dword [file_ptr] call fclose add esp, 16 mov dword [min_flag], 1 mov dword [max_flag], 1 mov esi, 0 ; счетчик i (0..n-1) mov ecx, [n_elements] ; ecx - размер массива n .loop_start: cmp esi, ecx jge .loop_end ; i >= n выходим из цикла ;выходим если 2 флага стали нулями mov eax, dword [min_flag] or eax, dword [max_flag] jz .loop_end ; проверка левого ребенка 2*i+1 mov ebx, esi shl ebx, 1 inc ebx cmp ebx, [n_elements] ;если ebx >= n jge .loop_end mov eax, [array + esi * 4] cmp eax, [array + ebx * 4] call .min_false ;родитель больше правого ребенка cmp eax, [array + ebx * 4] call .min_false ;родитель больше правого ребенка inc ebx cmp eax, [array + ebx * 4] call .min_false ;родитель больше правого ребенка cmp eax, [array + ebx * 4] call .min_false ;родитель больше правого ребенка inc esi .min_false: ;неубывающая mov [min_flag], 0 ret .max_false: ;невозрастающая mov [max_flag], 0 ret .loop_end: cmp [min_flag], 0 je .print_min cmp [max_flag], 0 je .print_max .print_min: ; неубывающая mov [ans_val], 1 jmp .write_file .print_max: ; невозрастающая mov [ans_val], -1 jmp .write_file .write_file: ; fopen("output.txt", "wb") sub esp, 8 push mode_w push file_out call fopen add esp, 16 mov [file_ptr], eax ; fwrite(ans_val, 4, 1, file_ptr) push file_ptr push 1 push 4 push ans_val call fwrite add esp, 16 ; fclose(file_ptr) sub esp, 12 push dword [file_ptr] call fclose add esp, 16 xor eax, eax mov esp, ebp pop ebp ret
Вот разбор твоего кода:

1) **Что делает код:**
Программа читает из бинарного файла `input.bin` массив 32-битных целых чисел (до 1 000 000 элементов), затем проверяет, является ли этот массив **неубывающей** (каждый следующий ≥ предыдущего) или **невозрастающей** (каждый следующий ≤ предыдущего) последовательностью. Результат записывается в `output.bin`: 1 — если неубывающая, -1 — если невозрастающая. Если ни то, ни другое — ответ не определён (логическая ошибка в коде).

2) **Конкретные подсказки:**
- **Ошибка в логике проверки кучи:** Ты пытаешься проверять свойство «кучи» (min-heap / max-heap), а не просто монотонность массива. Для проверки неубывания/невозрастания нужно сравнивать **соседние элементы** (`array[i]` и `array[i+1]`), а не родителя с двумя детьми (2i+1, 2i+2). Твой код проверяет, является ли массив **пирамидой** (heap), а не просто отсортированным.
- **Проблема с вызовами `.min_false`:** Ты используешь `call .min_false` как подпрограмму, но после `ret` управление возвращается не туда, куда нужно — это приведёт к хаотичному выполнению. Для условного сброса флага лучше использовать `jz` или `jmp` после сравнения, а не `call`.