diff options
| author | Charles <sircharlesaze@gmail.com> | 2019-11-25 04:47:15 +0100 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2019-11-25 04:47:15 +0100 |
| commit | 6808cd0fbd3edf68422228d2ee6a41ad70f971d5 (patch) | |
| tree | e490451ca06766021086e45062980ee3aa607964 | |
| parent | 9af248e8a78f111a39d507f199d56eb8af6e52d6 (diff) | |
| download | libasm-6808cd0fbd3edf68422228d2ee6a41ad70f971d5.tar.gz libasm-6808cd0fbd3edf68422228d2ee6a41ad70f971d5.tar.bz2 libasm-6808cd0fbd3edf68422228d2ee6a41ad70f971d5.zip | |
draft for ft_list*.s functions
| -rw-r--r-- | Makefile | 5 | ||||
| -rw-r--r-- | ft_list_remove_if.s | 58 | ||||
| -rw-r--r-- | ft_list_sort.s | 166 |
3 files changed, 177 insertions, 52 deletions
@@ -6,7 +6,7 @@ # By: cacharle <marvin@42.fr> +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2019/11/22 02:56:22 by cacharle #+# #+# # -# Updated: 2019/11/23 02:31:39 by cacharle ### ########.fr # +# Updated: 2019/11/25 04:46:29 by cacharle ### ########.fr # # # # **************************************************************************** # @@ -21,7 +21,8 @@ NASMFLAGS = -f macho64 NAME = libasm.a ASMSRC = ft_strlen.s ft_strcpy.s ft_strcmp.s ft_write.s ft_read.s \ - ft_strdup.s ft_atoi_base.s + ft_strdup.s ft_atoi_base.s ft_list_push_front.s \ + ft_list_size.s ft_list_sort.s ft_list_remove_if.s ASMOBJ = $(ASMSRC:.s=.o) all: $(NAME) diff --git a/ft_list_remove_if.s b/ft_list_remove_if.s index e69de29..9ae6ba5 100644 --- a/ft_list_remove_if.s +++ b/ft_list_remove_if.s @@ -0,0 +1,58 @@ +; **************************************************************************** ; +; ; +; ::: :::::::: ; +; ft_list_remove_if.s :+: :+: :+: ; +; +:+ +:+ +:+ ; +; By: cacharle <marvin@42.fr> +#+ +:+ +#+ ; +; +#+#+#+#+#+ +#+ ; +; Created: 2019/11/25 04:23:22 by cacharle #+# #+# ; +; Updated: 2019/11/25 04:23:22 by cacharle ### ########.fr ; +; ; +; **************************************************************************** ; + +global _ft_list_remove_if + +; ft_list_remove_if(t_list **begin_list, void *data_ref, +; int (*cmp)(), void (*free_fct)(void *)) + +_ft_list_remove_if: + sub rsp, 8 + + cmp rdi, 0x0 + je FT_LIST_REMOVE_IF_END + cmp [rdi], 0x0 + je FT_LIST_REMOVE_IF_END + + push rdi + mov rdi, [rdi] + 8 ;&(*begin_list)->val + call rdx + pop rdi + cmp rax, 0x0 + je FT_LIST_REMOVE_IF_REMOVE + + + mov rdi, [rdi] + 8 + call _ft_list_remove_if + add rsp, 8 + ret + +FT_LIST_REMOVE_IF_REMOVE: + mov [rsp], [rdi] + 8 ; saved_next = (*begin_list)->next + + push rdi + mov rdi, [[rdi]] + call rcx ; free_fct((*begin_list)->data) + pop rdi + + push rdi + mov rdi, [rdi] + call _free ; free(*begin_list) + pop rdi + + mov [rdi], [rsp] ; *begin_list = saved_next + + call _ft_list_remove_if + +FT_LIST_REMOVE_IF_END: + add rsp, 8 + ret diff --git a/ft_list_sort.s b/ft_list_sort.s index 1ab5485..23924e1 100644 --- a/ft_list_sort.s +++ b/ft_list_sort.s @@ -1,51 +1,117 @@ -# **************************************************************************** # -# # -# ::: :::::::: # -# ft_list_sort.s :+: :+: :+: # -# +:+ +:+ +:+ # -# By: cacharle <marvin@42.fr> +#+ +:+ +#+ # -# +#+#+#+#+#+ +#+ # -# Created: 2019/11/22 21:03:52 by cacharle #+# #+# # -# Updated: 2019/11/22 21:27:27 by cacharle ### ########.fr # -# # -# **************************************************************************** # - -.globl _ft_list_sort - -# void ft_list_sort(t_list **begin_list, int (*cmp)()); +; **************************************************************************** ; +; ; +; ::: :::::::: ; +; ft_list_sort.s :+: :+: :+: ; +; +:+ +:+ +:+ ; +; By: cacharle <marvin@42.fr> +#+ +:+ +#+ ; +; +#+#+#+#+#+ +#+ ; +; Created: 2019/11/22 21:03:52 by cacharle #+# #+# ; +; Updated: 2019/11/22 21:27:27 by cacharle ### ########.fr ; +; ; +; **************************************************************************** ; + +global _ft_list_sort + +; void ft_list_sort(t_list **begin_list, int (*cmp)()); _ft_list_sort: - push rbp - mov rbp, rsp - - call _ft_list_size - cmp eax, 2 - jl FT_LIST_SORT_END - - # split in half - # _ft_list_sort both half - # merge_sorted - - - FT_LIST_SORT_END: - pop rbp - ret - - -merge_sorted: -#ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) -#{ -# ListNode *merged = NULL; -# -# if (l1 == NULL && l2 == NULL) -# return NULL; -# if (l1 == NULL) -# return l2; -# if (l2 == NULL) -# return l1; -# merged = l1->val < l2->val ? l1 : l2; -# if (l1->val < l2->val) -# merged->next = mergeTwoLists(l1->next, l2); -# else -# merged->next = mergeTwoLists(l1, l2->next); -# return merged; -#} + ; t_list *fast + ; t_list *slow + ; t_list *middle + sub rsp, 24 + + cmp rdi, 0x0 + je FT_LIST_SORT_END + cmp [rdi], 0x0 + je FT_LIST_SORT_END + cmp [[rdi] + 8], 0x0 ; use tmp register + je FT_LIST_SORT_END + + mov [rsp], [[rdi] + 8] + mov [rsp + 8], [rdi] +FT_GET_MIDDLE_LOOP: + mov [rsp], [rsp + 8] + cmp [rsp], 0x0 + je FT_GET_MIDDLE_LOOP_END + mov [rsp], [rsp + 8] + mov [rsp + 8], [[rsp + 8] + 8] ; i want c pointers back plz +FT_GET_MIDDLE_LOOP_END: + mov [rsp + 16], [[rsp + 8] + 8] + mov [[rsp + 8] + 8], 0x0 + + push rdi + call _ft_list_sort + pop rdi + + push rdi + mov rdi, [rsp + 16] + call _ft_list_sort + pop rdi + + push rdi + push rsi + mov rdx, rsi + mov rdi, [rdi] + mov rsi, [rsp + 16] + call _merge_sorted_list + pop rsi + pop rdi + + mov [rdi], rax + + add rsp, 24 +FT_LIST_SORT_END: + ret + + + +; t_list *merge_sorted_list(t_list* l1, t_list* l2, int (*cmp)()) +_merge_sorted_list: + sub rsp, 8 + + cmp rdi, 0x0 + je MERGE_SORTED_LIST_RETURN_L2 + cmp rsi, 0x0 + je MERGE_SORTED_LIST_RETURN_L1 + + push rdi + push rsi + mov rdi, [rdi] + mov rsi, [rsi] + call rdx ; cmp + pop rsi + pop rdi + + cmp rax, 0x0 + jl L1_LT_L2 + +; L1_GE_L2 + mov rsp, rsi + push rdi + push rsi + mov rdi, [rdi + 8] + call _merge_sorted_list + pop rsi + pop rdi + mov [rsp + 8], rax + jmp MERGE_SORTED_LIST_END + +L1_LT_L2: + mov rsp, rdi + push rdi + push rsi + mov rsi, [rsi + 8] + call _merge_sorted_list + pop rsi + pop rdi + mov [rsp + 8], rax + +MERGE_SORTED_LIST_END: + mov rax, [rsp] + add rsp, 8 + ret +MERGE_SORTED_LIST_RETURN_L1: + mov rax, rdi + ret +MERGE_SORTED_LIST_RETURN_L2: + mov rax, rsi + ret |
