从今天开始,我将开发操作系统了。我将她取名为'BEAR',小熊的意思,因为我的一个朋友喜欢小熊,所以就用它了。其实'BEAR‘还有另外一个意思,就是'忍受',忍受学习的压力和痛苦,这样才会有所收获。我模仿的linux0.11的内核源代码,现在主要将它的string头文件移植到x86系统上面。今天完成了7个字符串操作函数。
分别为
/*
说明:pstring.h头文件为字符串处理函数的集合
作者:金鑫鑫
日期:2009-11-1
版本:0.0
*/
/*本函数实现字符串的复制*/
extern inline char *pstrcpy(char *dest,const char *src)
{
_asm
{
mov esi,src
mov edi,dest
cld
again:
lodsb
stosb
test al,al
jne again
}
return dest;
}
/*
本函数实现有限个字符串的复制
要求:
当count的数目大于等于数组的最大长度时会产生RUNTIME ERROR错误,所以注意count的大小
*/
extern inline char *pstrncpy(char *dest,const char *src,int count)
{
_asm
{
mov ecx,count
cld
mov esi,src
mov edi,dest
again:
dec ecx
js exit ;当count<0时 转到exit 添加末尾0推出
lodsb
stosb
test al,al
jne again ;如果源字符串没有达到末尾,继续
mov al,0 ;源字符串达到了末尾但是复制的个数小于count时,余下的添加0
rep stosb
exit:
mov al,0 ;复制的个数小于源字符串的长度时,目的字符串末尾添加0
stosb
}
return dest;
}
/*
本函数实现字符串的连接。
要求:
使用时注意目的字符串的长度要大于等于目的字符串和源字符串的长度之和。
*/
extern inline char *pstrcat(char *dest,const char *src)
{
_asm
{
mov cx,0xffffffff
mov eax,0h
mov esi,src
mov edi,dest
cld
repnz scasb ;将AL的值和ES:[EDI]的值进行比较 如果相等,则退出,此时EDI指向下一个字符
dec edi
again:
lodsb
stosb
test al,al
jne again
}
return dest;
}
/*
本函数实现字符串的有限个数的连接,要求和pstrcat相同
*/
extern inline char *pstrncat(char *dest,const char *src,int count)
{
_asm
{
mov cx,0xffffffff
mov eax,0h
mov esi,src
mov edi,dest
cld
repnz scasb
dec edi
mov ecx,count
again:
dec ecx
js exit
lodsb
stosb
test al,al
jne again
exit:
xor al,al
stosb
}
return dest;
}
/*
本函数比较两个字符串的大小
str1 > str2 返回 1
str1 < str2 返回 -1
str1 == str2 返回0
*/
extern inline int pstrcmp(const char *str1,const char *str2)
{
int result;
_asm
{
mov esi,str2 ;使用lodsb读取DS:[ESI]-->AL中
mov edi,str1 ;使用scasb读取ES:[EDI]
cld
again:
lodsb ;读取str2中字符
scasb
jne next
test al,al
jne again
xor eax,eax ;放两字符串同时到达结尾时,它们相等,返回0
jmp exit
next:
mov eax,1
jl exit ;如果str2(AL)中的值小于str1返回1
neg eax ;否则返回0
exit:
mov result,eax
}
return result;
}
/*
实现两个字符串有限个字符的比较
要求:比较的字符数目要大于0
*/
extern inline int pstrncmp(const char *str1,const char *str2,int count)
{
int result;
_asm
{
mov esi,str2 ;使用lodsb读取DS:[ESI]-->AL中
mov edi,str1 ;使用scasb读取ES:[EDI]
mov ecx,count
cld
again:
dec ecx
js exitl
lodsb ;读取str2中字符
scasb
jne next
test al,al
jne again
xor eax,eax ;放两字符串同时到达结尾时,它们相等,返回0
jmp exit
next:
mov eax,1
jl exit ;如果str2(AL)中的值小于str1返回1
neg eax ;否则返回0
exit:
mov result,eax
jmp exitend
exitl: ;当比较前count个字符的count小于0时 ,说明二者相等
xor eax,eax
mov result,eax
exitend:
}
return result;
}
/*
本函数实现在一个字符串中查找指定字符,如果找到返回该字符指针,否则返回NULL的操作
说明:当所查找的字符在字符串中时可以用(*strchr(str,c))来获得字符,但是当该字符不
在字符串中时,则不可以用这种方法。否则会出错。
*/
extern inline char *pstrchr(const char *string,int c)
{
char *result;
_asm
{
mov esi,string
xor eax,eax
mov eax,c
mov ah,al
cld
again:
lodsb
cmp ah,al
je eql
test al,al
jnz again
xor eax,eax
mov result,eax
jmp exit
eql:
dec esi
mov eax,esi
mov result,eax
exit:
}
return result;
}
本源代码是用VS2008编译成功的。