aboutsummaryrefslogtreecommitdiff
path: root/ft_strcmp.s
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2019-11-22 02:35:31 +0100
committerCharles <sircharlesaze@gmail.com>2019-11-22 02:35:31 +0100
commitb22183ba021d9ab3418d8f47545708597247e583 (patch)
tree079af4d3d360a72908782abead1f4b272155bd18 /ft_strcmp.s
parent0931febe3e178b4e484259c9cdc79ef452208ae7 (diff)
downloadlibasm-b22183ba021d9ab3418d8f47545708597247e583.tar.gz
libasm-b22183ba021d9ab3418d8f47545708597247e583.tar.bz2
libasm-b22183ba021d9ab3418d8f47545708597247e583.zip
strcpy, strcmp, write, read
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