53 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 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.
 | 
