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