Online Compiler Nasm

extern fopen extern fread extern fwrite extern fclose section .bss array resd 1000000 ; реально прочитано чисел n_elems resd 1 ; итоговый ответ ans_val resd 1 f_in resd 1 f_out resd 1 min_flag resd 1 max_flag resd 1 section .data ; строки для открытия входного файла file_in rb "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 rb 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_elems], 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] jge .min_false ;родитель больше правого ребенка cmp eax, [array + ebx * 4] jge .min_false ;родитель больше правого ребенка inc ebx cmp eax, [array + ebx * 4] jge .min_false ;родитель больше правого ребенка cmp eax, [array + ebx * 4] jge .min_false ;родитель больше правого ребенка inc esi .min_false: ;неубывающая xor min_flag, min_flag jmp .loop_end .max_false: ;невозрастающая xor max_flag, max_flag jmp .loop_end .loop_end: mov ans_val, 0 test min_flag, min_flag je .print_min test max_flag, max_flag je .print_max .print_min: ; неубывающая mov ans_val, 1 jmp .write_file .print_max: ; невозрастающая mov ans_val, -1 .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) Что делает код:
Программа читает массив 32-битных целых чисел из бинарного файла `input.bin`, затем проверяет, является ли этот массив **неубывающей** (каждый следующий элемент ≥ предыдущего) или **невозрастающей** (каждый следующий ≤ предыдущего) последовательностью. Результат записывается в `output.bin`: 1 — если неубывающая, -1 — если невозрастающая, 0 — если ни то, ни другое.

## 2) Подсказки:

1. **Ошибка в логике проверки кучи вместо последовательности** — вы пытаетесь проверять детей `2*i+1` и `2*i+2`, как для бинарной кучи, но по условию задачи нужно просто сравнивать соседние элементы массива: `array[i]` и `array[i+1]`. Перепутана структура данных.

2. **Путаница с метками и переходами** — после метки `.min_false` вы обнуляете флаг, но затем безусловно переходите на `.loop_end`, пропуская инкремент `esi`. Из-за этого цикл либо зависает, либо проверяет только первый элемент. Нужно пересмотреть логику переходов и расположение `inc esi`.