Online Compiler Nasm

extern fopen, fread, fwrite, fclose section .data input_name db "input.bin", 0 output_name db "output.bin", 0 mode_read db "rb", 0 mode_write db "wb", 0 section .bss buffer resb 4194304 result resd 1 file resd 1 count resd 1 parents_count resd 1 section .text global main main: push ebp mov ebp, esp push ebx push esi push edi and esp, -16 sub esp, 16 mov dword [esp], input_name mov dword [esp+4], mode_read call fopen add esp, 16 mov [file], eax sub esp, 16 mov dword [esp], buffer mov dword [esp+4], 1 mov dword [esp+8], 4194304 mov eax, [file] mov [esp+12], eax call fread add esp, 16 shr eax, 2 mov [count], eax sub esp, 16 mov eax, [file] mov [esp], eax call fclose add esp, 16 mov eax, [count] shr eax, 1 mov [parents_count], eax xor ecx, ecx check_min_loop: cmp ecx, [parents_count] jae is_min_heap mov edx, [buffer+ecx*4] lea eax, [ecx*2+1] mov ebx, [buffer+eax*4] cmp edx, ebx jg check_max_start lea eax, [ecx*2+2] cmp eax, [count] jae next_min_parent mov ebx, [buffer+eax*4] cmp edx, ebx jg check_max_start next_min_parent: inc ecx jmp check_min_loop is_min_heap: mov dword [result], 1 jmp write_answer check_max_start: xor ecx,ecx check_max_loop: cmp ecx, [parents_count] jae is_max_heap mov edx, [buffer+ecx*4] lea eax, [ecx*2+1] mov ebx, [buffer+eax*4] cmp edx, ebx jl not_heap lea eax, [ecx*2+2] cmp eax, [count] jae next_max_parent mov ebx, [buffer+eax*4] cmp edx, ebx jl not_heap next_max_parent: inc ecx jmp check_max_loop is_max_heap: mov dword [result], -1 jmp write_answer not_heap: mov dword [result], 0 write_answer: sub esp, 16 mov dword [esp], output_name mov dword [esp+4], mode_write call fopen add esp, 16 mov [file], eax sub esp, 16 mov dword [esp], result mov dword [esp+4], 4 mov dword [esp+8], 1 mov eax, [file] mov [esp+12], eax call fwrite add esp, 16 sub esp, 16 mov eax, [file] mov [esp], eax call fclose add esp, 16 xor eax, eax lea esp, [ebp-12] pop edi pop esi pop ebx pop ebp ret
Этот код читает бинарный файл `input.bin`, содержащий 32-битные целые числа, и проверяет, является ли массив этих чисел min-кучей, max-кучей или не кучей. Результат записывается в `output.bin`: 1 для min-кучи, -1 для max-кучи, 0 для не кучи.

- В цикле `check_min_loop` вы проверяете условие min-кучи, но после обнаружения нарушения сразу переходите к проверке max-кучи. Однако вы не проверяете, что массив может быть одновременно и min, и max кучей (например, если все элементы равны). Подумайте, как обработать случай, когда массив удовлетворяет обоим условиям.

- В `check_max_loop` вы используете те же индексы для доступа к дочерним элементам, что и в `check_min_loop`. Убедитесь, что при проверке max-кучи вы корректно обрабатываете границы массива, особенно когда `ecx*2+2` выходит за пределы `count`.