aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile6
-rw-r--r--ft_atoi_base.s58
-rw-r--r--main.c64
3 files changed, 95 insertions, 33 deletions
diff --git a/Makefile b/Makefile
index 2c4a029..21ebf11 100644
--- a/Makefile
+++ b/Makefile
@@ -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
+
+
diff --git a/main.c b/main.c
index 52a3db3..dcde391 100644
--- a/main.c
+++ b/main.c
@@ -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;
}