Linux0.11内核源码解析-string待更新

sting.h头文件包含了所有的字符串操作函数

strcpy字符串拷贝函数

cld 指令用于设置方向标志位,确保字符串复制是从前向后进行。

lodsb 指令用于将 src 指针指向的字符加载到 AL 寄存器中,并将 src 指针递增。

stosb 指令用于将 AL 寄存器中的字符存储到 dest 指针指向的位置,并将 dest 指针递增。

testb %%al,%%al 指令用于将 AL 寄存器中的字符与自身进行逻辑与操作,检查是否为零(字符串结束标志)。

jne 1b 指令用于跳转到标号 1 处,即继续复制下一个字符,如果 AL 寄存器中的字符不为零。

::\"S\" (src),\"D\" (dest) 表示输入输出约束,将 src 和 dest 分别绑定到 S 和 D 寄存

extern inline char * strcpy(char * dest,const char *src)
{
__asm__("cld\n"
	"1:\tlodsb\n\t"
	"stosb\n\t"
	"testb %%al,%%al\n\t"
	"jne 1b"
	::"S" (src),"D" (dest));
return dest;
}

strcnpy字符串拷贝指定长度函数

使用cld指令将方向标志位清零,确保字符串拷贝是从源字符串的低地址向高地址进行的。

使用decl指令将count减1,判断count是否大于等于0,如果小于0,则跳转到标号2处。

使用lodsb指令将源字符串中的一个字节加载到AL寄存器中。

使用stosb指令将AL寄存器中的字节存储到目标字符串中。

使用testb指令判断AL寄存器中的字节是否为0,如果不为0,则跳转到标号1处,继续拷贝下一个字节。

使用rep stosb指令将字符串结束的0字节存储到目标字符串中。

标号2处表示字符串拷贝结束。

static inline char * strncpy(char * dest,const char *src,int count)
{
__asm__("cld\n"
	"1:\tdecl %2\n\t"
	"js 2f\n\t"
	"lodsb\n\t"
	"stosb\n\t"
	"testb %%al,%%al\n\t"
	"jne 1b\n\t"
	"rep\n\t"
	"stosb\n"
	"2:"
	::"S" (src),"D" (dest),"c" (count));
return dest;
}

strcat将源字符串拷贝到目的字符串后

使用cld指令将方向标志位清零,确保字符串连接是从源字符串的低地址向高地址进行的。

使用repne scasb指令在目标字符串中搜索字符串结束的0字节。

使用decl指令将目标字符串的指针减1,指向字符串结束的0字节的位置。

标号1处表示字符串连接的循环开始。

使用lodsb指令将源字符串中的一个字节加载到AL寄存器中。

使用stosb指令将AL寄存器中的字节存储到目标字符串中。

使用testb指令判断AL寄存器中的字节是否为0,如果不为0,则跳转到标号1处,继续连接下一个字节。

extern inline char * strcat(char * dest,const char * src)
{
__asm__("cld\n\t"
	"repne\n\t"
	"scasb\n\t"
	"decl %1\n"
	"1:\tlodsb\n\t"
	"stosb\n\t"
	"testb %%al,%%al\n\t"
	"jne 1b"
	::"S" (src),"D" (dest),"a" (0),"c" (0xffffffff));
return dest;
}

strncat将源字符串指定长度拷贝到目的字符串后

"cld":将方向标志位清零,确保字符串操作是向前进行的。

"repne scasb":从目标字符串的当前位置开始,逐个比较字符串中的字节,直到遇到字符串结束的0字节或者搜索完整个字符串。

"decl %1":将目标字符串指针dest的值减1,使其指向字符串结束的0字节的位置。

"movl %4,%3":将count的值移动到计数器寄存器ecx中,用于控制拼接的字符数量。

"1:":定义一个标号,用于后续的循环。

"decl %3":将计数器寄存器ecx的值减1。

"js 2f":如果计数器寄存器ecx的值为负,跳转到标号2处,结束循环。

"lodsb":将源字符串src中的一个字节加载到累加器al中。

"stosb":将累加器al中的字节存储到目标字符串dest中。

"testb %%al,%%al":将累加器al中的字节与自身进行逻辑与操作,设置相应的标志位。

"jne 1b":如果累加器al中的字节不为0,跳转到标号1处,继续循环。

"2:":定义一个标号,用于结束循环后的操作。

"xorl %2,%2":将累加器eax的值与自身进行异或操作,将其清零。

"stosb":将累加器al中的字节存储到目标字符串dest中。

static inline char * strncat(char * dest,const char * src,int count)
{
__asm__("cld\n\t"
	"repne\n\t"
	"scasb\n\t"
	"decl %1\n\t"
	"movl %4,%3\n"
	"1:\tdecl %3\n\t"
	"js 2f\n\t"
	"lodsb\n\t"
	"stosb\n\t"
	"testb %%al,%%al\n\t"
	"jne 1b\n"
	"2:\txorl %2,%2\n\t"
	"stosb"
	::"S" (src),"D" (dest),"a" (0),"c" (0xffffffff),"g" (count)
	);
return dest;
}

相关推荐

  1. Linux0.11内核解析-string更新

    2023-12-13 13:08:04       42 阅读
  2. Linux0.11内核解析-printk

    2023-12-13 13:08:04       34 阅读
  3. spring解析(六)

    2023-12-13 13:08:04       36 阅读
  4. spring解析(七)

    2023-12-13 13:08:04       40 阅读
  5. Linux内核】进程管理模块

    2023-12-13 13:08:04       28 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-13 13:08:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-13 13:08:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-13 13:08:04       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-13 13:08:04       20 阅读

热门阅读

  1. 什么是强缓存和协商缓存?

    2023-12-13 13:08:04       35 阅读
  2. PostgreSQL数据库切换到另一个模式下

    2023-12-13 13:08:04       31 阅读
  3. filebeat 后端运行,自动退出解决

    2023-12-13 13:08:04       38 阅读
  4. C : DS静态查找之顺序索引查找

    2023-12-13 13:08:04       41 阅读
  5. HTB Ouija

    2023-12-13 13:08:04       32 阅读
  6. JRT实现Cache的驱动

    2023-12-13 13:08:04       45 阅读
  7. go标记omitempty的含义

    2023-12-13 13:08:04       39 阅读
  8. c++基于流文件输入输出的综合程序设计

    2023-12-13 13:08:04       39 阅读
  9. 你在地铁上修过bug吗?

    2023-12-13 13:08:04       39 阅读
  10. reactHooks之useDeferredValue

    2023-12-13 13:08:04       45 阅读
  11. 12.12每日一题(备战蓝桥杯循环输出)

    2023-12-13 13:08:04       30 阅读