2010-12-06 8 views
1

어셈블리에서 하위 문자열을 찾은 다음 현재 수행 할 계획이 있는지보다 효율적인 방법이 있는지 궁금합니다.어셈블리에서 하위 문자열 찾기

문자열 명령 "scansb/scasw/scads"는 EAX의 값을 EDI에서 지정된 값과 비교할 수 있음을 알고 있습니다. 그러나 내가 이해하는 한,이 방법론을 사용하여 한 번에 한 캐릭터 만 검색 할 수 있습니다.

문자열 "pleasehelpme"에서 "help"의 위치를 ​​찾으려면 scansb를 사용하여 h의 오프셋을 찾은 다음 나머지를 비교하는 다른 함수로 이동하십시오. 나머지가 올바르지 않으면 scansb로 다시 돌아가서 이번에는 이전 옵셋 표시 이후에 다시 검색해보십시오.

그러나이 작업을 수행하는 것이 싫고 더 효율적인 방법이 있다는 것을 발견했습니다. 어떤 충고? 미리 감사드립니다.

+0

나는 더 좋은 방법이 있는지 의심 스럽다. 이 구현을 AOA로 보길 원할 수도 있지만, 동일하게 보입니다. http://maven.smith.edu/~thiebaut/ArtOfAssembly/CH15/CH15-4.html#HEADING4-3 –

답변

4

실제로 더 효율적인 방법이 있습니다, 모두 명령어 현명하고 알고리즘.

하드웨어가 있으면 sse 4.2 비교 함수를 사용할 수 있습니다.이 함수는 매우 빠릅니다. Boyer-Moore, Knuth-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