diff options
Diffstat (limited to 'zap/source/amd64/mem/strfnd.S')
-rw-r--r-- | zap/source/amd64/mem/strfnd.S | 48 |
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 |