summaryrefslogtreecommitdiff
path: root/zap/source/amd64/mem/strfnd.S
diff options
context:
space:
mode:
Diffstat (limited to 'zap/source/amd64/mem/strfnd.S')
-rw-r--r--zap/source/amd64/mem/strfnd.S48
1 files changed, 48 insertions, 0 deletions
diff --git a/zap/source/amd64/mem/strfnd.S b/zap/source/amd64/mem/strfnd.S
new file mode 100644
index 0000000..d9c99f3
--- /dev/null
+++ b/zap/source/amd64/mem/strfnd.S
@@ -0,0 +1,48 @@
+# Copyright 2022 Gabriel Jensen.
+# This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
+# If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+.globl zap_strfnd
+
+zap_strfnd:
+# Address of the first character:
+#define start %rdi
+# Character to be found:
+#define cmp %sil
+# Address of the current character:
+#define addr %rax
+# Current character:
+#define chr %dl
+
+ movq start,addr # addr = start
+
+ # Iterate over the string:
+.loop:
+
+ # Copy the character into a register:
+ movb (addr),chr # chr = *addr
+
+ # Check if we have found the character:
+ cmpb chr,cmp # if (chr == cmp)
+ je .fnd # goto fnd
+
+ # Check if we have found the null-terminator:
+ testb chr,chr # if (chr == 0x0)
+ jz .nfnd # goto nfnd
+
+ # Continue to the next character:
+ incq addr # ++addr
+ jmp .loop # goto loop
+
+ # Found:
+.fnd:
+
+ # Get the offset of the character:
+ subq start,addr # addr -= start
+ ret # return addr
+
+ # Not found:
+.nfnd:
+
+ movq $0xFFFFFFFFFFFFFFFF,addr # addr = FFFFFFFFFFFFFFFF
+ ret # return addr