0e9a5612d7
Moved some calls back. |
||
---|---|---|
.. | ||
_memmove.s | ||
_strncat.s | ||
_strncmp.s | ||
_strncpy.s | ||
_strnlen.s | ||
bcmp.s | ||
bcopy.s | ||
bzero.s | ||
index.s | ||
Makefile.in | ||
memchr.s | ||
memcmp.s | ||
memcpy.s | ||
memmove.s | ||
memset.s | ||
README | ||
rindex.s | ||
strcat.s | ||
strchr.s | ||
strcmp.s | ||
strcpy.s | ||
strlen.s | ||
strncat.s | ||
strncmp.s | ||
strncpy.s | ||
strnlen.s | ||
strrchr.s |
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.