参考:linux 内核0.11 /include/sys/string.h
1. 将一个字符串(src)拷贝到另一个字符串(dest),直到遇到NULL 字符后停止。
char *strcpy (char *dest, const char *src)
...{
_asm
...{
pushf
mov esi,src
mov edi,dest
cld
l1: lodsb
stosb
test al,al
jne l1
popf
}
return dest;
}

2.拷贝源字符串count 个字节到目的字符串。
char *strncpy (char *dest, const char *src, int count)
...{
_asm...{
pushf
mov esi,src
mov edi,dest
mov ecx,count
cld
l1: dec ecx
js l2
lodsb
stosb
test al,al
jne l1
rep stosb
l2: popf
}
return dest;
}
3.将源字符串拷贝到目的字符串的末尾处。
char *strcat (char *dest, const char *src)
...{
_asm ...{
pushf
mov esi,src
mov edi,dest
xor al,al
mov ecx,0xffffffff
cld // 清方向位。
repne scasb
dec edi
l1: lodsb
stosb
test al,al
jne l1
popf
}
return dest;
}
4.将源字符串的count 个字节复制到目的字符串的末尾处,最后添一空字符。
char *strncat (char *dest, const char *src, int count)
...{
_asm ...{
pushf
mov esi,src
mov edi,dest
xor al,al
mov ecx,0xffffffff
cld
repne scasb
dec edi
mov ecx,count
l1: dec ecx
js l2
lodsb
stosb
test al,al
jne l1
l2: xor al,al
stosb
popf
}
return dest;
}
5. 将一个字符串与另一个字符串进行比较。
int strcmp (const char *csrc, const char *ct)
...{
_asm...{
pushf
mov edi,csrc
mov esi,ct
cld
l1: lodsb
scasb
jne l2
test al,al
jne l1
xor eax,eax
jmp l3
l2: mov eax,1
jl l3
neg eax
l3: popf
}
}
本文探讨了如何使用C语言和汇编语言在Linux内核0.11版本中实现基本的字符串处理函数,通过分析#include <sys/string.h>中的相关代码,揭示底层操作的细节。
1162

被折叠的 条评论
为什么被折叠?



