在程序集中查找子串

问题描述:

我想知道是否有更有效的方法来查找程序集中的子串,然后我正在计划做什么。在程序集中查找子串

我知道字符串指令“scansb/scasw/scads”可以将EAX中的值与EDI中的值进行比较。不过,据我所知,我只能使用这种方法搜索一个角色。因此,如果我想在字符串“pleasehelpme”中找到“帮助”的位置,我可以使用scansb找到h的偏移量,然后跳转到另一个函数,在此处我比较余数。如果余数不正确,我跳回到scansb并尝试再次搜索,这次是在上一个偏移标记之后。

但是,我讨厌这样做,然后发现有一个更有效的方法。有什么建议?在此先感谢

+0

我怀疑是否有更好的方法。你可能想在AOA中看看这个实现,但它看起来是一样的:http://maven.smith.edu/~thiebaut/ArtOfAssembly/CH15/CH15-4.html#HEADING4-3 – 2010-12-06 09:09:05

确实有更有效的方式,这两种指令明智和算法。

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

如果有长串或多个搜索模式中,Boyer-MooreKnuth-Morris-PrattRabin-Karp算法可以是更有效的。

+0

+1优秀的一点。自从我学习ASM以来,我认为它已经进步了很多。 – 2010-12-06 09:40:21

我不认为有一个更有效的方法(只能对此方法做一些优化)。 this也许是有趣的。

scansb是针对strcmp的组装变体,而不是针对strstr。如果你想要一个非常有效的方法,那么你必须使用更好的算法。

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