2010-12-06 16 views
1

アセンブリで部分文字列を検出する方法がより効率的かどうか、現在計画していることがありますか?アセンブリ内の部分文字列の検索

文字列命令 "scansb/scasw/scads"は、EAXの値とEDIで指定された値を比較できます。しかし、わかっている限り、この方法論を使って一度に1文字しか検索することはできません。

文字列 "pleasehelpme"で "help"の位置を探したい場合は、scansbを使ってhのオフセットを見つけて、残りの部分を比較する別の関数にジャンプします。余りが正しくない場合、私はscansbに戻り、前回のオフセットマークの後の今回を再度検索します。

しかし、私はこれを行うのが嫌い、より効率的な方法があることを発見します。何かアドバイス?事前に感謝します

+0

もっと良い方法があるかどうかは疑問です。この実装をAOAで見たいかもしれませんが、それは同じようです:http://maven.smith.edu/~thiebaut/ArtOfAssembly/CH15/CH15-4.html#HEADING4-3 –

答えて

4

は、命令単位の両方のアルゴリズムと、より効率的な方法は、確かにあります。

ハードウェアがあれば、非常に高速なsse 4.2比較文字列関数を使用できます。あなたが長い部分文字列または複数の検索パターンを持っている場合は、Boyer-MooreKnuth-Morris-PrattRabin-Karpアルゴリズムは、より効率的かもしれhttp://software.intel.com/en-us/articles/xml-parsing-accelerator-with-intel-streaming-simd-extensions-4-intel-sse4/

instrinsics Cを使用して概要http://software.intel.com/sites/products/documentation/studio/composer/en-us/2009/compiler_c/intref_cls/common/intref_sse42_comp.htmと例を参照してください。

+0

+1優れた点。私はasmを学んだのでかなり進んだと思う。 –

0

より効率的な方法はありません(私はこの方法に行うことができるいくつかの最適化のみ)。また、thisが興味深いかもしれません。

0

scansbstrcmpのアセンブリバリエーションであり、strstrではありません。本当に効率的な方法が必要な場合は、より良いアルゴリズムを使用する必要があります。例えば

あなたが長い文字列で検索した場合、あなたはいくつかの特別なアルゴリズムを試みることができる:http://en.wikipedia.org/wiki/String_searching_algorithm

関連する問題