专业汉语词典知识平台,分享汉字词语知识、历史文学知识解答!

励北网
励北网

strchr函数的介绍及用法

来源:小易整编  作者:小易  发布时间:2023-02-27 05:22
摘要:strchr函数的介绍及用法如果要写一个从字符串中查找一个字符的函数,相信你不难想到如下代码:char__cdeclstrchr_1( charconst_Str, int _Val) while(_Str&&_Str!=_...

由于这里是反汇编,是加载到内存中的,没有标号,跳转的时候指定的是跳转目标地址,这里将地址放到语句之后。

这里可以看到,反汇编代码和我们之前看到的明显不同,应该就是之前包含进来的代码了。那么,它都做了些什么呢?

在这里,我们从intel文档中查看几个命令:

pshuflw:

strchr函数的介绍及用法

movlhps:

strchr函数的介绍及用法

movdqu:

strchr函数的介绍及用法

pxor:

strchr函数的介绍及用法

pcmpeqb:

strchr函数的介绍及用法

pmovmskb:

strchr函数的介绍及用法

cmovne:

strchr函数的介绍及用法

bsf:

strchr函数的介绍及用法

第一行和第二行,是一个判断,我们看到,如果 ds:[7BEB92DCh] 处的值大于或等于1,则跳转到第 34 行(7BEA4348),为什么会有这个跳转呢?我们看看34行代码,并和之前看到的汇编代码作比较:

strchr函数的介绍及用法

我们发现,后面的代码和之前我们看到的汇编源代码一模一样。所以,这里我们可以认为是在判断是否支持SSE,至于为什么如此判断,暂时还没有调查清楚,如果有清楚的,麻烦在评论区回复下,不胜感激。

在了解到执行代码后面部分一致的情况下,我们此时就可以将重点放在前半部分了,为了方便,我们这里再次引用反汇编得到的代码前面部分,并忽略第一句,如下:

movzx       eax,byte ptr [esp+8]              ; 7BEA42E9  mov         edx,eax                           ; 7BEA42EE  shl         eax,8                             ; 7BEA42F0  or          edx,eax                           ; 7BEA42F3  movd        xmm3,edx                          ; 7BEA42F5  pshuflw     xmm3,xmm3,0                       ; 7BEA42F9  movlhps     xmm3,xmm3                         ; 7BEA42FE  mov         edx,dword ptr [esp+4]             ; 7BEA4301  mov         ecx,0Fh                           ; 7BEA4305  or          eax,0FFFFFFFFh                    ; 7BEA430A  and         ecx,edx                           ; 7BEA430D  shl         eax,cl                            ; 7BEA430F  sub         edx,ecx                           ; 7BEA4311  movdqu      xmm1,xmmword ptr [edx]            ; 7BEA4313  pxor        xmm2,xmm2                         ; 7BEA4317  pcmpeqb     xmm2,xmm1                         ; 7BEA431B  pcmpeqb     xmm1,xmm3                         ; 7BEA431F  por         xmm2,xmm1                         ; 7BEA4323  pmovmskb    ecx,xmm2                          ; 7BEA4327  and         ecx,eax                           ; 7BEA432B  jne         7BEA4337                          ; 7BEA432D  or          eax,0FFFFFFFFh                    ; 7BEA432F  add         edx,10h                           ; 7BEA4332  jmp         7BEA4313                          ; 7BEA4335  bsf         eax,ecx                           ; 7BEA4337  add         eax,edx                           ; 7BEA433A  movd        edx,xmm3                          ; 7BEA433C  xor         ecx,ecx                           ; 7BEA4340  cmp         dl,byte ptr [eax]                 ; 7BEA4342  cmovne      eax,ecx                           ; 7BEA4344  ret                                           ; 7BEA4347

1 - 4行:原理和之前类似,[esp+8] 处为要查找的目标字符值,到第四行,将edx寄存器的0-7位,和8-15位均设置为查找目标字符。

5 - 7行:将 xmm3 寄存器的每字节均设置为目标字符值,如果我们查找 'x' 字符,则 xmm3 的值为 "xxxxxxxxxxxxxxxx"。

8 - 13行:将查询的源字符串的地址进行16位对齐,并指向源字符串地址之前。并将 eax 值左移目标字符串地址的低四位值(意味着将eax作为之后取值的mask);

14 - 31 行:是查询的主要逻辑,下面我们详细讨论。

第14行,将edx指针指向内存开始的16字节复制到 xmm1寄存器中;

第15行,将xmm2寄存器所有字节设置为0;

第16行,将xmm1中所有的字节与xmm2字节做比较,比较结果放到xmm2中(如果xmm1中字节和xmm2中字节相等,则xmm2对应字节将被设置为0xff,否则将被设置为0x00);

第17行,将xmm3(每个字节值均为目标字符值)和xmm1中的字节做比较,结果放置到xmm1中,如果是第一次做比较,则xmm1中可能存有查找字符串之前的内容,而且有可能包含查找的目标字符,这种情况将在第20行进行处理;

第18行,将xmm1中(源字符串中16个字符或者字符串n个字节内容+字符串前n个字符和要查找的目标字符的比对结果,即前n个字符的擦护照结果)和xmm2中内容执行字节或运算。并将结果放到 xmm2 中。

第19行,按照xmm2中字节内容,生成一个 mask值,并将其放到 ecx 寄存器;

第20行,将ecx和eax(如果第一次,有效位被第12行设置为1,无效位被置为0)执行 and 运算;

第21行,如果20行执行结果不为0(说明找到了目标值),跳转到第25行;

第22行,eax 所有位均置为1;

第23行,将源字符串指针前移16(10h)个字节;

第24行,跳转到循环初始位置,开始新的一轮循环;

第25行,查找ecx中为1的位的编号,并将编号放置到eax;

第26行,将源字符串指针前移eax个字节,这就是目标字符所在位置了;

第27行,从xmm3(每个字节均为查找目标字符)中读取4个字节,并将值放置到edx中;

第28行,置ecx为0,以备返回(目标字符未找到);

第29行,比较dl(edx最低字节)和eax指向的字符;

第30行,如果29行比较结果不相等,说明没有找到目标字符,就置eax为0,否则eax不变;

第31行,返回;

这里可以看到,因为使用了 xmm 寄存器,我们每次都处理了16个字节,那为什么效率提升不是16倍呢?只能归结为xmm寄存器增加了电路复杂性,使得处理周期增加了一倍吧。


本文地址:百科问答频道 https://www.neebe.cn/wenda/903427_2.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!

共2页 1 2 当前是最后一页

百科问答
小编:小易整编
相关文章相关阅读
  • Excel中countif函数的使用方法

    Excel中countif函数的使用方法

    Excel中有很多函数,很多都可以为我们大大减少计算的时间,一步就得出结果,很多朋友在使用countif函数时,会出现一些错误导致不成功,我们这就来给你详细讲讲countif函数是应该如何使用的。countif函数的含义...

  • SUBTOTAL函数怎么用?

    SUBTOTAL函数怎么用?

    操作方法01隐藏行汇总方法:在目标单元格输入公式:=SUBTOTAL(109,C3:C9)。02筛选汇总。方法:在目标单元格输入公式:=SUBTOTAL...

  • 函数库是什么意思?

    函数库是什么意思?

    函数库是指由一组编写好的、结构化的可执行函数组成的库文件,其中的函数可以增加程序的通用功能以提升程序的运行效率,节省开发时间并提高软件的质量。函数库更常用于缩短编程时间、提供程序实现通用功能以及用于程序编写中特定功能的实现。函数库有帮助程...

  • 用数学画图软件——Graph绘制函数图形

    用数学画图软件——Graph绘制函数图形

    Graph是一款开源类的绘制函数图像软件。它不仅能根据函数绘制其图像,还能够绘制曲线上的切线、法线和阴影等。除了绘制功能,它还具有计算功能,其中包括曲线长度、面积等的计算。下面我来给大家介绍一下如何使用Graph绘制函数图像。操作方法...

  • Excel SLOPE函数的使用方法

    Excel SLOPE函数的使用方法

    在数学中SLOPE是斜率的意思,Excel中的SLOPE函数也是一个计算斜率的函数。请诸位和我一起学习——SLOPE函数。操作方法01SLOPE函数的功能把已知的自变量和因变量作为数据点,计算线性回...

  • Excel之MODE函数使用方法

    Excel之MODE函数使用方法

    MODE返回的数组或数据区域中出现频率最高或重复出现次数最多的值。此函数已被替换MODE.MULT函数和MODE.SNGL函数。操作方法01打开Excel,将测试使用的数据复制到表格中,如下图。...

  • 数学画图软件函数哪个好用 函数生成图像软件推荐

    数学画图软件函数哪个好用 函数生成图像软件推荐

    对于科技发达的互联网时代,很多学生是可以借用软件的方式来帮助自己快速的完成作业,接下来就简单的给大家分享下数学画图软件函数哪个好用,这次的合集里边会有几款非常经典的佳作分享给大家,通过时间的证明足以看到它们的优越性,感兴趣的话可以跟小编自己...

  • 反函数公式掌握,提高数学水平(应对复杂计算)

    反函数公式掌握,提高数学水平(应对复杂计算)

    反函数公式掌握,提高数学水平(应对复杂计算)反函数公式是高中数学中比较重要的概念之一,掌握反函数公式不仅可以提高数学水平,还可以帮助我们应对各种复杂计算。反函数公式是指将函数f(x)的自变量x和因变量y对调,得到一个新的函数g(y),称为f...

  • 周排行
  • 月排行
  • 年排行

精彩推荐