diff options
| author | Charles Cabergs <me@cacharle.xyz> | 2021-02-11 15:44:44 +0100 |
|---|---|---|
| committer | Charles Cabergs <me@cacharle.xyz> | 2021-02-11 15:44:44 +0100 |
| commit | d6240e3f6aeb342aaf13284c7cc93226970648aa (patch) | |
| tree | a5fef5bd1d55e0dd63cb986a445254cf8caa94ce /ft_atoi_base.s | |
| parent | cd5c9e6a923878e797212d27476ee217eb844a14 (diff) | |
| download | libasm-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.s | 282 |
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 |
