【问题标题】:Finding substring in assembly在汇编中查找子字符串
【发布时间】:2011-05-20 20:45:37
【问题描述】:

我想知道是否有比我目前计划做的更有效的方法来在程序集中查找子字符串。

我知道字符串指令“scansb/scasw/scads”可以将 EAX 中的值与 EDI 寻址的值进行比较。但是,据我了解,使用此方法一次只能搜索一个字符。

所以,如果我想在字符串“pleasehelpme”中找到“help”的位置,我可以使用scansb 找到h 的偏移量,然后跳转到另一个比较余数的函数。如果余数不正确,我会跳回 scansb 并再次尝试搜索,这次是在上一个偏移标记之后。

但是,我不想这样做,然后发现有一种更有效的方法。有什么建议吗?提前致谢

【问题讨论】:

标签: algorithm string assembly x86 nasm


【解决方案1】:

我认为没有更有效的方法(只能对这种方法进行一些优化)。 this 也可能感兴趣。

【讨论】:

    【解决方案2】:

    scansbstrcmp 的程序集变体,而不是 strstr。如果你想要一个真正有效的方法,那么你必须使用更好的算法。

    例如,如果你搜索一个长字符串,那么你可以尝试一些特殊的算法:http://en.wikipedia.org/wiki/String_searching_algorithm

    【讨论】:

      【解决方案3】:

      确实有更有效的方法,无论是指令还是算法。

      如果你有硬件,你可以使用 sse 4.2 比较字符串函数,它非常快。查看概述 http://software.intel.com/sites/products/documentation/studio/composer/en-us/2009/compiler_c/intref_cls/common/intref_sse42_comp.htm 和使用 C 语言的示例 http://software.intel.com/en-us/articles/xml-parsing-accelerator-with-intel-streaming-simd-extensions-4-intel-sse4/

      如果您有长子字符串或多个搜索模式,Boyer-MooreKnuth-Morris-PrattRabin-Karp 算法可能更有效。

      【讨论】:

      • +1 好点。自从我学习了 asm 以来,思想进步了很多。
      猜你喜欢
      • 1970-01-01
      • 2011-07-13
      • 2021-08-13
      • 2015-10-28
      • 2017-12-04
      • 1970-01-01
      • 2012-11-10
      相关资源
      最近更新 更多