private MemoryMatch findLast(AddressRange range, Address start, TaskMonitor monitor) {
		AddressableByteSequence searchBytes = bytes1;
		AddressableByteSequence extra = bytes2;
		extra.clear();

		if (range.contains(start)) {
			Address min = range.getMinAddress();
			Address max = range.getMaxAddress();
			range = new AddressRangeImpl(min, start);
			AddressRange remaining = new AddressRangeImpl(start.next(), max);
			AddressRange extraRange = new AddressRangeSplitter(remaining, chunkSize, true).next();
			extra.setRange(extraRange);
		}

		AddressRangeIterator it = new AddressRangeSplitter(range, chunkSize, false);

		while (it.hasNext()) {
			AddressRange next = it.next();
			searchBytes.setRange(next);
			MemoryMatch match = findLast(searchBytes, extra, monitor);
			if (match != null) {
				return match;
			}
			if (monitor.isCancelled()) {
				break;
			}

			// Flip flop the byte buffers, making the primary buffer the new extended buffer
			// and refilling the primary buffer with new data going backwards.
			extra = searchBytes;
			searchBytes = extra == bytes1 ? bytes2 : bytes1;
		}
		return null;
	}
Searches backwards starting at the given address until a match is found or
the beginning of the address set is reached. It does not currently wrap the search.
@param start the address to start searching
@param monitor the task monitor
@return the first match found or null if no match found.
Ghidra/Features/Base/src/main/java/ghidra/features/base/memsearch/searcher/MemorySearcher.java