aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles Cabergs <me@cacharle.xyz>2021-02-11 15:44:44 +0100
committerCharles Cabergs <me@cacharle.xyz>2021-02-11 15:44:44 +0100
commitd6240e3f6aeb342aaf13284c7cc93226970648aa (patch)
treea5fef5bd1d55e0dd63cb986a445254cf8caa94ce
parentcd5c9e6a923878e797212d27476ee217eb844a14 (diff)
downloadlibasm-d6240e3f6aeb342aaf13284c7cc93226970648aa.tar.gz
libasm-d6240e3f6aeb342aaf13284c7cc93226970648aa.tar.bz2
libasm-d6240e3f6aeb342aaf13284c7cc93226970648aa.zip
Replaced tab with spaces
-rw-r--r--ft_atoi_base.s282
-rw-r--r--ft_list_push_front.s32
-rw-r--r--ft_list_remove_if.s126
-rw-r--r--ft_list_size.s14
-rw-r--r--ft_list_sort.s190
-rw-r--r--ft_read.s10
-rw-r--r--ft_strcmp.s44
-rw-r--r--ft_strcpy.s26
-rw-r--r--ft_strdup.s26
-rw-r--r--ft_strlen.s10
-rw-r--r--ft_write.s10
11 files changed, 385 insertions, 385 deletions
diff --git a/ft_atoi_base.s b/ft_atoi_base.s
index 6803000..605190d 100644
--- a/ft_atoi_base.s
+++ b/ft_atoi_base.s
@@ -53,179 +53,179 @@ global M_FT_ATOI_BASE
section .text
; int ft_atoi_base(const char *str, const char *base);
M_FT_ATOI_BASE:
- ; ===prolog===
- ; long int nb (8)
- ; int radix (4)
- ; int is_negative (4)
- sub rsp, 16
- mov qword [rsp], 0x0 ; nb = 0
- mov dword [rsp + 8], 0x0 ; radix = 0
- mov dword [rsp + 12], 0x0 ; is_negative = 0
- push rbx
- push r11
- push r15
-
- ; ===body===
- ; check if the base is valid
- push rdi
- mov rdi, rsi
- call _check_base
- pop rdi
- cmp eax, 0x0
- je FT_ATOI_BASE_ERROR
-
- ; ignore space in front
- mov rbx, -1 ; rbx is rdi str index
+ ; ===prolog===
+ ; long int nb (8)
+ ; int radix (4)
+ ; int is_negative (4)
+ sub rsp, 16
+ mov qword [rsp], 0x0 ; nb = 0
+ mov dword [rsp + 8], 0x0 ; radix = 0
+ mov dword [rsp + 12], 0x0 ; is_negative = 0
+ push rbx
+ push r11
+ push r15
+
+ ; ===body===
+ ; check if the base is valid
+ push rdi
+ mov rdi, rsi
+ call _check_base
+ pop rdi
+ cmp eax, 0x0
+ je FT_ATOI_BASE_ERROR
+
+ ; ignore space in front
+ mov rbx, -1 ; rbx is rdi str index
FT_ATOI_BASE_IGNORE_SPACES:
- inc rbx
- push rdi
- mov dil, byte [rdi + rbx]
- call _ft_isspace
- pop rdi
- cmp rax, 1
- je FT_ATOI_BASE_IGNORE_SPACES
-
- ; ignore '+', '-' reverse the current sign
- mov qword [rsp], 0x0 ; nb = 0
- mov dword [rsp + 8], 0x0 ; radix = 0
- mov dword [rsp + 12], 0x0 ; is_negative = 0
- mov dword [rsp + 12], 0x0 ; weird behavior FIXME
- dec rbx
- jmp FT_ATOI_BASE_SIGN_LOOP
+ inc rbx
+ push rdi
+ mov dil, byte [rdi + rbx]
+ call _ft_isspace
+ pop rdi
+ cmp rax, 1
+ je FT_ATOI_BASE_IGNORE_SPACES
+
+ ; ignore '+', '-' reverse the current sign
+ mov qword [rsp], 0x0 ; nb = 0
+ mov dword [rsp + 8], 0x0 ; radix = 0
+ mov dword [rsp + 12], 0x0 ; is_negative = 0
+ mov dword [rsp + 12], 0x0 ; weird behavior FIXME
+ dec rbx
+ jmp FT_ATOI_BASE_SIGN_LOOP
FT_ATOI_BASE_SIGN_LOOP_FOUND_NEG:
- not dword [rsp + 12]
+ not dword [rsp + 12]
FT_ATOI_BASE_SIGN_LOOP:
- inc rbx
- cmp byte [rdi + rbx], 0x2b ; if '+'
- je FT_ATOI_BASE_SIGN_LOOP
- cmp byte [rdi + rbx], 0x2d ; if '-'
- je FT_ATOI_BASE_SIGN_LOOP_FOUND_NEG
-
- ; base radix
- push rdi
- mov rdi, rsi
- call M_FT_STRLEN
- pop rdi
- mov dword [rsp + 8], eax
-
- ; main loop
+ inc rbx
+ cmp byte [rdi + rbx], 0x2b ; if '+'
+ je FT_ATOI_BASE_SIGN_LOOP
+ cmp byte [rdi + rbx], 0x2d ; if '-'
+ je FT_ATOI_BASE_SIGN_LOOP_FOUND_NEG
+
+ ; base radix
+ push rdi
+ mov rdi, rsi
+ call M_FT_STRLEN
+ pop rdi
+ mov dword [rsp + 8], eax
+
+ ; main loop
FT_ATOI_BASE_LOOP:
- push rdi
- push rsi
- mov dil, byte [rdi + rbx]
- call _base_pos ; get value of the current char int the base
- pop rsi
- pop rdi
- cmp rax, -1 ; if is not in base break
- je FT_ATOI_BASE_LOOP_END
-
- mov r11, [rsp] ; place nb in register for multiplication
- xor r15, r15 ; same for radix
- mov r15d, dword [rsp + 8]
- imul r11, r15 ; multiply by the radix
- mov [rsp], r11 ; store multiplication result
- add [rsp], rax ; add the current value
-
- inc rbx
- jmp FT_ATOI_BASE_LOOP
+ push rdi
+ push rsi
+ mov dil, byte [rdi + rbx]
+ call _base_pos ; get value of the current char int the base
+ pop rsi
+ pop rdi
+ cmp rax, -1 ; if is not in base break
+ je FT_ATOI_BASE_LOOP_END
+
+ mov r11, [rsp] ; place nb in register for multiplication
+ xor r15, r15 ; same for radix
+ mov r15d, dword [rsp + 8]
+ imul r11, r15 ; multiply by the radix
+ mov [rsp], r11 ; store multiplication result
+ add [rsp], rax ; add the current value
+
+ inc rbx
+ jmp FT_ATOI_BASE_LOOP
FT_ATOI_BASE_LOOP_END:
- cmp dword [rsp + 12], 0
- je FT_ATOI_BASE_END
- neg qword [rsp]
+ cmp dword [rsp + 12], 0
+ je FT_ATOI_BASE_END
+ neg qword [rsp]
- ; ===epilog===
+ ; ===epilog===
FT_ATOI_BASE_END:
- mov rax, [rsp]
- pop r15
- pop r11
- pop rbx
- add rsp, 16
- ret
+ mov rax, [rsp]
+ pop r15
+ pop r11
+ pop rbx
+ add rsp, 16
+ ret
FT_ATOI_BASE_ERROR:
- mov rax, 0x0
- pop r15
- pop r11
- pop rbx
- add rsp, 16
- ret
+ mov rax, 0x0
+ pop r15
+ pop r11
+ pop rbx
+ add rsp, 16
+ ret
; dil: char searched
; rsi: char *base
_base_pos:
- mov rax, -1
+ mov rax, -1
BASE_POS_LOOP:
- inc rax
- cmp byte [rsi + rax], 0 ; if '\0' char not in base
- je BASE_POS_NOT_FOUND
- cmp dil, byte [rsi + rax] ; loop until '\0' or found
- jne BASE_POS_LOOP
- ret
+ inc rax
+ cmp byte [rsi + rax], 0 ; if '\0' char not in base
+ je BASE_POS_NOT_FOUND
+ cmp dil, byte [rsi + rax] ; loop until '\0' or found
+ jne BASE_POS_LOOP
+ ret
BASE_POS_NOT_FOUND:
- mov rax, -1
- ret
+ mov rax, -1
+ ret
; rdi: char *base
_check_base:
- sub rsp, 4
- mov dword [rsp], 0
+ sub rsp, 4
+ mov dword [rsp], 0
; check for empty or size 1 base
- push rdi
- call M_FT_STRLEN
- pop rdi
- cmp rax, 2
- jl CHECK_BASE_FALSE
+ push rdi
+ call M_FT_STRLEN
+ pop rdi
+ cmp rax, 2
+ jl CHECK_BASE_FALSE
- ; xor rcx, rcx
+ ; xor rcx, rcx
CHECK_BASE_LOOP:
- cmp byte [rdi], 0
- je CHECK_BASE_LOOP_END
- cmp byte [rdi], 0x2b ; check '+'
- je CHECK_BASE_FALSE
- cmp byte [rdi], 0x2d ; check '-'
- je CHECK_BASE_FALSE
+ cmp byte [rdi], 0
+ je CHECK_BASE_LOOP_END
+ cmp byte [rdi], 0x2b ; check '+'
+ je CHECK_BASE_FALSE
+ cmp byte [rdi], 0x2d ; check '-'
+ je CHECK_BASE_FALSE
; check for spaces
- push rdi
- mov dil, [rdi] ; pass current char as argument
- call _ft_isspace
- pop rdi
- cmp rax, 1
- je CHECK_BASE_FALSE
+ push rdi
+ mov dil, [rdi] ; pass current char as argument
+ call _ft_isspace
+ pop rdi
+ cmp rax, 1
+ je CHECK_BASE_FALSE
; check for duplicates in base
- xor rcx, rcx ; index from curr +1
+ xor rcx, rcx ; index from curr +1
CHECK_BASE_DUP_LOOP:
- inc rcx
- mov r10b, byte [rdi] ; r10b = checked char
- cmp r10b, byte [rdi + rcx] ; check if found dup
- je CHECK_BASE_FALSE
- cmp byte [rdi + rcx], 0 ; if \0 end dup check
- jne CHECK_BASE_DUP_LOOP
-
- inc rdi
- jmp CHECK_BASE_LOOP
+ inc rcx
+ mov r10b, byte [rdi] ; r10b = checked char
+ cmp r10b, byte [rdi + rcx] ; check if found dup
+ je CHECK_BASE_FALSE
+ cmp byte [rdi + rcx], 0 ; if \0 end dup check
+ jne CHECK_BASE_DUP_LOOP
+
+ inc rdi
+ jmp CHECK_BASE_LOOP
CHECK_BASE_LOOP_END:
- add rsp, 4
- mov rax, 1
- ret
+ add rsp, 4
+ mov rax, 1
+ ret
CHECK_BASE_FALSE:
- add rsp, 4
- xor rax, rax
- ret
+ add rsp, 4
+ xor rax, rax
+ ret
; dil: char c
_ft_isspace:
- cmp dil, 0x20
- je ISSPACE_TRUE
- sub dil, 0x9
- cmp dil, 0x5
- jl ISSPACE_TRUE
- xor rax, rax
- ret
+ cmp dil, 0x20
+ je ISSPACE_TRUE
+ sub dil, 0x9
+ cmp dil, 0x5
+ jl ISSPACE_TRUE
+ xor rax, rax
+ ret
ISSPACE_TRUE:
- mov rax, 0x1
- ret
+ mov rax, 0x1
+ ret
diff --git a/ft_list_push_front.s b/ft_list_push_front.s
index e4cfb02..4eedf75 100644
--- a/ft_list_push_front.s
+++ b/ft_list_push_front.s
@@ -24,22 +24,22 @@ global M_FT_LIST_PUSH_FRONT
; void ft_list_push_front(t_list **begin_list, void *data);
M_FT_LIST_PUSH_FRONT:
- cmp rdi, 0
- je FT_LIST_PUSH_FRONT_END
+ cmp rdi, 0
+ je FT_LIST_PUSH_FRONT_END
- push rdi
- push rsi
- xor rdi, rdi
- mov edi, 16
- call M_MALLOC wrt ..plt
- pop rsi
- pop rdi
- cmp rax, 0
- je FT_LIST_PUSH_FRONT_END
+ push rdi
+ push rsi
+ xor rdi, rdi
+ mov edi, 16
+ call M_MALLOC wrt ..plt
+ pop rsi
+ pop rdi
+ cmp rax, 0
+ je FT_LIST_PUSH_FRONT_END
- mov qword [rax + 0], rsi
- mov r10, [rdi]
- mov [rax + 8], r10
- mov [rdi], rax
+ mov qword [rax + 0], rsi
+ mov r10, [rdi]
+ mov [rax + 8], r10
+ mov [rdi], rax
FT_LIST_PUSH_FRONT_END:
- ret
+ ret
diff --git a/ft_list_remove_if.s b/ft_list_remove_if.s
index 7ce06a0..61f3410 100644
--- a/ft_list_remove_if.s
+++ b/ft_list_remove_if.s
@@ -25,78 +25,78 @@ extern M_FREE
%define NULL 0x0
%macro EXTERN_FUNCTION_SAVE 0
- push rdi
- push rsi
- push rdx
- push rcx
+ push rdi
+ push rsi
+ push rdx
+ push rcx
%endmacro
%macro EXTERN_FUNCTION_SAVE_END 0
- pop rcx
- pop rdx
- pop rsi
- pop rdi
+ pop rcx
+ pop rdx
+ pop rsi
+ pop rdi
%endmacro
; ft_list_remove_if(t_list **begin_list, void *data_ref,
; int (*cmp)(void *data, void *data_ref),
; void (*free_fct)(void *))
M_FT_LIST_REMOVE_IF:
- ; t_list *saved_next
-
- ; === prolog ===
- push rbp
- mov rbp, rsp
- sub rsp, 8
-
- ; === base condition ===
- cmp rdi, NULL
- je FT_LIST_REMOVE_IF_END
- cmp qword [rdi], NULL
- je FT_LIST_REMOVE_IF_END
-
- ; === compare (*begin_list)->data and data_ref
- EXTERN_FUNCTION_SAVE
- mov rdi, [rdi]
- mov rdi, [rdi + 0]
- call rdx ; cmp((*begin_list)->data, data_ref)
- EXTERN_FUNCTION_SAVE_END
- cmp rax, 0
- je FT_LIST_REMOVE_IF_REMOVE
-
- ; === next element ===
- push rdi
- mov rdi, [rdi]
- lea rdi, [rdi + 8]
- call M_FT_LIST_REMOVE_IF
- pop rdi
- jmp FT_LIST_REMOVE_IF_END
-
- ; === remove head and go next ===
+ ; t_list *saved_next
+
+ ; === prolog ===
+ push rbp
+ mov rbp, rsp
+ sub rsp, 8
+
+ ; === base condition ===
+ cmp rdi, NULL
+ je FT_LIST_REMOVE_IF_END
+ cmp qword [rdi], NULL
+ je FT_LIST_REMOVE_IF_END
+
+ ; === compare (*begin_list)->data and data_ref
+ EXTERN_FUNCTION_SAVE
+ mov rdi, [rdi]
+ mov rdi, [rdi + 0]
+ call rdx ; cmp((*begin_list)->data, data_ref)
+ EXTERN_FUNCTION_SAVE_END
+ cmp rax, 0
+ je FT_LIST_REMOVE_IF_REMOVE
+
+ ; === next element ===
+ push rdi
+ mov rdi, [rdi]
+ lea rdi, [rdi + 8]
+ call M_FT_LIST_REMOVE_IF
+ pop rdi
+ jmp FT_LIST_REMOVE_IF_END
+
+ ; === remove head and go next ===
FT_LIST_REMOVE_IF_REMOVE:
- mov rax, [rdi] ; rax = *begin_list
- mov rax, [rax + 8] ; rax = rax->next
- mov [rbp - 8], rax ; saved_next = (*begin_list)->next
-
- push rdi ; strange behavior
- EXTERN_FUNCTION_SAVE
- mov rdi, [rdi]
- mov rdi, [rdi + 0]
- call rcx ; free_fct((*begin_list)->data)
- EXTERN_FUNCTION_SAVE_END
- pop rdi
-
- EXTERN_FUNCTION_SAVE
- mov rdi, [rdi]
- call M_FREE wrt ..plt ; free(*begin_list)
- EXTERN_FUNCTION_SAVE_END
-
- mov rax, [rbp - 8]
- mov [rdi], rax
- call M_FT_LIST_REMOVE_IF
+ mov rax, [rdi] ; rax = *begin_list
+ mov rax, [rax + 8] ; rax = rax->next
+ mov [rbp - 8], rax ; saved_next = (*begin_list)->next
+
+ push rdi ; strange behavior
+ EXTERN_FUNCTION_SAVE
+ mov rdi, [rdi]
+ mov rdi, [rdi + 0]
+ call rcx ; free_fct((*begin_list)->data)
+ EXTERN_FUNCTION_SAVE_END
+ pop rdi
+
+ EXTERN_FUNCTION_SAVE
+ mov rdi, [rdi]
+ call M_FREE wrt ..plt ; free(*begin_list)
+ EXTERN_FUNCTION_SAVE_END
+
+ mov rax, [rbp - 8]
+ mov [rdi], rax
+ call M_FT_LIST_REMOVE_IF
FT_LIST_REMOVE_IF_END:
- ; === epilog ===
- mov rsp, rbp
- pop rbp
- ret
+ ; === epilog ===
+ mov rsp, rbp
+ pop rbp
+ ret
diff --git a/ft_list_size.s b/ft_list_size.s
index 0d80bd9..31fa613 100644
--- a/ft_list_size.s
+++ b/ft_list_size.s
@@ -21,12 +21,12 @@ global M_FT_LIST_SIZE
section .text
; int ft_list_size(t_list *begin_list);
M_FT_LIST_SIZE:
- xor eax, eax
+ xor eax, eax
FT_LIST_SIZE_LOOP:
- cmp rdi, 0
- je FT_LIST_SIZE_END
- inc eax
- mov rdi, [rdi + 8]
- jmp FT_LIST_SIZE_LOOP
+ cmp rdi, 0
+ je FT_LIST_SIZE_END
+ inc eax
+ mov rdi, [rdi + 8]
+ jmp FT_LIST_SIZE_LOOP
FT_LIST_SIZE_END:
- ret
+ ret
diff --git a/ft_list_sort.s b/ft_list_sort.s
index b4899ef..55f3a9f 100644
--- a/ft_list_sort.s
+++ b/ft_list_sort.s
@@ -22,111 +22,111 @@ global M_FT_LIST_SORT
; void ft_list_sort(t_list **begin_list, int (*cmp)(void*, void*));
M_FT_LIST_SORT:
- ; t_list *slow : rax = *begin_list
- ; t_list *fast : rbx = (*begin_list)->next
- ; t_list *middle : rsp + 0
-
- ; === base condition ===
- cmp rdi, NULL
- je FT_LIST_SORT_END ; if begin_list == NULL return
- mov rax, [rdi]
- cmp rax, NULL
- je FT_LIST_SORT_END ; if *begin_list == NULL return
- mov rbx, [rax + 8]
- cmp rbx, NULL
- je FT_LIST_SORT_END ; if (*begin_list)->next == NULL return
-
- ; === find list middle loop ===
+ ; t_list *slow : rax = *begin_list
+ ; t_list *fast : rbx = (*begin_list)->next
+ ; t_list *middle : rsp + 0
+
+ ; === base condition ===
+ cmp rdi, NULL
+ je FT_LIST_SORT_END ; if begin_list == NULL return
+ mov rax, [rdi]
+ cmp rax, NULL
+ je FT_LIST_SORT_END ; if *begin_list == NULL return
+ mov rbx, [rax + 8]
+ cmp rbx, NULL
+ je FT_LIST_SORT_END ; if (*begin_list)->next == NULL return
+
+ ; === find list middle loop ===
FT_LIST_SORT_MIDDLE_LOOP: ; do {
- mov rbx, [rbx + 8] ; fast = fast->next
- cmp rbx, NULL
- je FT_LIST_SORT_MIDDLE_LOOP_END ; if fast == NULL break
- mov rbx, [rbx + 8] ; fast = fast->next
- mov rax, [rax + 8] ; slow = slow->next
- cmp rbx, NULL
- jne FT_LIST_SORT_MIDDLE_LOOP ; } while (fast != NULL)
+ mov rbx, [rbx + 8] ; fast = fast->next
+ cmp rbx, NULL
+ je FT_LIST_SORT_MIDDLE_LOOP_END ; if fast == NULL break
+ mov rbx, [rbx + 8] ; fast = fast->next
+ mov rax, [rax + 8] ; slow = slow->next
+ cmp rbx, NULL
+ jne FT_LIST_SORT_MIDDLE_LOOP ; } while (fast != NULL)
FT_LIST_SORT_MIDDLE_LOOP_END:
- ; create a stack frame for local variable to store middle address
- push rbp
- mov rbp, rsp
- sub rsp, 8
-
- ; store middle in [rbp - 8]
- mov rcx, [rax + 8]
- mov [rbp - 8], rcx
- mov qword [rax + 8], NULL ; slow->next = NULL
-
- ; === sorting both child list ===
- push rdi
- push rsi
- call M_FT_LIST_SORT ; ft_list_sort(begin_list, cmp)
- lea rdi, [rbp - 8]
- call M_FT_LIST_SORT ; ft_list_sort(&middle, cmp)
- pop rsi
- pop rdi
-
- ; === merging sorted child ===
- push rdi
- push rsi
- mov rdi, [rdi] ; arg_1 = *begin_list
- mov rdx, rsi ; arg_3 = cmp
- mov rsi, [rbp - 8] ; arg_2 = middle
- call _st_merge_sorted_list
- pop rsi
- pop rdi
- mov [rdi], rax ; *begin_list = st_merge_sorted_list(...);
-
- ; restoring stack frame
- mov rsp, rbp
- pop rbp
+ ; create a stack frame for local variable to store middle address
+ push rbp
+ mov rbp, rsp
+ sub rsp, 8
+
+ ; store middle in [rbp - 8]
+ mov rcx, [rax + 8]
+ mov [rbp - 8], rcx
+ mov qword [rax + 8], NULL ; slow->next = NULL
+
+ ; === sorting both child list ===
+ push rdi
+ push rsi
+ call M_FT_LIST_SORT ; ft_list_sort(begin_list, cmp)
+ lea rdi, [rbp - 8]
+ call M_FT_LIST_SORT ; ft_list_sort(&middle, cmp)
+ pop rsi
+ pop rdi
+
+ ; === merging sorted child ===
+ push rdi
+ push rsi
+ mov rdi, [rdi] ; arg_1 = *begin_list
+ mov rdx, rsi ; arg_3 = cmp
+ mov rsi, [rbp - 8] ; arg_2 = middle
+ call _st_merge_sorted_list
+ pop rsi
+ pop rdi
+ mov [rdi], rax ; *begin_list = st_merge_sorted_list(...);
+
+ ; restoring stack frame
+ mov rsp, rbp
+ pop rbp
FT_LIST_SORT_END:
- ret
+ ret
; t_list *st_merge_sorted_list(t_list* l1, t_list* l2, int (*cmp)(void*, void*))
_st_merge_sorted_list:
- cmp rdi, NULL
- je MERGE_SORTED_LIST_RETURN_L2 ; if l1 == NULL return l2
- cmp rsi, NULL
- je MERGE_SORTED_LIST_RETURN_L1 ; if l2 == NULL return l1
-
- push rdi
- push rsi
- push rdx
- mov rdi, [rdi + 0] ; l1->data
- mov rsi, [rsi + 0] ; l2->data
- xor rax, rax
- call rdx ; cmp
- pop rdx
- pop rsi
- pop rdi
-
- cmp eax, 0
- jl MERGE_SORTED_LIST_L1_LT_L2
-
- ; if l1 >= l2
- push rsi ; save l2
- mov rsi, [rsi + 8] ; l2 = l2->next
- call _st_merge_sorted_list ; merge_sorted_list(l1, l2->next, cmp)
- pop rsi ; restore rsi
- mov [rsi + 8], rax
- mov rax, rsi
- jmp MERGE_SORTED_LIST_END
- ; else
+ cmp rdi, NULL
+ je MERGE_SORTED_LIST_RETURN_L2 ; if l1 == NULL return l2
+ cmp rsi, NULL
+ je MERGE_SORTED_LIST_RETURN_L1 ; if l2 == NULL return l1
+
+ push rdi
+ push rsi
+ push rdx
+ mov rdi, [rdi + 0] ; l1->data
+ mov rsi, [rsi + 0] ; l2->data
+ xor rax, rax
+ call rdx ; cmp
+ pop rdx
+ pop rsi
+ pop rdi
+
+ cmp eax, 0
+ jl MERGE_SORTED_LIST_L1_LT_L2
+
+ ; if l1 >= l2
+ push rsi ; save l2
+ mov rsi, [rsi + 8] ; l2 = l2->next
+ call _st_merge_sorted_list ; merge_sorted_list(l1, l2->next, cmp)
+ pop rsi ; restore rsi
+ mov [rsi + 8], rax
+ mov rax, rsi
+ jmp MERGE_SORTED_LIST_END
+ ; else
MERGE_SORTED_LIST_L1_LT_L2:
- push rdi
- mov rdi, [rdi + 8]
- call _st_merge_sorted_list ; merge_sort_list(l1->next, l2, cmp)
- pop rdi
- mov [rdi + 8], rax
- mov rax, rdi
- jmp MERGE_SORTED_LIST_END
+ push rdi
+ mov rdi, [rdi + 8]
+ call _st_merge_sorted_list ; merge_sort_list(l1->next, l2, cmp)
+ pop rdi
+ mov [rdi + 8], rax
+ mov rax, rdi
+ jmp MERGE_SORTED_LIST_END
MERGE_SORTED_LIST_RETURN_L1:
- mov rax, rdi
- ret
+ mov rax, rdi
+ ret
MERGE_SORTED_LIST_RETURN_L2:
- mov rax, rsi
+ mov rax, rsi
MERGE_SORTED_LIST_END:
- ret
+ ret
diff --git a/ft_read.s b/ft_read.s
index 7f8c5db..1728430 100644
--- a/ft_read.s
+++ b/ft_read.s
@@ -27,15 +27,15 @@ global M_FT_READ
section .text
; int ft_read(int, void*, size_t);
M_FT_READ:
- mov rax, M_SYSCALL_READ
- syscall
+ mov rax, M_SYSCALL_READ
+ syscall
%ifdef __LINUX__
cmp rax, 0
jl FT_READ_ERROR
%else
jc FT_READ_ERROR
%endif
- ret
+ ret
FT_READ_ERROR:
%ifdef __LINUX__
neg rax
@@ -43,5 +43,5 @@ FT_READ_ERROR:
push rax
call M_ERRNO_LOCATION wrt ..plt
pop qword [rax]
- mov rax, -1
- ret
+ mov rax, -1
+ ret
diff --git a/ft_strcmp.s b/ft_strcmp.s
index 7c55a43..bdab204 100644
--- a/ft_strcmp.s
+++ b/ft_strcmp.s
@@ -22,31 +22,31 @@ global M_FT_STRCMP
section .text
; int ft_strcmp(const char *s1, const char *s2);
M_FT_STRCMP:
- push r12
- push r13
- push rcx
- mov r12, rdi ; s1
- mov r13, rsi ; s2
- mov rcx, -1 ; index
+ push r12
+ push r13
+ push rcx
+ mov r12, rdi ; s1
+ mov r13, rsi ; s2
+ mov rcx, -1 ; index
FT_STRCMP_LOOP:
- inc rcx
- cmp byte [r12 + rcx], 0 ; check and of s1
- je FT_STRCMP_LOOP_END
- mov dl, byte [r12 + rcx]
- cmp dl, byte [r13 + rcx] ; s1[rcx] == s2[rcx]
- je FT_STRCMP_LOOP
+ inc rcx
+ cmp byte [r12 + rcx], 0 ; check and of s1
+ je FT_STRCMP_LOOP_END
+ mov dl, byte [r12 + rcx]
+ cmp dl, byte [r13 + rcx] ; s1[rcx] == s2[rcx]
+ je FT_STRCMP_LOOP
FT_STRCMP_LOOP_END:
- xor rax, rax
- mov al, byte [r12 + rcx]
- sub al, byte [r13 + rcx]
- jnc FT_STRCMP_END ; jump end if no substraction overflow
+ xor rax, rax
+ mov al, byte [r12 + rcx]
+ sub al, byte [r13 + rcx]
+ jnc FT_STRCMP_END ; jump end if no substraction overflow
- neg al ; negate al to cancel overflow
- neg eax ; negate the whole int since the function returns that type
+ neg al ; negate al to cancel overflow
+ neg eax ; negate the whole int since the function returns that type
FT_STRCMP_END:
- pop rcx
- pop r13
- pop r12
- ret
+ pop rcx
+ pop r13
+ pop r12
+ ret
diff --git a/ft_strcpy.s b/ft_strcpy.s
index eb8ea1a..d7cfac7 100644
--- a/ft_strcpy.s
+++ b/ft_strcpy.s
@@ -21,17 +21,17 @@ global M_FT_STRCPY
section .text
; char *ft_strcpy(char *dst, const char *src);
M_FT_STRCPY:
- push rbx
- push rcx
- mov rax, rdi ; dst
- mov rbx, rsi ; src
- mov rcx, -1
+ push rbx
+ push rcx
+ mov rax, rdi ; dst
+ mov rbx, rsi ; src
+ mov rcx, -1
FT_STRCPY_LOOP:
- inc rcx
- mov dl, byte [rbx + rcx]
- mov byte [rax + rcx], dl
- cmp byte [rbx + rcx], 0
- jne FT_STRCPY_LOOP
- pop rcx
- pop rbx
- ret
+ inc rcx
+ mov dl, byte [rbx + rcx]
+ mov byte [rax + rcx], dl
+ cmp byte [rbx + rcx], 0
+ jne FT_STRCPY_LOOP
+ pop rcx
+ pop rbx
+ ret
diff --git a/ft_strdup.s b/ft_strdup.s
index 346f2b4..09ae2ba 100644
--- a/ft_strdup.s
+++ b/ft_strdup.s
@@ -32,20 +32,20 @@ global M_FT_STRDUP
section .text
; char *ft_strdup(const char *str);
M_FT_STRDUP:
- push rdi ; save rdi because it will be overwrite for malloc
+ push rdi ; save rdi because it will be overwrite for malloc
- call M_FT_STRLEN ; rdi is still == str
- inc rax ; len++ for '\0'
+ call M_FT_STRLEN ; rdi is still == str
+ inc rax ; len++ for '\0'
- mov rdi, rax ; size to malloc
- call M_MALLOC wrt ..plt
- cmp rax, 0
- je FT_STRDUP_ERROR
+ mov rdi, rax ; size to malloc
+ call M_MALLOC wrt ..plt
+ cmp rax, 0
+ je FT_STRDUP_ERROR
- pop rsi ; original str as src
- mov rdi, rax ; allocated as dest
- call M_FT_STRCPY
- ret
+ pop rsi ; original str as src
+ mov rdi, rax ; allocated as dest
+ call M_FT_STRCPY
+ ret
FT_STRDUP_ERROR:
- pop rdi
- ret
+ pop rdi
+ ret
diff --git a/ft_strlen.s b/ft_strlen.s
index b0f84e7..d9b74cc 100644
--- a/ft_strlen.s
+++ b/ft_strlen.s
@@ -21,9 +21,9 @@ global M_FT_STRLEN
section .text
; int ft_strlen(char *);
M_FT_STRLEN:
- mov eax, -1
+ mov eax, -1
FT_STRLEN_LOOP:
- inc eax
- cmp byte [rdi + rax], 0 ; compare rbx[rax] and '\0'
- jne FT_STRLEN_LOOP
- ret
+ inc eax
+ cmp byte [rdi + rax], 0 ; compare rbx[rax] and '\0'
+ jne FT_STRLEN_LOOP
+ ret
diff --git a/ft_write.s b/ft_write.s
index 01ba580..0d723f7 100644
--- a/ft_write.s
+++ b/ft_write.s
@@ -27,15 +27,15 @@ global M_FT_WRITE
section .text
; int ft_write(int rdi, const void *rsi, size_t rdx);
M_FT_WRITE:
- mov rax, M_SYSCALL_WRITE
- syscall
+ mov rax, M_SYSCALL_WRITE
+ syscall
%ifdef __LINUX__
cmp rax, 0
jl FT_WRITE_ERROR
%else
jc FT_WRITE_ERROR
%endif
- ret
+ ret
FT_WRITE_ERROR:
%ifdef __LINUX__
neg rax
@@ -43,5 +43,5 @@ FT_WRITE_ERROR:
push rax
call M_ERRNO_LOCATION wrt ..plt
pop qword [rax]
- mov rax, -1
- ret
+ mov rax, -1
+ ret