segment .data struc node n_value resq 1 n_left resq 1 n_right resq 1 align 8 endstruc struc tree t_count resq 1 t_root resq 1 align 8 endstruc segment .text global main, new_tree, insert, print, rec_print, find extern malloc, scanf, printf new_tree: push rbp mov rbp, rsp frame 0, 0, 1 sub rsp, frame_size mov rcx, tree_size call malloc xor edx, edx mov [rax+t_root], rdx mov [rax+t_count], rdx leave ret ; insert ( t, n ); insert: .n equ local1 .t equ local2 push rbp mov rbp, rsp frame 2, 2, 2 sub rsp, frame_size mov [rbp+.t], rcx mov [rbp+.n], rdx call find cmp rax, 0 jne .done mov rcx, node_size call malloc mov rdx, [rbp+.n] mov [rax+n_value], rdx xor r8d, r8d mov [rax+n_left], r8 mov [rax+n_right], r8 mov r9, [rbp+.t] mov rcx, [r9+t_count] cmp rcx, 0 jne .findparent inc qword [r9+t_count] mov [r9+t_root], rax jmp .done .findparent: inc qword [r9+t_count] mov r9, [r9+t_root] .repeatfind: cmp rdx, [r9+n_value] jl .goleft mov r8, r9 mov r9, [r8+n_right] cmp r9, 0 jne .repeatfind mov [r8+n_right], rax jmp .done .goleft: mov r8, r9 mov r9, [r8+n_left] cmp r9, 0 jne .repeatfind mov [r8+n_left], rax .done leave ret ; p = find ( t, n ); ; p = 0 if not found find: push rbp mov rbp, rsp frame 2, 0, 0 sub rsp, frame_size mov rcx, [rcx+t_root] xor eax, eax .more cmp rcx, 0 je .done cmp rdx, [rcx+n_value] jl .goleft jg .goright mov rax, rcx jmp .done .goleft: mov rcx, [rcx+n_left] jmp .more .goright: mov rcx, [rcx+n_right] jmp .more .done leave ret rec_print: .t equ local1 push rbp mov rbp, rsp frame 1, 1, 2 sub rsp, frame_size cmp rcx, 0 je .done mov [rbp+.t], rcx mov rcx, [rcx+n_left] call rec_print mov rcx, [rbp+.t] mov rdx, [rcx+n_value] segment .data .print db "%ld ",0 segment .text lea rcx, [.print] call printf mov rcx, [rbp+.t] mov rcx, [rcx+n_right] call rec_print .done leave ret ; print(t); print: push rbp mov rbp, rsp frame 1, 0, 1 mov rcx, [rcx+t_root] call rec_print segment .data .print db 0x0a, 0 segment .text lea rcx, [.print] call printf leave ret main: .k equ local1 .t equ local2 segment .data .scanf_fmt: db "%ld",0 segment .text push rbp mov rbp, rsp frame 2, 2, 2 sub rsp, frame_size call new_tree mov [rbp+.t], rax .more lea rcx, [.scanf_fmt] lea rdx, [rbp+.k] call scanf cmp rax, 1 jne .done mov rcx, [rbp+.t] mov rdx, [rbp+.k] call insert mov rcx, [rbp+.t] call print jmp .more .done leave ret