2010-12-06 53 views
1

我想知道是否有更有效的方法來查找程序集中的子串,然後我正在計劃做什麼。在程序集中查找子串

我知道字符串指令「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

回答

4

確實有更有效的方式,這兩種指令明智和算法。

如果您有硬件,您可以使用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

0

我不認爲有一個更有效的方法(只能對此方法做一些優化)。 this也許是有趣的。

0

scansb是針對strcmp的組裝變體,而不是針對strstr。如果你想要一個非常有效的方法,那麼你必須使用更好的算法。

例如,如果你在一個很長的字符串搜索,那麼你可以嘗試一些特殊的算法:http://en.wikipedia.org/wiki/String_searching_algorithm