在程序集中查找子字符串

时间:2010-12-06 09:02:23

标签: algorithm string assembly x86 nasm

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

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

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

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

3 个答案:

答案 0 :(得分:4)

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

如果您有硬件,可以使用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 instrinsics http://software.intel.com/en-us/articles/xml-parsing-accelerator-with-intel-streaming-simd-extensions-4-intel-sse4/

的示例

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

答案 1 :(得分:0)

我认为没有更有效的方法(只能对此方法进行一些优化)。 this也可能是有意义的。

答案 2 :(得分:0)

scansbstrcmp的汇编变体,而不是strstr。如果你想要一个非常有效的方法,那么你必须使用更好的算法。

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