diff options
Diffstat (limited to 'zap/source/amd64/mem/memfnd.S')
-rw-r--r-- | zap/source/amd64/mem/memfnd.S | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/zap/source/amd64/mem/memfnd.S b/zap/source/amd64/mem/memfnd.S new file mode 100644 index 0000000..0b5a47e --- /dev/null +++ b/zap/source/amd64/mem/memfnd.S @@ -0,0 +1,50 @@ +# 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_memfnd + +zap_memfnd: +# Address of the current element: +#define addr %rax +# Address of the first element: +#define start %rdi +# Address of the element after the last element: +#define afterbuf %rsi +# Byte value: +#define cmp %dl +# Current byte: +#define val %cl + + movq start,addr # addr = start + + addq start,afterbuf # afterbuf += start + + # Iterate over the array: +.loop: + + # Check if we have reached the end of the array: + cmpq addr,afterbuf # if (addr == afterbuf) + je .nfnd # goto nfnd + + # Check if we have found the byte value: + movb (addr),val # val = *addr + cmpb val,cmp # if (val == cmp) + je .fnd # goto fnd + + # Continue to the next byte: + incq addr # ++addr + jmp .loop # goto loop + + # Found: +.fnd: + + # Get the offset of the byte: + subq start,addr # addr -= start + ret # return addr + + # Not found: +.nfnd: + + movq $0xFFFFFFFFFFFFFFFF,addr # addr = FFFFFFFFFFFFFFFF + ret # return addr |