53 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
		
			Executable File
		
	
	
	
	
Notes on i80386 string assembly routines.		Author: Kees J. Bot
 | 
						|
								2 Jan 1994
 | 
						|
 | 
						|
Remarks.
 | 
						|
    All routines set up proper stack frames, so that stack traces can be
 | 
						|
    derived from core dumps.  String routines are often the ones that
 | 
						|
    get the bad pointer.
 | 
						|
 | 
						|
    Flags are often not right in boundary cases (zero string length) on
 | 
						|
    repeated string scanning or comparing instructions.  This has been
 | 
						|
    handled in sometimes nonobvious ways.
 | 
						|
 | 
						|
    Only the eax, edx, and ecx registers are not preserved, all other
 | 
						|
    registers are.  This is what GCC expects.  (ACK sees ebx as scratch
 | 
						|
    too.)  The direction byte is assumed to be wrong, and left clear on
 | 
						|
    exit.
 | 
						|
 | 
						|
Assumptions.
 | 
						|
    The average string is short, so short strings should not suffer from
 | 
						|
    smart tricks to copy, compare, or search large strings fast.  This
 | 
						|
    means that the routines are fast on average, but not optimal for
 | 
						|
    long strings.
 | 
						|
 | 
						|
    It doesn't pay to use word or longword operations on strings, the
 | 
						|
    setup time hurts the average case.
 | 
						|
 | 
						|
    Memory blocks are probably large and on word or longword boundaries.
 | 
						|
 | 
						|
    No unaligned word moves are done.  Again the setup time may hurt the
 | 
						|
    average case.  Furthermore, the author likes to enable the alignment
 | 
						|
    check on a 486.
 | 
						|
 | 
						|
String routines.
 | 
						|
    They have been implemented using byte string instructions.  The
 | 
						|
    length of a string it usually determined first, followed by the
 | 
						|
    actual operation.
 | 
						|
 | 
						|
Strcmp.
 | 
						|
    This is the only string routine that uses a loop, and not
 | 
						|
    instructions with a repeat prefix.  Problem is that we don't know
 | 
						|
    how long the string is.  Scanning for the end costs if the strings
 | 
						|
    are unequal in the first few bytes.
 | 
						|
 | 
						|
Strchr.
 | 
						|
    The character we look for is often not there, or at some distance
 | 
						|
    from the start.  The string is scanned twice, for the terminating
 | 
						|
    zero and the character searched, in chunks of increasing length.
 | 
						|
 | 
						|
Memory routines.
 | 
						|
    Memmove, memcpy, and memset use word or longword instructions if the
 | 
						|
    address(es) are at word or longword boundaries.  No tricks to get
 | 
						|
    alignment after doing a few bytes.  No unaligned operations.
 |