当前位置: 首页 > news >正文

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;
}

相关文章:

  • 面试题目总结(三)
  • HTML5 Audio/Video 标签、属性、方法、事件汇总
  • 使用Mockjs模拟(假数据)接口(axios)
  • 常见的设计模式-简述
  • Mars3d的gltf零部件控制(运载火箭)示例关于gltf内部的animations说明
  • 零元购:一种新型的消费模式?
  • 如何写出高质量博客的思考
  • 数据库产品层出不穷,金融行业应该怎么选?|飞轮科技联合创始人连林江
  • Gitlab+GitlabRunner搭建CICD自动化流水线将应用部署上Kubernetes
  • 数字化转型对企业有什么好处?
  • Java UDP 多人聊天室简易版
  • MySQL注入入门简述
  • 安防视频监控系统EasyNVR平台集成后无法播放的原因与解决步骤
  • 如何将CAD图纸导入Revit软件?
  • 五、HotSpot细节实现
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • flask接收请求并推入栈
  • iOS编译提示和导航提示
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • mysql 5.6 原生Online DDL解析
  • python 学习笔记 - Queue Pipes,进程间通讯
  • spring-boot List转Page
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • vue自定义指令实现v-tap插件
  • 构建工具 - 收藏集 - 掘金
  • 技术:超级实用的电脑小技巧
  • 前端设计模式
  • 如何选择开源的机器学习框架?
  • 通过几道题目学习二叉搜索树
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 自制字幕遮挡器
  • MyCAT水平分库
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #includecmath
  • #QT(串口助手-界面)
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (6)STL算法之转换
  • (6)添加vue-cookie
  • (C语言)二分查找 超详细
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (六)c52学习之旅-独立按键
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (顺序)容器的好伴侣 --- 容器适配器
  • (转)创业的注意事项
  • ******之网络***——物理***
  • .libPaths()设置包加载目录
  • .NET Core 2.1路线图
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容