25 strlen 的调试

news/2024/11/17 9:55:44/

前言

同样是一个 很常用的 glibc 库函数 

不管是 用户业务代码 还是 很多类库的代码, 基本上都会用到 字符串长度的计算  

不过 我们这里是从 具体的实现 来看一下 

它的实现 主要是使用 汇编 来进行实现的, 因此 理解需要一定的基础 

测试用例

就是简单的使用了一下 strcpy, strlen 

root@ubuntu:~/Desktop/linux/HelloWorld# cat Test03Strcpy.c 
#include "stdio.h"int main(int argc, char** argv) {int x = 2;
int y = 3;
int z = x + y;char* p1 = (char*) malloc(20);
char* p2 = (char*) malloc(20);
printf("p1 : 0x%x\n", p1);
printf("p2 : 0x%x\n", p2);memset(p1, 'a', 12);
strcpy(p2, p1);
int p2Len = strlen(p2); printf(" p1 = %s, p2 = %s, p2Len = %d\n ", p1, p2, p2Len);}

strlen 的实现

先试判断 前面16字节, 然后再处理后面 48 字节 

取开始的十六个字节到 xmm4, 然后和 0 做 pcmpeqb [如果某一个字节为 0, 则将该字节置为 0xff, 否则置为 0], 值保存在 xmm4 

将 xmm4 末尾的十六字节的数据转换到 rdx 

如果 edx 为 0, 则表示 前16字节均不为 0, 跳到处理 接下来的 48 字节的流程 

否则 通过 bsf 指令获取 edx 第一个不为 0 的索引, 给 ax 返回 

如果前面 16 字节均不为 0 

则接下来处理接下来的的 48 字节, 道理类似, 讲接下来的 48 字节以 16字节 为单位 和 0 进行比较, 比较结果分别 存储在 dx, r8, cx, 然后 将最终结果 merge 到 rdx 

如果 接下来的 48 字节均不为 0, 跳转到后面循环处理 

否则 通过 bsfq 指令获取 edx 第一个不为 0 的索引, 给 ax 返回 

PCMPEQB/PCMPEQW/PCMPEQD — Compare Packed Data for Equal

PMOVMSKB — Move Byte Mask

对于 前面 64 字节均不为 0 的场景, 接下来的处理如下 

以 64 字节为单位来进行比较, 然后 找到存在 0 的一组 

然后 计算当前偏移 减去原始地址, 即为当前字符串的长度 

PMINUB/PMINUW — Minimum of Packed Unsigned Integers

strlen 实例

上面的 case, 调用 strlen 的地方 

其中 rdi 为传入的 字符串的地址 

rdx 为 前面十六字节 和 0 做 pcmpeqb 操作之后的结果 

通过 bsf 指令获取 rdx 中第一个为 1 的索引, 存储在 ax 中, 为 12 


http://www.ppmy.cn/news/182305.html

相关文章

电冰箱保护器C语言程序,五功能电冰箱保护器(CD4060、C043、C033)

如图所示为五功能电冰箱保护器电路。该保护器由时基信号发生器、电网电压监视电路,整形电路、电器控制电路、漏电报警电路等组成。 时基信号发生器由IC1(CD4060)和R1、R2、W1、C1等组成。其产生5分40秒、22分30秒和12小时3种时间信号,时间信号经IC2(C043…

win10系统office2019下载安装

下载 先从百度网盘下载一个压缩包,不大只有10M,解压后,找到OInstall.exe文件,双击运行就可以了。 压缩包下载链接: 链接: https://pan.baidu.com/s/1I-5XF7cFWeqK2rSOKNMfbg 提取码: zjzj安装 安装的步骤有些需要注…

2022年小家电行业分析

中国报告大厅网讯,小家电行业在疫情期间市场规模不降反而增长不少,宅家经济下带动了小家电行业的发展,消费群体主要是年轻消费者,小家电已经进入了新发展阶段。下是2022年小家电行业分析。 小家电作为近几年兴起的新消费产物&…

Docker Desktop for Windows

1. 原理 WSL2下原生linux安装docker方式和完全linux虚拟机安装docker类似,区别在于WSL2下的linux不支持systemd。Docker Desktop for windows方式,其实质是利用docker的C/S架构,将windows模式下的docker对应docker.sock,docker客…

查询水果价格

给定四种水果,分别是苹果(apple)、梨(pear)、桔子(orange)、葡萄(grape),单价分别对应为3.00元/公斤、2.50元/公斤、4.10元/公斤、10.20元/公斤。 首先在屏幕…

防止电冰箱结霜的小窍门

冰箱结霜可是一件麻烦事,因为每次除霜都得先给冰箱断电,这样不光冰箱里的食物会受到影响,还弄的到处都是水,真是让人头疼啊。难道就没有一个好的办法,让冰箱少结点霜吗? 其实啊咱们日常生活中所用的食用油。…

Redis指令

https://www.runoob.com/redis/sets-srem.html 1.Sadd 2.Srem 3.SEMBERS 4.SCARD 5.Shut down

淘宝监控竞品sku数据接口

电商竞品数据监控查询可以通过以下几个步骤实现: 确定需要监控的竞品:首先需要明确自己店铺的产品定位和竞争对手,选择需要监控的竞品。 选择监控工具:根据需求和预算选择适合自己的电商竞品数据监控工具,例如谷歌分析…