diff options
| -rw-r--r-- | Makefile | 6 | ||||
| -rw-r--r-- | ft_atoi_base.s | 58 | ||||
| -rw-r--r-- | main.c | 64 |
3 files changed, 95 insertions, 33 deletions
@@ -6,7 +6,7 @@ # By: cacharle <marvin@42.fr> +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2019/11/22 02:56:22 by cacharle #+# #+# # -# Updated: 2019/11/22 03:02:47 by cacharle ### ########.fr # +# Updated: 2019/11/22 03:58:18 by cacharle ### ########.fr # # # # **************************************************************************** # @@ -15,7 +15,8 @@ NAME = libasm.a CC = gcc CCFLAGS = -masm=intel -m64 -ASMSRC = ft_strlen.s ft_strcpy.s ft_strcmp.s ft_write.s ft_read.s ft_strdup.s +ASMSRC = ft_strlen.s ft_strcpy.s ft_strcmp.s ft_write.s ft_read.s ft_strdup.s \ + ft_atoi_base.s ASMOBJ = $(ASMSRC:.s=.o) RM = rm -f @@ -31,6 +32,7 @@ test: all %.o: %.s $(CC) $(CCFLAGS) -c -o $@ $< + @#nasm -f macho64 -o $@ $< clean: $(RM) $(ASMOBJ) diff --git a/ft_atoi_base.s b/ft_atoi_base.s new file mode 100644 index 0000000..bc675af --- /dev/null +++ b/ft_atoi_base.s @@ -0,0 +1,58 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# ft_atoi_base.s :+: :+: :+: # +# +:+ +:+ +:+ # +# By: cacharle <marvin@42.fr> +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2019/11/22 03:59:15 by cacharle #+# #+# # +# Updated: 2019/11/22 05:20:12 by cacharle ### ########.fr # +# # +# **************************************************************************** # + +.globl _ft_atoi_base + +_ft_atoi_base: + 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 dl, byte ptr [rbx] # if \t\n\r\v\f jump next + sub dl, 9h + cmp dl, 5h + jl NEXT + + jmp FT_ATOI_BASE_SPACE_LOOP_END # if all above false end loop + NEXT: # next iteration + 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], 39h + ja FT_ATOI_BASE_END # if *rbx > '9' jmp end + + imul eax, 10 # eax *= 10 + # dl = *str & 0x0F + mov dl, byte ptr [rbx] + and dl, 0x0F + add eax, edx # eax += dl (digit) + inc rbx # next char + jmp FT_ATOI_BASE_LOOP + + FT_ATOI_BASE_END: + ret + + @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/11/22 02:02:24 by cacharle #+# #+# */ -/* Updated: 2019/11/22 03:17:39 by cacharle ### ########.fr */ +/* Updated: 2019/11/22 05:18:39 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,39 +19,41 @@ int ft_strcmp(const char *s1, const char *s2); int ft_write(int, const void*, size_t); int ft_read(int, void*, size_t); char *ft_strdup(const char*); - +int ft_atoi_base(const char*, const char*); int main() { - char *a = ""; - char *b = "a"; - printf("%d\n", sizeof(char*)); - printf("a: %p\n", (void*)a); - printf("b: %p\n", (void*)a); - printf("%d\n", ft_strlen(a)); - printf("%d\n", ft_strlen(b)); - printf("%d\n", ft_strlen("bonjour")); - - char c[32] = "bon"; - char *d = "bonjourasdfasdf"; - printf("%s\n", ft_strcpy(c, d)); - printf("%s\n", c); - - char *e = "\x03"; - char *f = "\x02"; - printf("%d\n", ft_strcmp(e, f)); - printf("%d\n", strcmp(e, f)); - - ft_write(1, "bon\n", 4); - - char g[32]; - int ret = ft_read(0, g, 2); - g[ret] = 0; - printf("%s\n", g); - - char *h = ft_strdup("bonjour"); - printf("%s\n", h); - free(h); + /* char *a = ""; */ + /* char *b = "a"; */ + /* printf("%d\n", sizeof(char*)); */ + /* printf("a: %p\n", (void*)a); */ + /* printf("b: %p\n", (void*)a); */ + /* printf("%d\n", ft_strlen(a)); */ + /* printf("%d\n", ft_strlen(b)); */ + /* printf("%d\n", ft_strlen("bonjour")); */ + /* */ + /* char c[32] = "bon"; */ + /* char *d = "bonjourasdfasdf"; */ + /* printf("%s\n", ft_strcpy(c, d)); */ + /* printf("%s\n", c); */ + /* */ + /* char *e = "\x03"; */ + /* char *f = "\x02"; */ + /* printf("%d\n", ft_strcmp(e, f)); */ + /* printf("%d\n", strcmp(e, f)); */ + /* */ + /* ft_write(1, "bon\n", 4); */ + /* */ + /* char g[32]; */ + /* int ret = ft_read(0, g, 2); */ + /* g[ret] = 0; */ + /* printf("%s\n", g); */ + /* */ + /* char *h = ft_strdup("bonjour"); */ + /* printf("%s\n", h); */ + /* free(h); */ + + printf("%d\n", ft_atoi_base(" \t\v\r \n 101h", "01")); return 0; } |
