2012-02-02 2 views
2

문자열 배열에서 문자열 색인을 찾으려고합니다.C++ 인라인 어셈블리 코드에서 문자열을 사용하는 방법?

  • 포인트 ESI를
  • 포인트 EDI 우리가 배열
  • 에 대한 검색 문자열 배열의 항목 : 나는 지금 내가하고 싶은 것을 아래 그림과 같은 인 배열의 기본 주소를 알고
  • cmps 바이트 ptr ds : [esi], 바이트 ptr es : esi 및 edi의 한 번에 한 바이트를 비교합니다.

그러나 내가 찾고있는 문자열에 EDI 레지스터를 가리키는 방법을 혼동하고 있습니까?

int main(int argc, char *argv[]) 
{ 
char entry[]="apple"; 
__asm 
{ 
mov esi, entry 
mov edi, [ebx] //ebx has base address of the array 

등등.

그렇다면 내가 찾고있는 문자열에 내 esi 레지스터를 가리키는 올바른 방법은 무엇일까요?

Windows XP SP3에서 Visual Studio C++ Express Edition 2010으로 프로그래밍하고 있습니다.

답변

5

Visual C++ 컴파일러를 사용하면 변수를 어셈블리 코드에서 직접 사용할 수 있습니다. 여기에서의 예 : http://msdn.microsoft.com/en-us/library/y8b57x4b(v=vs.80).aspx

// InlineAssembler_Calling_C_Functions_in_Inline_Assembly.cpp 
// processor: x86 
#include <stdio.h> 

char format[] = "%s %s\n"; 
char hello[] = "Hello"; 
char world[] = "world"; 
int main(void) 
{ 
    __asm 
    { 
     mov eax, offset world 
     push eax 
     mov eax, offset hello 
     push eax 
     mov eax, offset format 
     push eax 
     call printf 
     //clean up the stack so that main can exit cleanly 
     //use the unused register ebx to do the cleanup 
     pop ebx 
     pop ebx 
     pop ebx 
    } 
} 

이보다 더 쉬운 IMO는 없습니다. 변수가 저장된 위치를 찾으려는 번거 로움없이 모든 속도를 얻을 수 있습니다.

관련 문제