diff options
| author | Charles <sircharlesaze@gmail.com> | 2019-11-22 21:20:22 +0100 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2019-11-22 21:20:22 +0100 |
| commit | 8e3a5ac569a3ccc1101b58fe8ef673f02b4961fb (patch) | |
| tree | 13b1910aee2a8c9a73af3ad2042cd78e4a0a9e90 /ft_atoi_base.s | |
| parent | ef74d8b236ba8c62ddb190ce64ea3d8b593ad1eb (diff) | |
| download | libasm-8e3a5ac569a3ccc1101b58fe8ef673f02b4961fb.tar.gz libasm-8e3a5ac569a3ccc1101b58fe8ef673f02b4961fb.tar.bz2 libasm-8e3a5ac569a3ccc1101b58fe8ef673f02b4961fb.zip | |
ft_atoi_base without the actual base, ft_list_push_front, ft_list_size
Diffstat (limited to 'ft_atoi_base.s')
| -rw-r--r-- | ft_atoi_base.s | 114 |
1 files changed, 87 insertions, 27 deletions
diff --git a/ft_atoi_base.s b/ft_atoi_base.s index bc675af..6245765 100644 --- a/ft_atoi_base.s +++ b/ft_atoi_base.s @@ -6,53 +6,113 @@ # By: cacharle <marvin@42.fr> +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2019/11/22 03:59:15 by cacharle #+# #+# # -# Updated: 2019/11/22 05:20:12 by cacharle ### ########.fr # +# Updated: 2019/11/22 21:18:08 by cacharle ### ########.fr # # # # **************************************************************************** # .globl _ft_atoi_base +.globl _check_base +# int ft_atoi_base(const char*, const char*); _ft_atoi_base: + push rbp # save previous stackframe + mov rbp, rsp # create new one + mov rbx, rdi # rbx = str mov rcx, rsi # rcx = base - xor rdx, rdx # rdx = 0 - - # remove spaces - FT_ATOI_BASE_SPACE_LOOP: - cmp byte ptr [rbx], 20h # if space jump next - je NEXT + mov rdi, rcx + call _check_base + cmp rax, 0 + je CHECK_BASE_ERROR - mov dl, byte ptr [rbx] # if \t\n\r\v\f jump next - sub dl, 9h - cmp dl, 5h - jl NEXT + mov rdi, rcx + call _ft_strlen + #mov r8, rax # r8 = radix + #mov rax, r8 - jmp FT_ATOI_BASE_SPACE_LOOP_END # if all above false end loop - NEXT: # next iteration - inc rbx - jmp FT_ATOI_BASE_SPACE_LOOP + xor rdx, rdx # rdx = 0 + FT_ATOI_BASE_SPACE_LOOP: # remove spaces + mov rdi, [rbx] + call ft_isspace + cmp rax, 1 + jne FT_ATOI_BASE_SPACE_LOOP_END + inc rbx + jmp FT_ATOI_BASE_SPACE_LOOP FT_ATOI_BASE_SPACE_LOOP_END: xor rax, rax # rax = 0 xor rdx, rdx # rdx = 0 - FT_ATOI_BASE_LOOP: - # while isdigit - cmp byte ptr [rbx], 30h - jl FT_ATOI_BASE_END # if *rbx < '0' jmp end + cmp byte ptr [rbx], 30h # while isdigit + jl FT_ATOI_BASE_END # if *rbx < '0' jmp end cmp byte ptr [rbx], 39h - ja FT_ATOI_BASE_END # if *rbx > '9' jmp end + ja FT_ATOI_BASE_END # if *rbx > '9' jmp end - imul eax, 10 # eax *= 10 - # dl = *str & 0x0F + imul eax, 10 # eax *= 10, shift previous digits mov dl, byte ptr [rbx] - and dl, 0x0F - add eax, edx # eax += dl (digit) - inc rbx # next char + and dl, 0x0F # char to digit + add eax, edx # insert as first digit + inc rbx jmp FT_ATOI_BASE_LOOP - FT_ATOI_BASE_END: - ret + pop rbp + ret +_base_pos: + mov rcx, rsi + xor rax, rax + BASE_POS_LOOP: + cmp byte ptr [rdi + rax], 0 + je BASE_POS_NOT_FOUND + cmp cl, byte ptr [rdi + rax] + je BASE_POS_FOUND + inc eax + jmp BASE_POS_LOOP + BASE_POS_NOT_FOUND: + mov eax, 0xFFFFFFFF + BASE_POS_FOUND: + ret +_check_base: + push rbx + mov rbx, rsp + + mov rbx, rdi # rbx = str + + call _ft_strlen # f strlen(rbx) < 2 + cmp eax, 2 + jl CHECK_BASE_ERROR + + CHECK_BASE_LOOP: + cmp byte ptr [rbx], 2bh # *rbx == '-' || *rbx == '+' + je CHECK_BASE_ERROR + cmp byte ptr [rbx], 2dh + je CHECK_BASE_ERROR + call ft_isspace + cmp rax, 1 + je CHECK_BASE_ERROR + + inc rbx + cmp byte ptr [rbx], 0h + jne CHECK_BASE_LOOP + mov rax, 1 + pop rbx + ret + CHECK_BASE_ERROR: + xor rax, rax + pop rbx + ret + +ft_isspace: + cmp byte ptr [rdi], 20h # if space jump next + je ISSPACE_TRUE_END + mov dl, byte ptr [rdi] # if \t\n\r\v\f jump next + sub dl, 9h + cmp dl, 5h + jl ISSPACE_TRUE_END + xor rax, rax + ret + ISSPACE_TRUE_END: + mov rax, 1 + ret |
