Используя массив во встроенной сборке x86? - PullRequest
2 голосов
/ 13 апреля 2010

У меня есть метод (C ++), который возвращает символ и принимает в качестве параметров массив символов.

Я в первый раз работаю со сборкой и просто пытаюсь вернуть первый символ массива в регистре dl. Вот что у меня есть:

char returnFirstChar(char arrayOfLetters[])
{
 char max;

 __asm
 {
  push eax
      push ebx
       push ecx
     push edx
  mov dl, 0

  mov eax, arrayOfLetters[0]
  xor edx, edx
  mov dl, al

  mov max, dl       
  pop edx
  pop ecx
  pop ebx
  pop eax

 }

 return max;
}

По какой-то причине этот метод возвращает 100

Есть идеи, что происходит? Спасибо

Ответы [ 2 ]

4 голосов
/ 13 апреля 2010

Хорошо, вот как я написал бы эту функцию:

char returnFirstChar( const char arrayOfLetters[] )
{
    char max;
    __asm
    {
         mov eax, arrayOfLetters ; Move the pointer value of arrayOfLetters into eax.
         mov dl, byte ptr [eax]  ; De-reference the pointer and move the byte into eax.
         mov max, dl             ; Move the value in dl into max.
    }
    return max;
}

Кажется, это работает отлично.

Примечания:

1) Как я уже сказал в моем комментарии, вам не нужно помещать регистры в стек, пусть MSVC справится с этим.
2) Не беспокойтесь об очисткеedx путем X'оринга против него самостоятельно или не устанавливайте dl в 0. Оба достигнут одного и того же.В общем, вам даже не нужно этого делать, поскольку вы можете просто перезаписать значение, сохраненное в dl, своим значением.

4 голосов
/ 13 апреля 2010

Линия сборки:

mov eax, arrayOfLetters[0]

перемещает указатель на массив символов в eax (заметьте, это не то, что arrayOfLetters[0] будет делать в C, но сборка не C).

Вам нужно добавить следующее сразу после этого, чтобы немного поработать над сборкой:

mov al, [eax]
...