aboutsummaryrefslogtreecommitdiff
path: root/ft_strcmp.s
diff options
context:
space:
mode:
Diffstat (limited to 'ft_strcmp.s')
-rw-r--r--ft_strcmp.s41
1 files changed, 32 insertions, 9 deletions
diff --git a/ft_strcmp.s b/ft_strcmp.s
index 4c5aee7..216b56a 100644
--- a/ft_strcmp.s
+++ b/ft_strcmp.s
@@ -1,12 +1,35 @@
+.globl _ft_strcmp
+
_ft_strcmp:
- mov eax, sp
- mov ebx, sp + 8
+ mov rax, rdi # s1
+ mov rbx, rsi # s2
+ xor rcx, rcx
FT_STRCMP_LOOP:
- cmp eax, 0
- jneq FT_STRCMP_LOOP
- cmp ebx, 0
- jneq FT_STRCMP_LOOP
- cmp eax, ebx
- jeq FT_STRCMP_LOOP
- sub eax, ebx
+ cmp byte ptr [rax + rcx], 0
+ je FT_STRCMP_LOOP_END
+ cmp byte ptr [rbx + rcx], 0
+ je FT_STRCMP_LOOP_END
+ mov dl, byte ptr [rax + rcx]
+ cmp dl, byte ptr [rbx + rcx]
+ jne FT_STRCMP_LOOP_END
+ inc rcx
+ jmp FT_STRCMP_LOOP
+ FT_STRCMP_LOOP_END:
+ mov dl, byte ptr [rax + rcx]
+ cmp dl, byte ptr [rbx + rcx]
+ jl FT_STRCMP_S1_LOWER
+ # s1 >= s2
+ mov rdx, rax
+ xor rax, rax
+ mov al, [rdx + rcx]
+ sub al, [rbx + rcx]
+ ret
+ # s1 < s2
+ FT_STRCMP_S1_LOWER:
+ mov rdx, rax
+ xor rax, rax
+ mov al, [rbx + rcx]
+ sub al, [rdx + rcx]
+ not eax # two's complement
+ inc eax
ret