Изменить значение массива в сборке x86 (встроено в C ++) - PullRequest
3 голосов
/ 16 апреля 2010

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

int ascending_sort( char arrayOfLetters[], int arraySize )
 {
   char temp;

__asm
    {

   //???
      }
}

И вот что я попробовал

mov temp, 'X'
mov al, temp
mov arrayOfLetters[0], al

И это дало мне ошибку C2415: неправильный тип операнда

поэтому я попытался

mov temp, 'X'
mov al, temp
mov BYTE PTR arrayOfLetters[0], al

Это соответствовало, но не изменило массив ...

Ответы [ 3 ]

3 голосов
/ 16 апреля 2010

Если у вас есть параметр или переменная, которая является массивом, это фактически указатель на первый элемент массива. Вы должны задержать этот указатель, чтобы изменить данные, на которые он указывает. Например:

__asm
{
mov eax, arrayOfLetter
mov [eax], 0x58
}

Или, более обобщенно:

__asm
{
mov eax, arrayOfLetter
mov [eax+index], 0x58
}
2 голосов
/ 16 апреля 2010

Значение arrayOfLetters эквивалентно указателю. Итак, ваш ассемблерный код может быть:

mov temp, 'X' 
mov al, temp 
mov edx, arrayOfLetters
mov [edx], al 

В приведенном выше коде edx загружается с адресом arrayOfLetters. Затем последняя инструкция сохраняет байт al в адресе, указанном edx.

0 голосов
/ 16 апреля 2010

Этот вопрос SO касается чтения элементов массива вместо их изменения, но я подозреваю, что основное объяснение будет в основном таким же (а именно то, что arrayOfLetters должен рассматриваться как указатель):

...