43 lines
		
	
	
		
			932 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			43 lines
		
	
	
		
			932 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
/*	strchr()					Author: Kees J. Bot */
 | 
						|
/*								1 Jan 1994 */
 | 
						|
 | 
						|
/* char *strchr(const char *s, int c) */
 | 
						|
/*	Look for a character in a string. */
 | 
						|
/* */
 | 
						|
.text
 | 
						|
.globl	_strchr
 | 
						|
.balign	16
 | 
						|
_strchr:
 | 
						|
	push	%ebp
 | 
						|
	movl	%esp, %ebp
 | 
						|
	push	%edi
 | 
						|
	cld
 | 
						|
	movl	8(%ebp), %edi	/* edi = string */
 | 
						|
	movl	$16, %edx	/* Look at small chunks of the string */
 | 
						|
next:
 | 
						|
	shll	$1, %edx	/* Chunks become bigger each time */
 | 
						|
	movl	%edx, %ecx
 | 
						|
	xorb	%al, %al	/* Look for the zero at the end */
 | 
						|
 | 
						|
	repne scasb
 | 
						|
	pushf	/* Remember the flags */
 | 
						|
	subl	%edx, %ecx
 | 
						|
	negl	%ecx	/* Some or all of the chunk */
 | 
						|
	subl	%ecx, %edi	/* Step back */
 | 
						|
	movb	12(%ebp), %al	/* The character to look for */
 | 
						|
 | 
						|
	repne scasb
 | 
						|
	je	found
 | 
						|
	popf	/* Did we find the end of string earlier? */
 | 
						|
	jne	next	/* No, try again */
 | 
						|
	xorl	%eax, %eax	/* Return NULL */
 | 
						|
	pop	%edi
 | 
						|
	pop	%ebp
 | 
						|
	ret
 | 
						|
found:
 | 
						|
	pop	%eax	/* Get rid of those flags */
 | 
						|
	leal	-1(%edi), %eax	/* Address of byte found */
 | 
						|
	pop	%edi
 | 
						|
	pop	%ebp
 | 
						|
	ret
 |