2012-02-02 2 views
2

Я пытаюсь найти индекс строки в массиве строк. Я знаю, что базовый адрес массива, теперь то, что я хочу сделать что-то, как показано ниже:Как использовать строку в C++ Inline Assembly code?

  • точки ESI для записи в массиве
  • Точка EDI в строку, мы ищем в массиве
  • cmps byte ptr ds: [esi], byte ptr es: [edi] для сравнения одного байта во время 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 на строку, которую я ищу?

Я программирую в Visual Studio C++ Express Edition 2010 на Win XP SP3.

ответ

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 
    } 
} 

Это не получить легче, чем это, ИМО. Вы получаете всю скорость, без всяких хлопот, пытаясь выяснить, где хранятся переменные.