Online Compiler Nasm

extern fopen extern fread extern fclose extern printf section .bss array resb 120000 is_child resb 120000 file_size resd 1 file_ptr resd 1 section .data file_in db "input.bin", 0 mode_r db "rb", 0 fmt_out db "%d ", 0 section .text global main dfs: push ebp mov ebp, esp push ebx mov ebx, [ebp + 8] cmp ebx, -1 je .dfs_end ;как посмотреть левое значение если известен ключ (ebx) ;печатаем ключ sub esp, 12 push dword [array + ebx] ;аргумент 2 само число push fmt_out ;аргумент 1 строка формата "%d " call printf add esp, 20 push dword [array + ebx + 4] call dfs add esp, 4 push dword [array + ebx + 8] call dfs add esp, 4 .dfs_end: pop ebx mov esp, ebp pop ebp ret main: push ebp mov ebp, esp and esp, -16 ; выравнивание ; открываем файл sub esp, 8 push mode_r push file_in call fopen add esp, 16 mov [file_ptr], eax ; читаем файл целиком push dword [file_ptr] ; аргумент 4 дескриптор push 120000 ; аргумент 3 макс кол-во элементов push 1 ; аргумент 2 размер 1 элемента (1 байт) push array ; аргумент 1 куда писать call fread add esp, 16 mov [file_size], eax ; сколько байт реально прочитали ;закрываем файл sub esp, 12 push dword [file_ptr] call fclose add esp, 16 mov esi, 0 ; esi - текущее смещение узла .mark_loop: cmp esi, [file_size] je .check_prep ;проверяем левого ребенка mov eax, [array + esi + 4] cmp eax, -1 je .check_right mov byte [is_child + eax], 1 .check_right: mov eax, [array + esi + 8] cmp eax, -1 je .check_right_end mov byte [is_child + eax], 1 .check_right_end: add esi, 12 jmp .mark_loop .check_prep: mov esi, 0 .check: cmp byte [is_child + esi], 0 je .root_find add esi, 12 jmp .check ;корень - когда он ничей неребенок .root_find: sub esp, 12 push esi call dfs add esp, 16 xor eax, eax mov esp, ebp pop ebp ret
Вот разбор твоего кода:

1) **Что делает код:**  
Программа читает бинарный файл `input.bin`, который содержит узлы бинарного дерева (каждый узел — 12 байт: 4 байта значение, 4 байта индекс левого потомка, 4 байта индекс правого потомка). Сначала она находит корень дерева (узел, который ни у кого не является потомком), затем выполняет прямой обход (pre-order) и печатает значения узлов.

2) **Конкретные подсказки:**  
- В процедуре `dfs` ты пытаешься получить значение узла через `[array + ebx]`, но `ebx` — это **индекс** узла (смещение в байтах), а не номер узла. Проверь, как ты передаёшь аргумент при рекурсивных вызовах — ты передаёшь `[array + ebx + 4]` и `[array + ebx + 8]`, но это **сами значения** левого/правого потомка (индексы), а не смещения. Нужно передавать именно эти индексы, а не их адреса.  
- В цикле поиска корня (`check`) ты увеличиваешь `esi` на 12, но сравниваешь `is_child` по одному байту. Это нормально, но убедись, что массив `is_child` инициализирован нулями (в BSS это гарантировано). Однако ты проверяешь `byte [is_child + esi]`, где `esi` — смещение узла (кратно 12), а `is_child` — массив байтов. Это работает, но может сбивать с толку — обычно для таких флагов используют отдельный индекс или массив с шагом 1.