Files
libasm/srcs/bonus/ft_list_remove_if.s
2025-04-12 20:49:55 +02:00

104 lines
1.1 KiB
ArmAsm

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