global ft_list_sort ft_list_sort: push rsp push rdi ; push begin_list push rsi ; push cmp_func push r12 ; callee saved push r13 ; same push r14 ; same push r15 cmp qword [rdi], 0 je .done mov r12, 0 ; r12 "prev" = NULL mov r13, [rdi] ; r13 "curr" = begin_list mov r14, rdi ; r14 begin_list memory mov r15, rsi .loop: cmp qword [r13 + 8], 0 ; if curr->next is null then exit je .done mov rdi, [r13] ; first arg is curr->data mov rsi, [r13 + 8] ; rsi = curr->next; mov rsi, [rsi] ; rsi = rsi->data; ;push rbx ; rbx is caller saved ;push r13 ; same ; align stack here ? sub rsp, 72; align stack ??? call r15 add rsp, 72 ;pop rdx ; rdx is caller saved ;pop rbx ; rbx is caller saved cmp eax, 0 jle .else ; if in order continue... cmp r13, [r14] je .is_first_elem mov rdx, [r13 + 8] mov [r12 + 8], rdx mov rbx, [r13 + 8] mov rdx, [rbx + 8] mov [r13 + 8], rdx mov rbx, [r12 + 8] mov [rbx + 8], r13 mov r12, 0 mov r13, [r14] ;mov rbx, [r13 + 8] ;mov rbx, [r13 + 8] ;mov rbx, [rbx + 8] ;mov [r13 + 8], rbx ;mov rbx, [r12 + 8] ;mov rbx, [rbx + 8] ;mov rbx, r13 ;mov r12, 0, ; reset prev ;mov r13, [r14] ; reset curr jmp .loop .is_first_elem: ;mov r14, [r13 + 8] ; begin_list = curr->next ;mov rbx, [r13 + 8] ; rbx = curr->next ;mov rdx, [rbx + 8] ; rbx = curr->next->next ;mov [r13 + 8], rdx ; curr->next = curr->next->next ;mov [r14 + 8], r13 ; begin_list->next = curr ;mov rdx, [r13 + 8] mov rbx, [r13 + 8] mov [r14], rbx ;je .done mov rbx, [r13 + 8] mov rdx, [rbx + 8] mov [r13 + 8], rdx mov rbx, [r14] mov [rbx + 8], r13 ;jmp .done mov r12, 0 ; reset prev mov r13, [r14] ; reset curr jmp .loop .else: ; ...here mov r12, r13 ; prev = curr; mov r13, [r13 + 8] ; curr = curr->next; jmp .loop .done: pop r15 pop r14 pop r13 ; restore stack and return pop r12 pop rsi pop rdi pop rsp ret