diff --git a/src/ft_atoibase.asm b/src/ft_atoibase.asm index e90f37b..c8206dd 100644 --- a/src/ft_atoibase.asm +++ b/src/ft_atoibase.asm @@ -41,9 +41,9 @@ check_base: je .done ; if (*p == '-' || *p == '+') return -1 - cmp dl, 45 ; '-' + cmp dl, 45 je .error - cmp dl, 43 ; '+' + cmp dl, 43 je .error ; r10(idx) = *p / 32 @@ -83,12 +83,11 @@ check_base: mov rax, -1 jmp .return +; skip whitespace and sign ; rdi: str -; skip whitespace -; return : -; rax str + x +; return: +; rax str + x + is_signed ; dl is_signed -; rax = 0 if 2 sign find_start: push r12 mov r12, rdi @@ -118,27 +117,6 @@ find_start: inc rax ret -; rdi base -; rsi char -is_in_base: -.loop: - mov dl, byte [rdi] - test dl, dl - je .is_not_in - - cmp dl, sil - je .is_in - - inc rdi - jmp .loop - -.is_in: - mov rax, 1 - ret - -.is_not_in: - xor rax, rax - ret ; rdi: base ; rsi: char @@ -147,12 +125,12 @@ is_in_base: ; int i = 0 ; while i < baselen ; if (c == base[i]) -; return 1 +; return base[i] ; inc i ; return -1 get_num_from_base: - xor rax, rax; rax = i = 0 + xor rax, rax .loop: cmp rax, rdx @@ -199,7 +177,6 @@ ft_atoibase: mov r12, rax mov r15b, dl - ; r11 = r = 0 xor r11, r11 .loop: cmp byte [r12], 0 @@ -216,9 +193,10 @@ ft_atoibase: test rax, rax jl .end_loop - mul r11, r14 + imul r11d, r14d + jo .overflow add r11, rax - ; r += rax + jc .overflow inc r12 jmp .loop @@ -246,5 +224,7 @@ ft_atoibase: jmp .done .overflow: - xor rax, rax ; TODO: LONG_MAX | LONG_MIN - jmp .done + call __errno_location wrt ..plt + mov dword [rax], 34 + xor rax, rax + jmp .cleanup