Использование массива из ассемблерной вставки

Рейтинг: 2Ответов: 1Опубликовано: 23.05.2011

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

Пересылаю массив в функцию через

char fas3=rule2(&text2[0]);

А в функции вот такое:

__asm {
add [a], 1
mov [a], 's'
}

Почему не работает? Как сделать, чтобы работало?

Ответы

▲ 3

Не работает, потому что [a] - это адрес первой ячейки массива, который хранится где-то ещё. И операции вы совершаете с указателем, а не с массивом.

Нужно правильно сделать так:

__asm
{
    push eax       ; Сохранить состояние регистра eax
    mov eax, [b]   ; Прочитать в него адрес первого элемента массива
    mov [eax], 's' ; Записать в память по оному адресу новое значение
    pop eax        ; Восстановить состояние регистра eax
}

Ах, да, если функция целиком только из этого и состоит, то сохранять и восстанавливать состояние регистра не надо - компилятор всё сделает сам. Я подозреваю, что он это сделает в любом случае, но мало ли.