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 mov rdi, tree_size call malloc xor edi, edi mov [rax+t_root], rdi mov [rax+t_count], rdi 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], rdi mov [rbp+.n], rsi call find cmp rax, 0 jne .done mov rdi, node_size call malloc mov rsi, [rbp+.n] mov [rax+n_value], rsi xor edi, edi mov [rax+n_left], rdi mov [rax+n_right], rdi mov rdx, [rbp+.t] mov rdi, [rdx+t_count] cmp rdi, 0 jne .findparent inc qword [rdx+t_count] mov [rdx+t_root], rax jmp .done .findparent: inc qword [rdx+t_count] mov rdx, [rdx+t_root] .repeatfind: cmp rsi, [rdx+n_value] jl .goleft mov r8, rdx mov rdx, [r8+n_right] cmp rdx, 0 jne .repeatfind mov [r8+n_right], rax jmp .done .goleft: mov r8, rdx mov rdx, [r8+n_left] cmp rdx, 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 mov rdi, [rdi+t_root] xor eax, eax .more cmp rdi, 0 je .done cmp rsi, [rdi+n_value] jl .goleft jg .goright mov rax, rsi jmp .done .goleft: mov rdi, [rdi+n_left] jmp .more .goright: mov rdi, [rdi+n_right] jmp .more .done leave ret rec_print: .t equ local1 push rbp mov rbp, rsp frame 1, 1, 1 sub rsp, frame_size cmp rdi, 0 je .done mov [rbp+.t], rdi mov rdi, [rdi+n_left] call rec_print mov rdi, [rbp+.t] mov rsi, [rdi+n_value] segment .data .print db "%ld ",0 segment .text lea rdi, [.print] xor eax, eax call printf mov rdi, [rbp+.t] mov rdi, [rdi+n_right] call rec_print .done leave ret ; print(t); print: push rbp mov rbp, rsp mov rdi, [rdi+t_root] call rec_print segment .data .print db 0x0a, 0 segment .text lea rdi, [.print] xor eax, eax 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 rdi, [.scanf_fmt] lea rsi, [rbp+.k] xor eax, eax call scanf cmp rax, 1 jne .done mov rdi, [rbp+.t] mov rsi, [rbp+.k] call insert mov rdi, [rbp+.t] call print jmp .more .done leave ret