我想知道是否有一种更有效的方法来查找程序集中的子字符串,然后我正在计划做什么。
我知道字符串指令“scansb / scasw / scads”可以将EAX中的值与EDI寻址的值进行比较。但是,据我所知,我只能使用这种方法一次搜索一个字符。
所以,如果我想在字符串“pleasehelpme”中找到“help”的位置,我可以使用scansb找到h的偏移量,然后跳转到另一个函数,我在那里比较余数。如果余数不正确,我会跳回到扫描b并再次尝试搜索,这次是在前一个偏移标记之后。
但是,我不愿意这样做,然后发现有一种更有效的方法。有什么建议?提前致谢
答案 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-Moore,Knuth-Morris-Pratt和Rabin-Karp算法可能会更有效。
答案 1 :(得分:0)
我认为没有更有效的方法(只能对此方法进行一些优化)。 this也可能是有意义的。
答案 2 :(得分:0)
scansb
是strcmp
的汇编变体,而不是strstr
。如果你想要一个非常有效的方法,那么你必须使用更好的算法。
例如,如果您搜索一个长字符串,那么您可以尝试一些特殊的算法:http://en.wikipedia.org/wiki/String_searching_algorithm