BEAR操作系统开发(1)

 从今天开始,我将开发操作系统了。我将她取名为'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编译成功的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值