Minix1.5/lib/string/strcmp.x
/* strcmp.x
* int strcmp(const char *s1, const char *s2)
*
* Compares the strings pointed to by s1 and s2. Returns zero if
* strings are identical, a positive number if s1 greater than s2,
* and a negative number otherwise.
*/
.define _strcmp
.text
_strcmp:
mov bx,si /* save si and di */
mov cx,di
mov di,sp
mov si,2(di)
mov di,4(di)
xor ax,ax /* default return is equality */
cmp si,di
je exit /* early exit if s1 == s2 */
cld
test si,#1 /* align s1 on word boundary */
jz setup_loop
lodb
orb al,al
jz last_byte_test
cmpb al,(di)
jne last_byte_test
inc di
setup_loop:
sub di,#2 /* set up for faster loop */
word_loop: /* loop through string by words */
lodw
add di,#2
orb al,al
jz last_byte_test
cmp ax,(di)
jne find_mismatch
orb ah,ah
jnz word_loop
xor ax,ax
jmp exit
find_mismatch:
cmpb al,(di)
jne last_byte_test
movb al,ah
inc di
last_byte_test: /* Expects: (al)=char of s1; (di)->char of s2 */
xorb ah,ah
subb al,(di)
sbbb ah,ah
exit:
mov si,bx /* restore si and di */
mov di,cx
ret