# 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 = 0xFFFFFFFFFFFFFFFF ret # return addr