96 lines
825 B
ArmAsm
96 lines
825 B
ArmAsm
global ft_list_remove_if
|
|
|
|
section .text
|
|
|
|
remove_element:
|
|
|
|
call call_free_elem
|
|
push rax
|
|
mov rax, [rax + 8]
|
|
|
|
test r8, r8
|
|
jz element_is_first
|
|
|
|
mov [r8 + 8], rax
|
|
pop rax
|
|
ret
|
|
|
|
element_is_first:
|
|
mov [rdi], rax
|
|
pop rax
|
|
ret
|
|
|
|
|
|
call_free_elem:
|
|
push rdi
|
|
push rsi
|
|
push rdx
|
|
push rcx
|
|
push rax
|
|
push r8
|
|
|
|
mov rdi, [rax]
|
|
call rcx
|
|
|
|
pop r8
|
|
pop rax
|
|
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
|
|
|
|
mov rax, [rsp]
|
|
call remove_element
|
|
|
|
loop_end:
|
|
|
|
pop rax
|
|
mov r8, rax
|
|
mov rax, [rax + 8]
|
|
jmp loop
|
|
|
|
|
|
|
|
|
|
end:
|
|
ret
|