global ft_list_remove_if extern free section .text ;this function remove an element from a list, set the previous element to the next ; the element ot remove is in rax ; the previouse element is in r8 ; the pointer to the start of the list is in rdi remove_element: push rsi mov rsi, [rax + 8] call call_free_elem test r8, r8 jz first_elem mov [r8 + 8], rsi jmp remove_element_end first_elem: mov [rdi], rsi remove_element_end: mov rax, rsi pop rsi ret ;wants the element that needs to be freed in rax call_free_elem: push rdi push rsi push rdx push rcx push r8 push rax mov rdi, [rax] call rcx pop rdi call free wrt ..plt pop r8 pop rcx pop rdx pop rsi pop rdi ret ft_list_remove_if: test rdi, rdi jz end test rdx, rdx jz end test rcx, rcx jz end xor r8, r8 mov rax, [rdi] loop: test rax, rax jz end push rax push rdi push rsi push rdx push rcx push r8 mov rdi, [rax] call rdx test eax, eax pop r8 pop rcx pop rdx pop rsi pop rdi jz loop_end pop rax call remove_element jmp loop loop_end: pop rax mov r8, rax mov rax, [rax + 8] jmp loop end: ret