aboutsummaryrefslogtreecommitdiff
path: root/ft_atoi_base.s
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 /ft_atoi_base.s
parentcd5c9e6a923878e797212d27476ee217eb844a14 (diff)
downloadlibasm-d6240e3f6aeb342aaf13284c7cc93226970648aa.tar.gz
libasm-d6240e3f6aeb342aaf13284c7cc93226970648aa.tar.bz2
libasm-d6240e3f6aeb342aaf13284c7cc93226970648aa.zip
Replaced tab with spaces
Diffstat (limited to 'ft_atoi_base.s')
-rw-r--r--ft_atoi_base.s282
1 files changed, 141 insertions, 141 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