2010-04-15 2 views
3

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

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 

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

+0

Как ни странно похож на другой вопрос (http://stackoverflow.com/questions/2628018/using-an-array-in-embedded-x86 - сборка) - это классная работа? –

+0

Возможный дубликат http://stackoverflow.com/questions/2643341/sort-an-array-via-x86-assembly-embedded-in-c-possible –

+0

@Michael Burr: Также странно, что два вопроса, задаваемые вопросом, имеют одинаковые аватар. Тот же IP-адрес? –

ответ

2

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

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

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

0

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

3

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

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

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

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